ABA


"A star"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15797 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15797
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   17:14   05.04.10   
אל הפורום  
  A star  
 
   ערכתי לאחרונה בתאריך 05.04.10 בשעה 17:28 בברכה, ronen333
 
מה קורה אנשים?
אני מקווה שזה יהיה הפוסט האחרון שלי בנושא..
מימשתי את האלגוריתם מחדש על מנת שהוא יתאים למטריצת משחק שלי{שאותה הפכתי למטריצת Nodes. כל NODE מכיל את המיקום שלו (שורה ועמודה), g,h,f, וסוג הנשק שהוא מכיל(על מנת שאני אדע אם הוא מכשול)}.

עד פה סבבה, המבנה הזה יאפשר לי יעילות BEST.


שאני מפעיל את האלגוריתם הוא נכנס ללולאה אינסופית משום מה.. רציתי שתעזרו לי בלאתר למה, ומה אני צריך להוסיף כדי לשפר וכו'...

מבני נתונים: (הוגדרו ואותחלו במחלקה עצמה)
OpenSet זה תור קדימויות (ערימה).
closeSet זה סתם רשימה.
connections זה רשימת nodes שיכיל את השכנים (כל השכנים שניתן ללכת בהם{לא מכשולים}).
HeapItem הוא struct שאוסף Object וdouble, כאשר Object יהיה האוביקט Node וdouble זה הערך עדיפות, שבאלגוריתם זה הוא f.

פעולות:

getPath מקבל Node סיום ומחזיר את מחסנית שמכילה את כל הNODES המסמלים את המסלול.

UpdatePriotity מעדכן את העדיפות של Node (העדיפות היא כמובן עפ"י f).

GetConnections מחזיר רשימה של השכנים לNODE שהם לא מכשול.

Contains בודק אם הNode מופיע ברשימה/תור קדימויות.

אממ נדמה לי שזה כמו מה שעלי להגיד על מנת שהאלגוריתם יהיה ברור, אם משהו לא ברור תשאלו אני אענה..


public Stack<Node> AstarPathSearching(Node start,Node end,Heuristic heuristic)
{

//Empty openSet and closeSet set
openSet.Clear();
closeSet.Clear();
//Initalize start Node
start.CostSoFar = 0; //g =0
start.EstimateCost = heuristic.Estimate(start);//h=Distance to end
start.TotalEstimateCost = start.CostSoFar + start.EstimateCost;//f=g+h
start.Father = null;

//Add the start node to the openset
openSet.Enqeue(new HeapItem(start, start.TotalEstimateCost));

Node currentNode;
while(openSet.IsEmpty()==false)
{
// take out node with minimum f value
currentNode = (Node)openSet.Dequeue();
//if got to goal then return the trace
if (currentNode.Row == end.Row &¤tNode.Col==end.Col)
return GetPath(end);

closeSet.Add(world[currentNode.Row, currentNode.Col]);
// this help to determine if found a "better connection" for "lowest" node.
double lowset_connection_f = double.MaxValue;

List<Node> connections = GetConnections(currentNode);
//the lowest connection by f (TotalEstimateCost)

foreach(Node connection in connections)
{
if (closeSet.Contains(connection))
continue;
// tentative_g_score is used to check if we need to update the neightbor's state.
int tentative_g_score = currentNode.CostSoFar + 1;

//The problem most likely to be here:
if (tentative_g_score > lowset_connection_f) break;
lowset_connection_f = tentative_g_score;

if(openSet.Contains(connection))
{
if(connection.CostSoFar>tentative_g_score)
{
connection.Father = currentNode;
connection.CostSoFar = tentative_g_score;
connection.EstimateCost = heuristic.Estimate(connection);
openSet.UpdatePriotity(connection, connection.TotalEstimateCost);
}

}
else // not in the open list = undiscovered cell
{
connection.Father = currentNode;
connection.CostSoFar = tentative_g_score;
connection.EstimateCost = heuristic.Estimate(connection);
openSet.Enqeue(new HeapItem(connection, connection.TotalEstimateCost));
}
}
}
}
return null;//path not found

}

