Начертить Арку / Дугу через три точки? - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы