עבור לתוכן

עזרה ב-Java - מציאת נק' חפיפה בין 2 מקטעים

Featured Replies

פורסם

יש לי 2 מקטעים, כל מקטע מורכב מ-2 נק' (אחת שמאלית ואחת ימנית) ולכל נק' יש כמובן קורדינטת X וקורדינטת Y ובין ביתר מתודה של getX ו-setY

מה שאני צריך זה למצוא את נק' חפיפה (אם יש כמובן) בין 2 המקטעים רק עפ"י קורדינת ה-X

אשמח לעזרה.

פורסם
  • מחבר

סליחה טעות שלי, הכוונה הייתה למצוא את החפיפה בין 2 המקטעים

פורסם
  • מחבר

מישהו ?

פורסם

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

אם הם כן על אותו ישר, אז צריך למצוא את טווח ה-x-ים וה-y-ים שמשותף להם.

פורסם
  • מחבר

מה ששכחתי לציין זה שהמקטעים תמיד מקבילים לציר ה-X

פורסם

אז זה אפילו יותר קל. אם לשניהם אין אותה קואורדינטת Y - אז הם מקבילים, ולכן אין חיתוך. אחרת, אתה צריך לבדוק אם יש חפיפה בתחומי ה-X-ים.

פורסם
  • מחבר

לא ממש הבנתי איך בדיוק למצוא את החפיפה

פורסם

תשווה בין הנקודה השמאלית של קטע אחד והנקודה הימנית של קטע אחר, ותחשוב מה כל תוצאה אפשרית אומרת.

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

פורסם
  • מחבר

תודה

פורסם
  • מחבר

רשמתי משהו אבל הוא עובד באופן חלקי, אשמח לעזרה:


public double overlap (Segment1 other)
{
if (_poRight.getX() < other._poLeft.getX()) //all the reference segment in the right side
{
if (other._poLeft.isRight(_poRight))
{
return 0;
}
}
else if (other._poLeft.getX() <= _poLeft.getX() && other._poRight.getX() >= _poRight.getX())
{
return _poRight.getX() - _poLeft.getX();
}


else if (_poLeft.getX() <= other._poLeft.getX() && _poRight.getX() >= other._poRight.getX())
{
return other._poRight.getX() - other._poLeft.getX();
}


else if (_poLeft.getX() <= other._poLeft.getX() && _poRight.getX() <= other._poRight.getX())
{
return _poRight.getX() - other._poLeft.getX();
}

else if (_poLeft.getX() >= other._poLeft.getX() && _poRight.getX() >= other._poRight.getX())
{
return other._poRight.getX() - _poLeft.getX();
}

return 0;
}

פורסם

יש דרך יותר פשוטה :)

הקצה השמאלי של החיתוך הוא המקסימום של הקצוות השמאליים של שני הקטעים.

הקצה הימני הוא המינימום של הקצוות הימניים.

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

פורסם
  • מחבר

אפשר בבקשה לראות את הקוד של מה שאתה מתכוון ?

לא ממש הולך לי בשיטה הזו

פורסם

public double overlap (Segment1 other)
{
double left = Math.max(_poLeft.getX(), other._poLeft.getX());
double right = Math.min(_poRight.getX(), other._poRight.getX());

if (right > left)
{
return right-left;
}
else
{
return 0;
}
}

את ה-if האחרון אפשר גם להחליף בזה:

return Math.max(right-left, 0);

פורסם
  • מחבר

תודה רבה רבה

אגב מה ז"א אומרת אפשר להחליף את ה-if האחרון ? יש רק אחד

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים