Рисование линии пера с указанным размером (длиной) - PullRequest
0 голосов
/ 16 декабря 2011

Кажется, у меня большие трудности при создании функции рисования линии, когда пользователь нажимает кнопку, чтобы создать линию, затем выбирает точку на форме и вводит длину в текстовое поле, которое также станет длинойлиния, сама себя.

Может ли кто-нибудь помочь с этим?

1 Ответ

1 голос
/ 16 декабря 2011

Вы также должны учитывать направление линии.Вот код, который поможет вам начать.Вы указываете начальную точку, длину линии и угол в градусах, причем нулевые градусы направлены к положительной оси x.Метод возвращает координаты x, y конечной точки линии:

Sub Main()

    Dim start As New PointF(0, 0)
    Dim length As Double = 10
    Dim degrees As Double = 45

    Dim endPoint As PointF = getEndPoint(start, length, degrees)

    Console.WriteLine("Start point: {0}", start)
    Console.WriteLine("Length: {0}", length)
    Console.WriteLine("Angle: {0}", degrees)
    Console.WriteLine("End point: {0}", endPoint)


    Console.WriteLine("Press ENTER to exit...")
    Console.ReadLine()
End Sub

Private Function getEndPoint(ByVal startPoint As PointF, ByVal length As Double, ByVal angleInDegrees As Double) As PointF
    Dim x As Double = startPoint.X + length * Math.Cos(degreesToRadians(angleInDegrees))
    Dim y As Double = startPoint.Y + length * Math.Sin(degreesToRadians(angleInDegrees))

    Return New PointF(CType(x, Single), CType(y, Single))
End Function

Private Function degreesToRadians(ByVal degrees As Double) As Double
    Return (Math.PI / 180.0) * degrees
End Function

Этот код предполагает стандартную декартову плоскость.Так как источник формы Windows находится в верхнем левом углу формы, а положительная ось Y идет вниз по форме, вам придется настроить этот код, чтобы он работал правильно, если вы собираетесь использовать его для рисования линий в форме.

В форме Windows угол увеличивается по часовой стрелке, поэтому вот обновленная версия метода getEndPoint, который настраивается для этого (не полностью протестирован):

Private Function getEndPoint(ByVal startPoint As PointF, ByVal length As Double, ByVal angleInDegrees As Double) As PointF
    Dim x As Double = startPoint.X + length * Math.Cos(degreesToRadians(360.0 - angleInDegrees))
    Dim y As Double = startPoint.Y + length * Math.Sin(degreesToRadians(360.0 - angleInDegrees))
...