מציאת נקודה על פי מעלות זוית
-
הנה הקוד שעשיתי: [פתחו פרוייקט חדש ופשוט הדביקו שם והריצו.]
Public Class Form1 ' Create start and sweep angles on ellipse. Dim startAngle As Single = 0.0F Dim sweepAngle As Single = 270.0F Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove 'שינוי תחילת הקשת 'startAngle = GetAngle(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) + 180 'שינוי אורך הקשת sweepAngle = GetAngle(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) + 180 Me.Invalidate() End Sub Function GetAngle(ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single) As Single Dim xDiff As Single = (x1 - x2) Dim yDiff As Single = (y1 - y2) Return (CType(Math.Atan2(yDiff, xDiff), Single) * CType((180 / Math.PI), Single)) End Function Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint ' Create pen. Dim blackPen As New Pen(Color.Black, 3) ' Create rectangle to bound ellipse. Dim rect As New Rectangle(0, 0, Me.ClientSize.Width, Me.ClientSize.Height) ' Draw arc to screen. e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle) End Sub End Class
אם תרחפו עם העכבר מעל החלון תראו איך שהקשת גודלת וקטנה בהתאם למיקום הסמן, השאלה שלי איך אני יכול לדעת מה הנקודה שבה הקשת מסתיימת? אני רוצה למשל לשים בסוף הקשת איזו אליפסה או פקד כל שהוא.
תודה לכולם.פורסם במקור בפורום CODE613 ב14/08/2013 23:01 (+03:00)
-
רפרפתי על השאלה ולכאורה השאלה היא מתמטית,
אז כדאי לך שלא לצמצם את קשת העונים הפוטנציאלים לכאלו שיש להם ויזואל סטודיו + זמן + ידע בVB.NET.
תנסח גיאומטרית, ואז הרבה יוכלו לענות בין רגע.
כמו"כ תרפרף על פונקציות גיאומטריות באקסל, אולי תמצא שם פונקציה שזה בדיוק פעולתה.פורסם במקור בפורום CODE613 ב15/08/2013 12:09 (+03:00)
-
העינין הוא שכמו שרואים בדוגמא שצירפתי יש לי מידע כמה מעלות יש בין נקודת האמצע של החלון למיקום הסמן ועל פי זה אני קורא לפונקציה e.Graphics.DrawArc ופונקציה זו באמת יודעת לצייר את הקשת עד המעלה המבוקשת כלומר עד לסמן, אבל אני צריך לדעת מה הנקודה הזו בשפת הקואורדינטות כלומר מה הX וה Y של נקודה זו, כך שמבחינה מתמטית יש לי את הפונקציה אני רק צריך להמיר מידע זה לקואורדינטות.
בכל אופן איפה ממולץ לשאול שאלות כאלו?
פורסם במקור בפורום CODE613 ב15/08/2013 13:01 (+03:00)
-
זה עדיין שאלה גיאומטרית נטו לכאורה.
ואני עדיין מתעצל לפתוח את הVSיש לך ריבוע, יש לו מרכז, יש לך מיקום נקודה X,Y, (מקום הסמן) ואתה רוצה לדעת _______.
(לא הבנתי את צורת הציור מהמרכז לסמן).ואגב זה בדיוק המקום לדעתי לשאול כאלו שאלות, המשך להחכימנו!
פורסם במקור בפורום CODE613 ב15/08/2013 13:15 (+03:00)
-
העיגול כידוע הוא בסך הכל 360 מעלות, מעלת האפס לפי מה שהבנתי עומדת בצד ימין באמצע הגובה בדיוק איפה שמספר 3 בשעון למשל מספר 6 בשעון עומד במעלה 90 ומספר 9 במעלה 180 ומספר 12 במעלה 270.
כשאני רוצה שקשת תתחיל במספר 9 בשעון עד מספר 12 אני קורא ל:
e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle)ואז startAngle יהיה 180 ואורך הקשת שזה sweepAngle יהיה 90 מעלות וכך נגיע מ180 ל270 .
הפונקציה שבתוך הקוד GetAngle מחזירה כמה מעלות יש בין מיקום הסמן למרכז החלון ואז רואים שבאמת הקשת מצטיירת עד מקום הסמן, השאלה היא מה ה X והY של אותה נקודה שבה מסתיימת הקשת.
כדי להבין את זה יותר באמת מומלץ להריץ את הקוד.
פורסם במקור בפורום CODE613 ב15/08/2013 13:32 (+03:00)
-
אתה צריך להשתמש ב sin ו בcos כדי למצוא את המיקום
בניתי משהו קטן שמדגים ב js
http://jsfiddle.net/APYpD/1/sin מוצא לך את היחס בגובה כלומר מעלה 0 זה 0 מעלה 90 זה 1
cos מוצא לך את היחס ברוחב כלומר 0 יהיה 1 90 יהיה 0 ו180 יהיה -1
היחס הוא כלפי הנקודה המרכזית.
היחס הוא לפי הרדיוס כלומר 1 רדיוס אם הרדיוס הוא 15 אז 1 * 15
פורסם במקור בפורום CODE613 ב15/08/2013 14:36 (+03:00)
-
הוספתי על פי הקוד שלך לקוד שלי, אבל עדיין אני רואה שזה לא מאה אחוז:
אולי תוסיף לקוד שלך ארוע תנועת סמן במקום להשתמש ב input numberPublic Class Form1 ' Create start and sweep angles on ellipse. Dim startAngle As Single = 0.0F Dim sweepAngle As Single = 270.0F Dim RedEllipseAngle As Single Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove 'שינוי תחילת הקשת 'startAngle = GetAngle(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) 'שינוי אורך הקשת sweepAngle = GetAngle(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) - startAngle RedEllipseAngle = GetAngle2(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) Me.Invalidate() End Sub Function GetAngle(ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single) As Single Dim xDiff As Single = (x1 - x2) Dim yDiff As Single = (y1 - y2) Return (CType(Math.Atan2(yDiff, xDiff), Single) * CType((180 / Math.PI), Single) + 180) End Function Function GetAngle2(ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single) As Single Dim xDiff As Single = (x1 - x2) Dim yDiff As Single = (y1 - y2) Return (CType(Math.Atan2(yDiff, xDiff), Single) + 66) End Function Private Function GetCoordinate(ByVal angle As Single) As Point Dim x As Single = (Me.ClientSize.Width \ 2) + (Math.Cos(angle) * (Me.ClientSize.Width \ 2)) Dim y As Single = (Me.ClientSize.Height \ 2) + (Math.Sin(angle) * (Me.ClientSize.Height \ 2)) Return New Point(x, y) End Function Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint ' Create pen. Dim blackPen As New Pen(Color.Black, 3) ' Create rectangle to bound ellipse. Dim rect As New Rectangle(0, 0, Me.ClientSize.Width, Me.ClientSize.Height) ' Draw arc to screen. e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle) e.Graphics.FillEllipse(Brushes.Red, New Rectangle(GetCoordinate(RedEllipseAngle), New Size(12, 12))) End Sub End Class
פורסם במקור בפורום CODE613 ב15/08/2013 15:08 (+03:00)
-
-
הוספתי על פי הקוד שלך לקוד שלי, אבל עדיין אני רואה שזה לא מאה אחוז:
אולי תוסיף לקוד שלך ארוע תנועת סמן במקום להשתמש ב input numberתנסה ככה
RedEllipseAngle = startAngle + GetAngle2(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y)
פורסם במקור בפורום CODE613 ב15/08/2013 15:14 (+03:00)
-
הנה שיפצתי את הקוד, כעת הוא עובד מצויין אבל רק אם החלון מרובע אבל אם החלון מלבני הנקודה האדומה מתנהגת בצורה מוזרה במעלות 0, 90, 180 ו 270 נפגשת עם הקשת ובמעלות אחרות לא. מדוע?
Public Class Form1 ' Create start and sweep angles on ellipse. Dim startAngle As Single = 0.0F Dim sweepAngle As Single = 0.0F Function toRadians(ByVal angle As Single) As Single Return CSng(angle * (Math.PI / 180)) End Function Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove 'שינוי תחילת הקשת על פי הסמן 'startAngle = GetAngle(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) 'שינוי אורך הקשת על פי הסמן sweepAngle = GetAngle(Me.ClientSize.Width \ 2, Me.ClientSize.Height \ 2, e.Location.X, e.Location.Y) - startAngle Me.Invalidate() End Sub Function GetAngle(ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single) As Single Dim xDiff As Single = (x1 - x2) Dim yDiff As Single = (y1 - y2) Return (CSng(Math.Atan2(yDiff, xDiff)) * CSng(180 / Math.PI) + 180) End Function Private Function GetCoordinate(ByVal angle As Single) As Point Dim Radian As Single = toRadians(angle) Dim x As Single = (Me.ClientSize.Width \ 2) + CSng(Math.Cos(Radian) * (Me.ClientSize.Width \ 2)) Dim y As Single = (Me.ClientSize.Height \ 2) + CSng(Math.Sin(Radian) * (Me.ClientSize.Height \ 2)) Return New Point(x - 6, y - 6) End Function Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint ' Create pen. Dim blackPen As New Pen(Color.Black, 3) ' Create rectangle to bound ellipse. Dim rect As New Rectangle(0, 0, Me.ClientSize.Width, Me.ClientSize.Height) ' Draw arc to screen. e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle) e.Graphics.FillEllipse(Brushes.Red, New Rectangle(GetCoordinate(startAngle + sweepAngle), New Size(12, 12))) End Sub Public Sub New() ' This call is required by the designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. Me.Height = Me.Width * 2 End Sub End Class
פורסם במקור בפורום CODE613 ב15/08/2013 19:03 (+03:00)
-
כל הנוסחה מתבססת על תכונות מרובע ועיגול, לא מלבן ואליפסה.
במקרה של מלבן ואליפסה תתייחס כאילו זה מרובע כאשר הצלע/קוטר שוה לצלע הקטן שבמלבן, ואת תוצאת הXY תמיר למלבן לפי היחס.
לדוגמא מלבן בגודל 20:10, אתה מתייחס כאילו הוא 10:10 וכאשר מתקבלת לך תוצאת XY כזאת: 5,7 אתה מכפיל את ה5 ביחס בין הצלעות (הקטן לחלק לגדול) במקרה זה 2.פורסם במקור בפורום CODE613 ב18/08/2013 11:14 (+03:00)
-
שיפצתי לפי דבריך את הפקודה GetCoordinate
וזה מה שיצא, אבל זה לא עובד.Private Function GetCoordinate(ByVal angle As Single) As Point Dim Radian As Single = toRadians(angle) Dim Dis As Integer Dim WidthIsLarge As Boolean If Me.ClientSize.Width > Me.ClientSize.Height Then Dis = Me.ClientSize.Height / 2 WidthIsLarge = True Else Dis = Me.ClientSize.Width / 2 WidthIsLarge = False End If Dim x As Single = (Me.ClientSize.Width / 2) + CSng(Math.Cos(Radian) * Dis) Dim y As Single = (Me.ClientSize.Height / 2) + CSng(Math.Sin(Radian) * Dis) If WidthIsLarge = True Then x = x * (Me.ClientSize.Height / Me.ClientSize.Width) Else y = y * (Me.ClientSize.Width / Me.ClientSize.Height) End If Return New Point(x - 6, y - 6) End Function
פורסם במקור בפורום CODE613 ב18/08/2013 13:14 (+03:00)
-
@דוד ל.ט.
כל הנוסחה מתבססת על תכונות מרובע ועיגול, לא מלבן ואליפסה.
במקרה של מלבן ואליפסה תתייחס כאילו זה מרובע כאשר הצלע/קוטר שוה לצלע הקטן שבמלבן, ואת תוצאת הXY תמיר למלבן לפי היחס.
לדוגמא מלבן בגודל 20:10, אתה מתייחס כאילו הוא 10:10 וכאשר מתקבלת לך תוצאת XY כזאת: 5,7 אתה מכפיל את ה5 ביחס בין הצלעות (הקטן לחלק לגדול) במקרה זה 2.זה בדיוק מה שהוא כתב.
התוצאה זה יחס והוא מכפיל את היחס באורך וברוחב.
כלומר אם זה 5,7 אז התוצאה ב cos וב sin זה 0.2 , 0 ואז ההמרה תהיה
0.2 * 5 + 5 = 7
0 * 10 * 10 = 10 .וזה יוצא בדיוק אותו חשבון.
כלומר החשבון הראשון הוא בסדר גמור.
מה אני רואה בתמונה שהעיגול ממשיך את המגמה של הקו כלומר הוא לא סוטה מהמגמה.
זה נראה שיש לו נתון אחר של מעלות.
פורסם במקור בפורום CODE613 ב18/08/2013 14:58 (+03:00)