תודה רבה רבה!!!
הנה הקוד הסופי:
אני רוצה לציין שהיתי מוכרח לעשות שתי פונקציות שממירות את מיקום העכבר למעלות וכמו שאמרת, אחת עבור הקשת ואחת עבור הכדור האדום, וזאת משום שכאשר הכנסתי לפונקציה את ההתיחסות לצורת מלבן אז הכדור האדום אכן היה תמיד צמוד לעכבר אבל הקשת לא!! ולכן לקשת השארתי את הפונקציה הישנה ולכדור האדום פונקציה עם התיחסות למלבן.
אני משער שהפונקציה שמציירת את הקשת מוסיפה את ההתיחסות למלבן מעצמה ולכן זה משבש אותה.
Public Class Form1
' Create start and sweep angles on ellipse.
Dim startAngle As Single = 40.0F
Dim sweepAngle As Single = 0.0F
Dim RedEllipseAngle As Single
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
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
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 (CSng(Math.Atan2(yDiff, xDiff)) * (180 / Math.PI) + 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) * (Me.ClientSize.Height / Me.ClientSize.Width))
Dim yDiff As Single = (y1 - y2)
Return (CSng(Math.Atan2(yDiff, xDiff)) * (180 / Math.PI) + 180)
End Function
Private Function GetCoordinate(ByVal angle As Single) As Point
Dim Radian As Double = 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
Function toRadians(ByVal angle As Single) As Double
Return angle * (Math.PI / 180)
End Function
End Class
פורסם במקור בפורום CODE613 ב19/08/2013 13:42 (+03:00)