![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Рисую стрелку этим кодом
Код:
procedure arrow(nachalo,konec:tpoint);
var
B, deltaX, deltaY: Extended;
begin
Image1.Canvas.PenPos := nachalo;// nachalo - координаты начала стрелки
Image1.Canvas.LineTo(konec.x, konec.y);
if nachalo.x <> konec.x then // проверка деление на ноль
begin
if (nachalo.X > konec.X) then
B := DegToRad(135) - ArcTan((nachalo.Y - konec.Y) / (nachalo.X - konec.X))
else
B := DegToRad(45) - ArcTan((nachalo.Y - konec.Y) / (nachalo.X - konec.X)); // наконечник стрелки под углом 45
deltaX := 10 * Cos(B); // длина стрелки
deltaY := 10 * Sin(B);
if (nachalo.X > konec.X) then
begin
Image1.Canvas.PenPos := Point(konec.X, konec.Y);
Image1.Canvas.LineTo(konec.X - Trunc(deltaX), konec.Y + Trunc(deltaY));
Image1.Canvas.PenPos := Point(konec.X, konec.Y);
Image1.Canvas.LineTo(konec.X + Trunc(deltaY), konec.Y + Trunc(deltaX));
end
else
begin
Image1.Canvas.moveto(konec.X, konec.Y);
Image1.Canvas.LineTo(konec.X - Trunc(deltaX), konec.Y + Trunc(deltaY));
Image1.Canvas.PenPos := Point(konec.X, konec.Y);
Image1.Canvas.LineTo(konec.X - Trunc(deltaY), konec.Y - Trunc(deltaX));
end;
end; |
|
#2
|
||||
|
||||
|
Вторая строчка в вашем коде
Код:
... Image1.Canvas.LineTo(konec.x + 20, konec.y + 20); ... З.Ы. Ну и конечно, дописать в начало Код:
dec(konec.x, 20); dec(konec.y, 20); З.Ы.З.Ы. Да, что-то это не работает правильно... З.Ы.З.Ы.P.S. Нашлось по теме только такое Последний раз редактировалось Alegun, 17.02.2014 в 08:39. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
nano_bot (17.02.2014)
| ||
|
#3
|
|||
|
|||
|
спасибо! Помогло!
|
|
#4
|
||||
|
||||
|
Да нет, проблема осталась, такое действует лишь на прямых углах, потому как положение наконечника стрелки расчитывается от центра окружности чем является поинт konec и из-за этого на других углах происходит рассогласование в расположении наконечника. Вроде надо дорисовывать продолжение прямой линии стрелки с расчётом sin/cos относительно её начала, но у меня не получилось, погрешность вычислений плюс Pi / 2 заметно смещает добавляемый отрезок от нового центра окружности. Так и не вкурил, с математикой совсем видно напряги
![]() |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
nano_bot (19.02.2014)
| ||