Вычислить координаты нарисованной линии - VB

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Весь инет облазил и не могу найти не одного примера вычисления координат начерченной линии. Нашёл только пример, как вычислять длину и площадь линии, но это тоже не помогает. Нужно по клику на линии выделить её другим цветом. Всем заранее спасибо за любую помощь.

Решение задачи: «Вычислить координаты нарисованной линии»

textual
Листинг программы
Private Type LineRec
    x1 As Long
    y1 As Long
    x2 As Long
    y2 As Long
    State As Boolean
End Type
 
Dim Lines() As LineRec
 
Private Sub Form_Load()
    Me.AutoRedraw = True: Me.ScaleMode = vbPixels
    ReDim Lines(2)
    Lines(0) = SetLine(50, 50, 50, 500)
    Lines(1) = SetLine(200, 600, 700, 20)
    Lines(2) = SetLine(500, 500, 23, 56)
    Redraw
End Sub
Private Sub Redraw(Optional i As Long = -1)
    Dim ct As Long, n As Long
    If i = -1 Then i = 0: ct = UBound(Lines) Else ct = i
    For n = i To ct
        Me.Line (Lines(n).x1, Lines(n).y1)-(Lines(n).x2, Lines(n).y2), -Lines(n).State * &HFF00FF
    Next
End Sub
Private Function SetLine(x1 As Single, y1 As Single, x2 As Single, y2 As Single) As LineRec
    With SetLine
    .x1 = x1: .x2 = x2
    .y1 = y1: .y2 = y2
    End With
End Function
Private Function GetLineIndex(X As Single, Y As Single) As Long
    Dim i As Long, f As Single, t As Single
    For i = 0 To UBound(Lines)
        With Lines(i)
        If .x2 = .x1 Then
            If X = .x1 And ((Y >= .y1 And Y <= .y2) Or (Y >= .y2 And Y <= .y1)) Then GetLineIndex = i: Exit Function
        Else
            f = (.y2 - .y1) * (X - 1 - .x1) / (.x2 - .x1) + .y1
            t = (.y2 - .y1) * (X + 1 - .x1) / (.x2 - .x1) + .y1
            If Abs(Y - f) < Abs(t - f) And _
               ((X >= .x1 And X <= .x2) Or (X >= .x2 And X <= .x1)) Then GetLineIndex = i: Exit Function
        End If
        End With
    Next
    GetLineIndex = -1
End Function
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim i As Long
    i = GetLineIndex(X, Y)
    If i >= 0 Then
        Lines(i).State = Not Lines(i).State
        Redraw i
        Me.Caption = i
    End If
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If GetLineIndex(X, Y) >= 0 Then Me.MousePointer = vbCrosshair Else Me.MousePointer = vbArrow
End Sub

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


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

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

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