עבור לתוכן

אלגוריתם לציור של חץ

Featured Replies

פורסם

שלום

אני רוצה לכתוב פונקציה קטנה שמציירת חץ בצורה תוכנתית,

כשהפונקציה מקבלת כקלט 2 נקודות P1 ו-P2, ואז היא תמתח קו בינן, ותוסיף עוד שני קווים עבור ראש החץ.

(ראש החץ הוא בנקודה השנייה - P2)

כך שהחץ יראה לדוגמא כך:

arrow.png

לשם הפשטות נניח שבין הקו העיקרי של החץ לבין 2 הקוים של ראש החץ, יש זוית של 30 מעלות (עם כל אחד מהם).

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

כמו כן האורך של הקווים של ראש החץ, הוא קבוע, למשל 10 פיקסלים, ולא משתנה בהתאם לאורך החץ.

איך אני עושה את זה?

תניחו שיש לנו את הפונקציה ()DrawLine שמקבלת כקלט 2 נקודות, ומציירת קו בינהן,

אז כעת בעצם נשאר לי להשתמש בה 3 פעמים, אחרי שאחשב את 2 הנקודות הנוספות עבור ראש החץ.

מהמעט שאני זוכר מחטיבת ביניים, זה בטח עם ()sin ו-()cos,

רק שאני חייב להודות שאני לא זוכר כלום..

תודה למי שכן זוכר..

פורסם
  • מחבר

הי

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

את העמוד שהבאת ב-StackOverflow אכן מצאתי בגוגל עוד לפני שפתחתי כאן את השאלה,

הבעיה שהוא לא ממש מסביר שם את החישוב, ולכן שאלתי כאן.

אודה למי שיכול לתת תשובה..

פורסם

בוא נתחיל בלפרט מה הוא מקבל בפונקציה, נשאיר את Pen, Graphics בצד.

הוא מקבל את נקודה, P, אשר היא נקודת המוצא של ראש החץ

הוא מקבל dx וdy שהם delta x וdelta y, כלומר ההפרש מנקודה X וההפרש מנקודה Y.

הוא יצר שני קבועים


const double cos = 0.866;
const double sin = 0.500;

כאשר זה בעצם אומר כי הוא מדבר על זווית של 30 מעלות.

מה שאומר שהוא רוצה שהקווים שיצאו מנקודת הסיום יהיה בסטיה של 30 מעלות.

אנחנו רוצים למצוא את 2 הנקודות הרלוונטיות לנו ב30 מעלות וב-30 מעלות

ולכן נחשב את זה על ידי הנוסחא הבאה:

[ATTACH=CONFIG]9779[/ATTACH]

עד כאן הכל ברור, אני מקווה :)

ולכן נחשב פעם אחת עבור 30 מעלות, ופעם אחת עבור -30 מעלות.

ולאחר מכן נצייר.

כמובן שלא לשכוח להוסיף את הערכים של Point P

אחרת מה שיקרה זה שראש החץ יצא לנו לא מהנקודה הרצויה

פורסם

יותר פשוט בצורה ווקטורית.

נניח p1 ו p2 הם הנקודות של ההתחלה והסוף של החץ.

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

l = (p2-p1).normalize();

עכשיו עלייך למצוא את הכיוון הנורמל לכיוון החץ n. (בגדול אתה צריך לסובב את l ב90 מעלות).

שתי הנקודות של החץ q1, q2 הם הנקודות שאתה צריך למתוח קו מP2 אליהם.

q1 = p2-l*distance+n*distance

q2 = p2-l*distance+n*distance

זה למשל ייתן לך נקודות במרחק שורש שתיים כפול distance בזווית של 45 מעלות.

בשביל לקבל את הנקודות במרחק DISTANCE מ p2 תצטרך לחלק בשורש שתיים.

בשביל לקבל זווית אחרת מ45 מעלות תצטרך לכפול את n בsin ואת l בcos (ואז גם לא תצטרך לחלק בשורש שתיים).

שים לב ש

1/sqrt(2) = sin(45 degrees) = cos(45 degrees)

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

q1 = p2-l*distance*cos(a)+n*distance*sin(a)

q2 = p2-l*distance*cos(a)-n*distance*sin(a)

פורסם
  • מחבר

תודה לשניכם

הדרך של HajB נראית לי יותר פשוטה..

העניין הוא שה-30 מעלות המדוברות, צריכות להיות ביחס לזוית של הקו הראשוני לא?

הרי אם אני אחשב פשוט עם 30 מעלות, זה יצייר לי את הקווים לפי 30 מעלות (ומינוס 30 מעלות) כזוית ביחס למישור ה-X,

ולא ביחס לקו הראשוני של החץ..

פורסם
  • מחבר

אוקיי הצלחתי לעשות את זה

זה מסביר בצורה פשוטה, למי ששכח את החומר (כמוני):

http://math.stackexchange.com/questions/143932/calculate-point-given-x-y-angle-and-distance

ועבור חישוב הזוית היחסית לקו הראשי של החץ, השתמשתי בזה:

http://math.stackexchange.com/questions/394063/find-the-angle-between-the-2-points-50-573-210-265-and-117-833-80-550

(אם לא משתמשים בחישוב שבלינק השני, אז שני הקוים של ראש החץ יוצאים ביחס לציר ה-X, ולא ביחס לקו הראשי של החץ)

תודה לכולם

ארכיון

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

דיונים חדשים