2014-11-09 5 views
0

Я унаследовал класс Control для создания пользовательского элемента управления, используемого для создания некоторых фигур, я хотел бы нарисовать треугольник внутри контрольных граней, и я рисую внутреннюю границу в треугольнике, но я испортил себе голову указатели, я не могу найти правильный расчет точек (математика не моя специальность), то вместо треугольника я получаю эту уродливую фигуру:Как нарисовать треугольник?

enter image description here

Ниже приводится соответствующая часть кода, который втягивает линии, проблема, я думаю, является четвертой. PointF

N otes

p объект - это Pen экземпляр, который я использую для рисования линий.

BorderWidth свойство сетки свойств в изображении выше, это просто поставил перед p.Width

Code

Case Figures.Triangle 
    Dim trianglePoints As PointF() = 
     { 
      New PointF(p.Width/4.0F, CSng(Me.Height) + (p.Width/2.0F)), 
      New PointF(CSng(Me.Width)/2.0F, p.Width), 
      New PointF(CSng(Me.Width) - (p.Width/4.0F), CSng(Me.Height) + (p.Width/2.0F)), 
      New PointF(-CSng(Me.Height) + p.Width, CSng(Me.Width/2) - p.Width) 
     } 

    Using gp As New Drawing2D.GraphicsPath(FillMode.Alternate) 

     gp.AddLines(trianglePoints) 
     gp.CloseFigure() 

     With e.Graphics 

      If Not Me._InnerColor = Color.Transparent Then 

       Using b As New SolidBrush(Me._InnerColor) 
        .FillPath(b, gp) 
       End Using 

      End If 

      .DrawLines(p, trianglePoints) 

     End With 

    End Using 
+1

Нарисовать треугольник обычно необходимо 3 балла. Почему у вас есть 4? –

+0

Нет, вам нужно 4 очка. Вверх -> Нижняя часть 1 -> Нижняя 2 -> Верх. Вам нужно будет всего 3 набора, если вы работаете с отдельными линиями, но если вы рисуете как путь, вам нужно 4 очка. Однако это путь заполнения. Может потребоваться только 3. – TyCobb

ответ

2

Последний элемент массива должен быть такой же, как первый (в закройте чертеж)

Dim trianglePoints As PointF() = 
    { 
     New PointF(p.Width/2.0F, CSng(Me.Height) - (p.Width/2.0F)), 
     New PointF(CSng(Me.Width)/2.0F, p.Width/2F), 
     New PointF(CSng(Me.Width) - (p.Width/2.0F), CSng(Me.Height) - (p.Width/2.0F)), 
     New PointF(p.Width/2.0F, CSng(Me.Height) - (p.Width/2.0F)) 
    } 
+0

спасибо, но не работает, как ожидалось, нижняя строка не нарисована, может быть, она нарисована НАРУЖНЫМ границам элемента управления ... Я не знаю, но не виден – ElektroStudios

+0

Если 'p' является' Pen', почему вы используете его 'Ширина' в своих расчетах? –

+0

, потому что, как вы видите на картинке выше, моя ширина пера не 1, равно 20, то это коэффициент вычисления ... все остальные строки хороши. – ElektroStudios

Смежные вопросы