Алгоритм рисования направления ребра - PullRequest
3 голосов
/ 18 декабря 2011

Я занимаюсь разработкой графического приложения.В окне приложения есть вершины, соединенные ребрами.Пользователь может перемещать вершину, и когда он это делает, ребро также перемещается.У меня возникла проблема, чтобы найти шаблон для рисования стрелки, представляющей направление края в зависимости от положения обеих вершин.

Вот пример.

Допустим, у вершины есть width/height = 20px; Край нарисован из центра вершины 1центр вершины 2.

Vertex1.position = new Point(0,0);
Vertex2.position = new Point(100,0);
Edge.point1 = new Point(10,10);
Edge.point2 = new Point(110,10);
//Arrow representing direction from Vertex1 to Vertex2
Arrow.point1 = new Point(100,10);
Arrow.point2 = new Point(90,20);
Arrow.point3 = new Point(90,0);

Вопрос: Зная положение начальных / конечных точек ребер, как рассчитать точки стрелок?

Ответы [ 2 ]

3 голосов
/ 18 декабря 2011

Допустим, начальная точка ребра имеет координаты (ax, ay), конечная точка (bx, by), у вершины радиус w, у вашей стрелки длина указателя l и угол между ребрами стрелки alphaв псевдокоде:

ex := (bx - ax) 
ey := (by - ay) 
ex := ex / sqrt(ex^2 + ey^2)
ey := ey / sqrt(ex^2 + ey^2)

Первая точка стрелки:

a1x := bx - w * ex
a1y := by - w * ey

Вторая точка стрелки:

a2x := bx - (w + l) * ex + l * tg(alpha/2) * ey
a2y := by - (w + l) * ey - l * tg(alpha/2) * ex

Третья точка стрелки:

a3x := bx - (w + l) * ex - l * tg(alpha/2) * ey
a3y := by - (w + l) * ey + l * tg(alpha/2) * ex

Извините за такое плохое форматирование, я не знаю, как использовать здесь математическую разметку.И, надеюсь, я не допустил ошибок в расчетах.

0 голосов
/ 18 декабря 2011

РЕДАКТИРОВАТЬ: Вы не указали тип вашего приложения.Если вы используете WinForms , это может быть полезно. Здесь - статья MSDN о LineCap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...