Нарисуйте стрелку в средней точке ссылок так, чтобы стрелка располагалась в соответствии с начальным узлом и конечным узлом - PullRequest
0 голосов
/ 02 октября 2019

Я хочу нарисовать стрелку в средней точке ссылки (это труба с начальным и конечным узлами). В нем будет течь. я написал код vb для решения этой задачи, но я застрял в точке, где головка стрелки меняет свое направление при изменении квадранта. На самом деле я хочу нарисовать стрелку вперед, если пользователь начинает с Start_Node и заканчивается на End_Node и аналогично стрелку назад, если пользователь начинает с End_Node и заканчивается в Start_Node. если есть рисунок ctrl с: + X в правой части и + Y в нижней части.

    Private Sub DrawArrowInPipes(ctrl As MapControl, g As Graphics)
    Dim arrowpen As New Pen(Brushes.Yellow, 3)
    Dim rotationangle As Double = GetInclination '
    'If rotationangle < 0 Then rotationangle = 360 - rotationangle
    '   rotationangle = 360 - GetInclination
    Dim midp As PointF = ctrl.ToScreenCoordinates(MidPoint)
    Dim arrowvector As Vector2D = New Vector2D(15, 0)
    If flow < 0 Then rotationangle += 180

    Dim side1 As Double = 180 + 45
    Dim side2 As Double = 180 - 45

    Dim p1 As PointF = midp + arrowvector.Rotate(side1)
    Dim p2 As PointF = midp + arrowvector.Rotate(side2)

    ' If flow <> 0 Then g.DrawLines(arrowpen, New PointF() {p1, midp, p2})
    g.DrawLines(arrowpen, New PointF() {p1, midp, p2})
End Sub

   <Browsable(False)>
Public ReadOnly Property GetInclination() As Double
    Get
        Dim V1 As Vector2D = EndNode.DrawnPosition - StartNode.DrawnPosition
        Return Math.Atan2(V1.Y, V1.X) * 180 / Math.PI
    End Get
End Property

Требуется помощь.

Решено с помощью:

 Private Sub DrawArrowInPipes(ctrl As SwMapControl, g As Graphics)
    Dim arrowpen As New Pen(Color.FromArgb(167, 25, 48), 2)
    Dim rotationangle As Double = 360 - GetInclination
    Dim midp As PointF = ctrl.ToScreenCoordinates(MidPoint)
    Dim arrowvector As Vector2D = New Vector2D(10, 0)

    If flow < 0 Then rotationangle += 180

    Dim p1 As PointF = midp + arrowvector.Rotate(rotationangle + 45 + 180)
    Dim p2 As PointF = midp + arrowvector.Rotate(rotationangle - 45 + 180)

    g.DrawLines(arrowpen, New PointF() {p1, midp, p2})
End Sub
...