תודה רבה רבה מראש לעוזרים
נ.ב-בNode עשיתי העמסת אופרטורים, ככה שסימני השוואה בעצם משווים עפ"י הערך f.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  יכול להיות שיש בעיה בגלל איך שמימשתי את הערימה ronen333  06.04.10 12:22 1
  הערה: שניגשים למאפיין TotalEstimateCost ronen333  06.04.10 13:57 2
  אוףףףף אנשים אני חייב עזרה :( ronen333  06.04.10 14:46 3
     בע שכחתי להוסיף שורה אבל זה עדיין לא עובד ronen333  06.04.10 15:38 4
         מה התכונות של ה-Node? ldan192  06.04.10 19:59 5
             רשמתי בראש ההודעה אבל אני ארשום כאן בקצרה ronen333  06.04.10 20:08 6
                 מחק את השורה ldan192  06.04.10 20:14 7
                     זה הופך את זה לאין סופי ronen333  06.04.10 20:28 8
                         תשאיר את המצב הזה אבל שלא יהיה תור קדימויות ldan192  06.04.10 20:30 9
                             אני באמת לא מבין איפה הבעיה בתור קדימויות שלי ronen333  07.04.10 12:49 10
                                 הםםם... איפה ההוצאה המינימלית? ולמה לא לממש ldan192  07.04.10 20:14 11
                                     ההוצאה המנימלית זה Dequeue ronen333  07.04.10 20:40 12
  אחרי שעות של דיבוג נראה לי שהצלחתי!!!!! :) ronen333  07.04.10 20:43 13
     שמח לשמוע שהסתדרת למרות שאני לא זמין ממש :) ldan192  07.04.10 20:46 14
         כן פרויקט סופי על מנת לקבל תעודת טכנאי הנדסת תוכנה ronen333  07.04.10 20:54 16
     ד''א המטודה שעשיתי לבדיקת ערימה עדיין מודיע שהערימה לא ronen333  07.04.10 20:52 15
         הסתדרת בסוף? ldan192  08.04.10 18:03 17
             לא לא מוצא את הבעיה.. ronen333  08.04.10 18:22 18
                 לא רואה משהו שבולט ממש לעין. בכל מקרה, הרבה יותר יעיל ldan192  08.04.10 21:57 19
                     מכתב ronen333  09.04.10 01:29 20

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   12:22   06.04.10   
אל הפורום  
  1. יכול להיות שיש בעיה בגלל איך שמימשתי את הערימה  
בתגובה להודעה מספר 0
 
   אז אשמח אם תוכלו לאמת שמימשתי טוב את המבנה נתונים:

public class BinaryHeap
{
protected HeapItem array;
protected int heapSize;

public BinaryHeap(int size)
{
heapSize = -1;
array = new HeapItem;
}

public Object RetriveMaximum()
{
return array.obj;
}
public Object ExtractMin()
{

HeapItem max = array;
array = array;
Heapify(0);

return max.obj;
}
public void RemoveMin()
{
array = array;
Heapify(0);
}
public void HeapInsert(HeapItem item)
{
heapSize++;
int i = heapSize;
while(i>=1 && array<item)
{
array = array;
i = Parent(i);
}
array = item;
}
protected void Heapify(int i)
{
int r = Right(i);
int l = Left(i);
int min;
if (l < this.heapSize && array >= array)
min = l;
else
min = i;
if (r < this.heapSize && array >= array)
min = r;
if(min!=i)
{
#region exchange A with A
HeapItem temp = array;
array = array;
array = temp;
#endregion
Heapify(min);
}
}


protected int Parent(int i)
{
return(i - 1) / 2;
}
protected int Right(int i)
{
return 2 * i + 2;
}
protected int Left(int i)
{
return 2 * i + 1;
}
}

כאמור HeapItem זה פשוט מחלקה שמכילה Object (לNODE) וdouble בשביל העדיפות שנקבעת עפ"י F.

קשה מאוד לעבור עם הדיבאגר על כל זה, אם מישהו נתקל בבעיה רעיונית שיגיד לי בבקשה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   13:57   06.04.10   
אל הפורום  
  2. הערה: שניגשים למאפיין TotalEstimateCost  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 06.04.10 בשעה 14:17 בברכה, ronen333
 
