2016-12-27 7 views
4

TriangelC# Рисование равносторонних треугольников на сторонах другого равностороннего треугольника

Я пытался нарисовать равносторонний треугольник на сторонах большого треугольника. Первый треугольник рисуется отдельным методом, устанавливающим точки A, B и C. До сих пор я только начинал с двух сторон, я могу найти первые две точки меньших треугольников, но я не могу определить правильную формулу для третьего. Я попробовал обновить свою память о тригонометрии, но я в тупике.

 float a =0; 

     Point p = new Point(pnlDisplay.Width/2 - (pnlDisplay.Width/2) /3, 200); 
     Triangle t = new Triangle(p, pnlDisplay.Width/3, 0); 
     drawEqTriangle(e, t); 


     Point p1 = new Point(); 
     Point p2 = new Point(); 
     Point p3 = new Point(); 


     p1.X = Convert.ToInt32(A.X + t.size/3); 
     p1.Y = Convert.ToInt32(A.Y); 

     p2.X = Convert.ToInt32(A.X + (t.size - t.size/3)); 
     p2.Y = Convert.ToInt32(A.Y); 
     ////////////////////////////// 
     p3.X = Convert.ToInt32((A.X - t.size/3) * Math.Sin(a)); 
     p3.Y = Convert.ToInt32((A.Y - t.size/3) * Math.Cos(a)); 
     drawTriangle(e, p1, p2, p3); 


     p1.X = Convert.ToInt32((B.X - t.size/3 * Math.Cos(t.angle + Math.PI/3))); 
     p1.Y = Convert.ToInt32((B.Y + t.size/3 * Math.Sin(t.angle+ Math.PI/3))); 

     p2.X = Convert.ToInt32((B.X - (t.size - t.size/3) * Math.Cos(t.angle + Math.PI/3))); 
     p2.Y = Convert.ToInt32((B.Y + (t.size - t.size/3) * Math.Sin(t.angle + Math.PI/3))); 
     ////////////////////////////// 
     p3.X = Convert.ToInt32((B.X - t.size/3) * Math.Cos(a)); 
     p3.Y = Convert.ToInt32((B.Y - t.size/3) * Math.Tan(a)); 
     drawTriangle(e, p1, p2, p3); 

Это может быть вопрос для подраздела математики, но я подумал, что сначала попробую здесь. Мне нужна формула для p3.X и p3.Y

Любая помощь будет принята с благодарностью.

EDIT: изменение «a» для плавания a = Convert.ToSingle (60 * Math.PI/180);

результаты в этом: Edited

FINAL EDIT: Использование ответа MBO в: enter image description here

+0

Ваш угол равен 0, это нормально? – Piou

+1

попробуйте с 'float a = 60 * Math.PI/180;' и для точки треугольника 3 замените '-' на' + ':' p3.X = Convert.ToInt32 ((AX + t.size/3) * Math .Sin (a)); 'и' p3.Y = Convert.ToInt32 ((AY + t.size/3) * Math.Cos (a)); 'поскольку изображение {0,0} является верхней левой рукой угол холста. – Piou

+0

@Piou Спасибо, я заберу это – Protium

ответ

2

Давайте строить универсальные формулы для любой ориентации треугольника (заметим, что стоит использовать A [] массив для большой треугольник вместо явных вершин A, B, C)

p1.X = A.X * 2/3 + B.X/3; 
    p1.Y = A.Y * 2/3 + B.Y/3; 

    p2.X = A.X/3 + B.X * 2/3; 
    p2.Y = A.Y/3 + B.Y * 2/3; 

    D.X = (A.X - p1.X); 
    D.Y = (A.Y - p1.Y); 

    //note - angle sign depends on ABC orientation CW/CCW 
    p3.X = p1.X + D.X * Cos(2*Pi/3) - D.Y * Sin(2*Pi/3) 
    p3.Y = p1.Y + D.X * Sin(2*Pi/3) + D.Y * Cos(2*Pi/3) 
+0

Большое спасибо! Это решило мою проблему отлично. – Protium

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