Начертить Арку / Дугу через три точки? - VB
Формулировка задачи:
Всем привет! В Инете нашёл исходник, по трём точкам чертит круг. Подскажите пожалуйста, как переделать этот код чтобы вырисовывалось вместо Круга, Арка. Т.е. нужно высчитать координаты начала и конца арки. Нужна именно Арка, Кривая Безье не подходит.
Заранее спасибо.
Решение задачи: «Начертить Арку / Дугу через три точки?»
textual
Листинг программы
Option Explicit Private Type Vec X As Single Y As Single End Type Dim pt(2) As Vec, cur As Long Private Function GetCircle(p1 As Vec, p2 As Vec, p3 As Vec, r As Single, c As Vec) As Boolean Dim m1 As Single, m2 As Single If p2.X = p1.X Or p3.X = p2.X Then Exit Function m1 = (p2.Y - p1.Y) / (p2.X - p1.X) m2 = (p3.Y - p2.Y) / (p3.X - p2.X) If m2 = m1 Then Exit Function c.X = (m1 * m2 * (p1.Y - p3.Y) + m2 * (p1.X + p2.X) - m1 * (p2.X + p3.X)) / (2 * (m2 - m1)) c.Y = -(1 / m1) * (c.X - (p1.X + p2.X) / 2) + (p1.Y + p2.Y) / 2 m1 = p1.X - c.X: m2 = p1.Y - c.Y r = Sqr(m1 * m1 + m2 * m2) GetCircle = True End Function Private Sub Form_Load() Me.AutoRedraw = True: Me.ScaleMode = vbPixels Me.Move (Screen.Width - 8000) \ 2, (Screen.Height - 8000) \ 2, 8000, 8000 Me.BackColor = vbWhite: Me.ForeColor = vbBlack End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If cur = 0 Then Me.Cls Me.Line (X - 2, Y - 2)-(X + 2, Y + 2), vbRed, B: Print cur + 1 pt(cur).X = X: pt(cur).Y = Y cur = cur + 1 If cur > 2 Then cur = 0 End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If cur = 2 Then pt(2).X = X: pt(2).Y = Y: Draw End Sub Private Sub Draw() Dim a As Single, b As Single, _ s As Single, e As Single, _ q As Single, c As Vec, r As Single If Not GetCircle(pt(0), pt(1), pt(2), r, c) Then Exit Sub a = -(pt(0).Y - c.Y) * r: b = (pt(0).X - c.X) * r: s = Atan2(a, b) a = -(pt(1).Y - c.Y) * r: b = (pt(1).X - c.X) * r: e = Atan2(a, b) a = -(pt(2).Y - c.Y) * r: b = (pt(2).X - c.X) * r: q = Atan2(a, b) If e < 0 Then e = 6.28318530717959 + e If s < 0 Then s = 6.28318530717959 + s If q < 0 Then q = 6.28318530717959 + q If s > e Then a = s: s = e: e = a If q < s Or q > e Then a = s: s = e: e = a Debug.Print s, e, q Me.Cls Circle (c.X, c.Y), r, , s, e Me.Line (pt(0).X - 2, pt(0).Y - 2)-(pt(0).X + 2, pt(0).Y + 2), vbRed, B: Print 1 Me.Line (pt(1).X - 2, pt(1).Y - 2)-(pt(1).X + 2, pt(1).Y + 2), vbRed, B: Print 2 Me.Line (pt(2).X - 2, pt(2).Y - 2)-(pt(2).X + 2, pt(2).Y + 2), vbRed, B Me.Refresh End Sub Private Function Atan2(ByVal Y As Double, ByVal X As Double) As Double 'ÂîçâðГ*Г№Г*ГҐГІ óãîë, ГІГ*Г*ГЈГҐГ*Г± êîòîðîãî Г°Г*ГўГҐГ* îòГ*îøåГ*ГЁГѕ äâóõ ГіГЄГ*Г§Г*Г*Г*ûõ Г·ГЁГ±ГҐГ« If Y > 0 Then If X >= Y Then Atan2 = Atn(Y / X) ElseIf X <= -Y Then Atan2 = Atn(Y / X) + 3.14159265358979 Else Atan2 = 3.14159265358979 / 2 - Atn(X / Y) End If Else If X >= -Y Then Atan2 = Atn(Y / X) ElseIf X <= Y Then Atan2 = Atn(Y / X) - 3.14159265358979 Else Atan2 = -Atn(X / Y) - 3.14159265358979 / 2 End If End If End Function
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д