עבור לתוכן

חיתוך של שני קטעים

Featured Replies

פורסם

מה היא השיטה לחישוב של חיטוך של שני קטעים ע''י דטרמיננטה?

שמעתי שיש פתרון הרבה יותר פשוט מהפטרון הרגיל והמסובח, בעזרת וקטורים.

תודה מראש

פורסם

כן אז זה נשמע מסובך אבל זה לא

נתחיל :

יש לנו שתי פונקציות קויות

ax1+by1=c

dx2+ey2=f

((x=((c*e)-(f*b))/((a*e)-(d*b

((y=((a*f)-(d*c))/((a*e)-(d*b

וזה הכל אתה תקבל את נקודת החיטוך של שתי הפונקציות

פורסם
  • מחבר

זאת היא נוסחה לשתי קוים, ;)

האמת היא שהתכוונתי לשתי קטעים, המוגבלים עם נקודות בקצוות, לדוגמה קטעים (1,1-5,5) ו- (1,5-2,4) לא יחתכו אחד את השני (אפילו שקוים יחתכו אחד את השני)

פורסם

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

פורסם
  • מחבר

אתה יכול להביא לי בבקשה דוגמת הפונקציה המקבלת 4 קואורדינתות של שני קוים שמחזירה האם הם נחתכים או לא? (T\F)

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

פורסם

function dot (x1,y1,x2,y2,x3,y3,x4,y4):boolean;
var
m1,m2:real;
a,b,c,d,e,f:real;
x,y:real;
begin
m1:=(y1-y2)/(x1-x2);
m2:=(y3-y4)/(x3-x4);
a:=(-1)*m1;
b:=1;
c:=((-1)*m1*x1)+y1;
d:=(-1)*m2;
e:=1;
f:=((-1)*m2*x3)+y3);
x=((c*e)-(f*b))/((a*e)-(d*b))
y=((a*f)-(d*c))/((a*e)-(d*b))
dot:=true;
if (x1>x2)then
begin
if((x>x1)or(x<x2))then
dot:=false;
end;
else
begin
if((x<x1)or(x>x2))then
dot:=false;
end;
if (y1>y2)then
begin
if((y>y1)or(y<y2))then
dot:=false;
end;
else
begin
if((y<y1)or(y>y2))then
dot:=false;
end;
if (x3>x4)then
begin
if((x>x3)or(x<x4))then
dot:=false;
end;
else
begin
if((x<x3)or(x>x4))then
dot:=false;
end;
if (y3>y4)then
begin
if((y>y3)or(y<y4))then
dot:=false;
end;
else
begin
if((y<y3)or(y>y4))then
dot:=false;
end;
end;

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

אשמח לקבל הערות על שיפור הבדיקה תודה

פורסם
  • מחבר

מהשהו דומה יצאה גם לי :xyxthumbs::)

עכשיו אתה מבין למה שאלתי האם מישהו יודע לעשות זאת בעזרת דטרמיננטה? ;)

זה יכול להכליף את כל הבלגן בכמה שורות בודדות, טוב אנסה לחפש משהו באינטרנט... :s07:

פורסם

חשבתי על דרך יותר טובה

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

כלומר :שסכום הכחולים יהיה שווה לאדום

אדום:הקטע המבוקש

שחור: הנקודה שנימצאה

כחול:המרחק מתחילת הקטע

את תצתרך שאני ארשום תוכנית תבקש

[attachment deleted by admin]

פורסם
  • מחבר

הצלחתי, הינה הפונקציה העקרית :D:yelclap::xyxthumbs:


bool intersaction(int ax, int ay, int bx, int by,
int cx, int cy, int dx, int dy)
{
bx -=ax;
by -=ay;
cx -=ax;
cy -=ay;
dx -=ax;
dy -=ay;
ax = 0;
ay = 0;
if(sign(bx*cx - by*cy)==sign(bx*dx - by*dy))
return (false);
else
return (true);
}

הינה הפונקציה השניה, חשבתי שיש פונקציה מובנית בתוך הספריה המטמטית, אבל לא מצאתי. אני מתכוון לפונ' sign במחשבון

bool sign(const int num)
{
if(num>0)
return(true);
else
return(false);
}

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

הרעיון אכן היה בעזרת דטרמיננטה של 4 וקטורים, אם הינך מעוניין לשמוע את הרעיון אשמך לספר. ;)

פורסם

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

נ.ב

עשיתי ניסוי קטן וזה אכן עובד אז למה?

פורסם
  • מחבר

הקטע הוא שכאשר הסימנים של דטרמיננטות של משולשים ACB ו-ADB הם שונים (אחד שלילי והשני חיובי) אז הקוים נחתכים, אחרת (שתיהם שליליים או חיוביים) - לא. כאשר שיחקתי עם דטרמיננטות, שמתי לב לדבר אחד, כאשר השפיץ של המשולש (קודקוד C במשולש ACB) למעלה הדטרמיננטה של C ו-B היא שלילית, כאשר היא חיובית - הקודקוד למעטה. כמו כן אנו יודעים שהוקטורים (AB ו- AC ) יוצאים מנקודה (0,0), לכן אני מאפס את קואורדינטות של אחת הנקודות (במקרה שלי את A) ובהתאם משנה את שאר הנקודות (מחסיר את הערך של A)

[attachment deleted by admin]

פורסם

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

פורסם
  • מחבר

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

פורסם

טוב תודה בכל מיקרה אני אנסה לברר לבד אם תירצה אני אוכל להסביר לאחר שאברר

פורסם
  • מחבר

כמובן :xyxthumbs: תודה :hi:

ארכיון

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

דיונים חדשים