זה מחזיר את החיבור של CostSoFar ו EstimateCost


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:46   06.04.10   
אל הפורום  
  3. אוףףףף אנשים אני חייב עזרה :(  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 06.04.10 בשעה 14:52 בברכה, ronen333
 
גם שמימשתי ממש אחד על אחד עם האלגוריתם שבוויקפדיה, ולקחתי את המבנה נתונים ערימת מנימום של אלגוריתם אחר שפועל.
A STAR מחזיר לי NULL (כלומר יצא מהWHILE ולא הגיע ליעד)

public Stack<Node> AstarPathSearching(Node start,Node end,Heuristic heuristic)
{
//Empty openSet and closeSet set
openSet.Clear();
closeSet.Clear();
//Initialize start node
start.CostSoFar = 0;
start.EstimateCost = heuristic.Estimate(start);
start.Father = null;

//Add start node to openSet
openSet.Add(start, start.TotalEstimateCost);
Node currentNode;
while (openSet.IsEmpty() == false)
{
//Extract the min Node(by TotalEstimateCost) in the openSet
currentNode = (Node)openSet.Remove();

//if the currentNode is the goal than, we have the shortest path!
if (currentNode.Row == end.Row && currentNode.Col == end.Col)
return GetPath(end);
//add currentNode to closeSet
closeSet.Add(currentNode);
int tentative_g_score;
bool tentative_is_better;
foreach(Node connection in connections)
{
if (closeSet.Contains(connection))
continue;
tentative_g_score = currentNode.CostSoFar + 1;
if (openSet.Contains(connection) == false)
{
openSet.Add(connection, connection.TotalEstimateCost);
tentative_is_better = true;
}
else
{
if (tentative_g_score < connection.CostSoFar)
tentative_is_better = true;
else
tentative_is_better = false;
}

if(tentative_is_better)
{
connection.Father = currentNode;
connection.CostSoFar = tentative_g_score;
connection.EstimateCost = heuristic.Estimate(connection);
}
}
}
return null;
}


:(


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   15:38   06.04.10   
אל הפורום  
  4. בע שכחתי להוסיף שורה אבל זה עדיין לא עובד  
בתגובה להודעה מספר 3
 
   לפני הFOREACH להוסיף שזה מקבל את השכנים.

public Stack<Node> AstarPathSearching(Node start,Node end,Heuristic heuristic)
{
//Empty openSet and closeSet set
openSet.Clear();
closeSet.Clear();
//Initialize start node
start.CostSoFar = 0;
start.EstimateCost = heuristic.Estimate(start);
start.Father = null;

//Add start node to openSet
openSet.Add(start, start.TotalEstimateCost);
Node currentNode;
while (openSet.IsEmpty() == false)
{
//Extract the min Node(by TotalEstimateCost) in the openSet
currentNode = (Node)openSet.Remove();

//if the currentNode is the goal than, we have the shortest path!
if (currentNode==end)//.Row == end.Row && currentNode.Col == end.Col)
return GetPath(end);
//add currentNode to closeSet
closeSet.Add(currentNode);
int tentative_g_score;
bool tentative_is_better;
//get all adjacent of the currentNode
connections = GetConnections(currentNode);
foreach(Node connection in connections)
{
if (closeSet.Contains(connection))
continue;
tentative_g_score = currentNode.CostSoFar + 1;
if (openSet.Contains(connection) == false)
{
openSet.Add(connection, connection.TotalEstimateCost);
tentative_is_better = true;
}
else
{
if (tentative_g_score < connection.CostSoFar)
tentative_is_better = true;
else
tentative_is_better = false;
}

if(tentative_is_better)
{
connection.Father = currentNode;
connection.CostSoFar = tentative_g_score;
connection.EstimateCost = heuristic.Estimate(connection);
}
}
}
return null;
}


זה עדיין מחזיר NULL משום מה..
סורי על השיגוע :|


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:59   06.04.10   
אל הפורום  
  5. מה התכונות של ה-Node?  
בתגובה להודעה מספר 4
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:08   06.04.10   
אל הפורום  
  6. רשמתי בראש ההודעה אבל אני ארשום כאן בקצרה  
בתגובה להודעה מספר 5
 
   שלא תתאמץ :

public class Node
{
int row, col; //Position on map
int g;//cost so far
double h;//heuristic


Ammunition ammunition;
Node father;
... (כאן יש העמסות אופרטורים ומאפיינים)

הערה: שניגשים למאפיין TotalEstimateCost זה מחזיר את החיבור של CostSoFar ו EstimateCost


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:14   06.04.10   
אל הפורום  
  7. מחק את השורה  
בתגובה להודעה מספר 6
 
if (closeSet.Contains(connection))
continue;

ותראה מה זה עושה


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:28   06.04.10   
אל הפורום  
  8. זה הופך את זה לאין סופי  
בתגובה להודעה מספר 7
 
   כי אז אין בקרה בין NODE שבחנתי לNODES שלא בחנתי- ואז אין טעם בCLOSESET


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:30   06.04.10   
אל הפורום  
  9. תשאיר את המצב הזה אבל שלא יהיה תור קדימויות  
בתגובה להודעה מספר 8
 
כלומר, וקטור שדוחפים לסוף ומושכים מההתחלה.
זה יתן לך אינדיקציה אם אחת הבדיקות לא תקינות (אבל לא יתן מסלול אופטימלי).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   12:49   07.04.10   
אל הפורום  
  10. אני באמת לא מבין איפה הבעיה בתור קדימויות שלי  
בתגובה להודעה מספר 9
 
   ערכתי לאחרונה בתאריך 07.04.10 בשעה 13:33 בברכה, ronen333
 
מימשתי את זה כל כך הרבה פעמים, תוך הסתכלות בהרבה פסדוקודים ואני פשוט לא מוצא את הטעות.
עשיתי את המטודה BinaryHeapTest על מנת לבדוק אם הערימה הבינארית היא לא טובה.
והוא מודיע על טעות(זורקן אקספשן שיצרתי).


זה לא ארוך במיוחד, אשמח אם תוכל לבדוק אותו..
המטודה בדיקה נמצאת גם כן במימוש הבא:


class PriorityQueue<T> where T:IComparable
{
int size;
List<T> array;
public PriorityQueue()
{
size = 0;
array = new List<T>();
}

public void Enqueue(T item)
{
//append an item
array.Add(default(T));
//Actually put in the right cell
this.Insert(item);
}

public T Dequeue()
{
//Gets then Min
T min = this.ExtractMin();
//Remove the unused cell
array.RemoveAt(size);
return min;
}

private T ExtractMin()
{
T min = array[0];
array[0] = array[--size];
Heapify(0);
return min;
}
private void Insert(T item)
{
//int i = this.size++;
//while (i > 0 && this.array[Parent(i)].CompareTo(item) > 0)
//{
// this.array[i] = this.array[Parent(i)];
// i = Parent(i);
//}
//this.array[i] = item;

//// http://en.wikibooks.org/wiki/Data_Structures/Min_and_Max_Heaps#Inserting_a_value_into_the_heap
int i = size++;
array[i] = item;
while (i > 0)
{
if (array[Parent(i)].CompareTo(array[i]) <= 0)
break;
T temp = array[Parent(i)];
array[Parent(i)] = array[i];
array[i] = temp;
i = Parent(i);
}
}

private void Heapify(int i)
{
int right, left, min;
right = Right(i);
left = Left(i);
min = (left <= size - 1 && array[i].CompareTo(array[left]) > 0) ? left : i;
if (right <= size - 1 && array[min].CompareTo(array[right]) > 0)
min = right;
if(min!=i)
{
T temp = array[i];
array[i] = array[min];
array[min] = temp;
Heapify(min);
}
}
#region Addition mehotds
public bool Contains(T item)
{
return this.array.Contains(item);
}

public void BinaryHeapTest()
{
for (int i = size-1; i > 0; i--)
if (array[i].CompareTo(array[Parent(i)]) < 0)
throw new Exception("bad heap");

}

#endregion

#region Properties and utilty methods
public bool IsEmpty
{
get { return size == 0; }
}
public int Size
{
get { return this.size; }
}
public void Clear()
{
size = 0;
}
public int Right(int i)
{
return (2 * i + 2);
}
public int Left(int i)
{
return (2 * i + 1);
}
public int Parent(int i)
{
return (i - 1) / 2;
}
#endregion

}

תודה יא תותח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:14   07.04.10   
אל הפורום  
  11. הםםם... איפה ההוצאה המינימלית? ולמה לא לממש  
בתגובה להודעה מספר 10
 
כעץ או משהו בסגנון.
כי נראה שהוא מכניס להתחלה ומושך מהסוף, תתקן אותי אם אני טועה


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:40   07.04.10   
אל הפורום  
  12. ההוצאה המנימלית זה Dequeue  
בתגובה להודעה מספר 11
 
   ואת מה לממש כעץ? את הגרף ? את הOPENSET? לא קלטתי אותך.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:43   07.04.10   
אל הפורום  
  13. אחרי שעות של דיבוג נראה לי שהצלחתי!!!!! :)  
בתגובה להודעה מספר 0
 
   יוו אני לא מאמין אבל נראה לי שהבעיה היתה ששכחתי להחשיב בשכנים את הבסיס כלא מכשול (מיפני שהוא לא אפס). ולכן הוא תמיד התרחק לי מהיעד ואמר שאין מסלול.
אין לי מושג למה אבל אחרי שהאויב זז כמה צעדים הוא נתקע.. אבל זה כבר בעיה אחרת שאני צריך לעבוד עליה, לא נראה לי שזה בעיה במציאת מסלול לפי הבדיקות שלי.


נ.ב-עידן בסוף מימשתי את הA STAR עפ"י הקובץ PDF ששלחת לי של הטכניון .
תודה רבה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:46   07.04.10   
אל הפורום  
  14. שמח לשמוע שהסתדרת למרות שאני לא זמין ממש :)  
בתגובה להודעה מספר 13
 
אגב, זה פרוייקט סוף שנתי? כי אם כן תקבל אחלה ציון


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:54   07.04.10   
אל הפורום  
  16. כן פרויקט סופי על מנת לקבל תעודת טכנאי הנדסת תוכנה  
בתגובה להודעה מספר 14
 
   תודה רבה שוב עידן
תוכל לעזור לי לבדוק עדיין אם מימשתי את הערימה הבינארית טוב?
תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:52   07.04.10   
אל הפורום  
  15. ד''א המטודה שעשיתי לבדיקת ערימה עדיין מודיע שהערימה לא  
בתגובה להודעה מספר 13
 
   חוקית.
ככה שאני עדיין צריך עזרה בלמצוא את הטעות במימוש שלה אם יש כזאת..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:03   08.04.10   
אל הפורום  
  17. הסתדרת בסוף?  
בתגובה להודעה מספר 15
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   18:22   08.04.10   
אל הפורום  
  18. לא לא מוצא את הבעיה..  
בתגובה להודעה מספר 17
 
   אלא אם כן המטודה פשוט לא כתובה נכון (המטודה לבדיקה כאילו).
ראית משהו לא בסדר שם?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:57   08.04.10   
אל הפורום  
  19. לא רואה משהו שבולט ממש לעין. בכל מקרה, הרבה יותר יעיל  
בתגובה להודעה מספר 18
 
יהיה להשתמש בעץ בינארי (כערימת מקסימום/מינימום) ושימוש ב-sift_up/down בשביל להוציא את האיבר הגבוה או הנמוך ביותר. 

אבל בלי קשר, חבל שתסתבך בזה כרגע. תשתמש בוקטור רגיל ותוסיף לסוף, תוציא מההתחלה.
האומנם הפתרון לא יהיה אופטימלי, אבל אז הקוד לא אמור להתקע (כמו שאני מבין ממך שהוא נתקע כרגע).
ככה יהיה לך יותר קל לדאבג בשלבים.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   01:29   09.04.10   
אל הפורום  
  20. מכתב  
בתגובה להודעה מספר 19
 
   הוא לא נתקע.. זה היה סתם משהו בתזוזה שהייתי צריך לטפל.. הוא זז מצוין.
אבל האמת שיש לי בעיה בהמרת המטריצה למיקום (עם ההפך אין לי בעיה, כלומר להמיר מיקום למטריצה). אני יודע שזה נשמע מוזר אבל אז אני אראה לך למה אני מתכוון:
זה המטודה שממירה ממיקום פיסי למיקום במטריצה(והיא עובדת מצוין):

public static void ConvertPositionToMatrix(Vector2 position, out int row, out int col)
{
position -= new Vector2(Game1.BOARD_WIDTH_OFFSET, Game1.BOARD_HEIGHT_OFFSET);
row = (int)position.Y / BOARD_SQURE;
col = (int)position.X / BOARD_SQURE;
}

אני צריך עכשיו לעשות את הפעולה ההפוכה לה שלא עובדת לי טוב.
שזה להמיר את המיקום של המטריצה למיקום פיסי.
זה מה שעשיתי:

public static Vector2 ConvertMatrixToPosition(int row, int col)
{
Vector2 position = Vector2.Zero;
position.Y = row * BOARD_SQURE;
position.X = col * BOARD_SQURE;
position += new Vector2(Game1.BOARD_WIDTH_OFFSET, Game1.BOARD_HEIGHT_OFFSET);
return position;
}

שם יש בעיה ובעצם האויב לא מצויר טוב בעקבות זה (נראה כאילו הוא עולה על מכשולים). אשמח אם תעזור לי לתקן אותה או להגיד לי מה אני צריך לעשות כדי ליצור פונקצה הפוכה לConvertPositionToMatrix (כלומר לעשות פונקציה שעושה את ConvertMatrixToPosition כמו שצריך).

נ.ב-למה אמרת שעם עץ בינארי זה יותר יעיל? להיפך עם מערך זה יותר יעיל,לגשת לאב,בן שמאלי ובן ימני זה טטא של אחד.
אם עץ היה יותר יעיל לא היו מגיעים לחשוב על לייצג עץ כמערך..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net