Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как нарисовать стрелку. Ну типа как в WORDе?


DDS ©   (2003-09-01 17:33:00) 

Линия на КАНВЕ задана координатами начала и конца. Как доделать ее до стрелочки? Или вообще как нарисовать стрелку. Ну типа как в WORDе?


Verg   (2003-09-03 10:50:00) [1]

Ну надо, очевидно, расчитать координаты начал этих двух "крылышек" у стрелки, учитывая координаты основной прямой.
Заложиться, например, углом наклона (Deg) крыльев и их длиной(len).

Ну, например:

type
PILine = ^TILine; //Это так я линию определил
TILine = record
lS : TPoint;
lE : TPoint;
end;

function RoundPoint(P, O : TPoint; Deg : double):TPoint;
begin
// Поворот точки P вокруг точки O на угол Deg (в радианах)
Result.X:=round((P.x-O.X)*cos(Deg)-(P.Y-O.Y)*sin(Deg)+O.X);
Result.y:=round((P.Y-O.Y)*cos(Deg)+(P.x-O.X)*sin(Deg)+O.Y);
end;

procedure DrawArrow(Cnv : TCanvas; Po, P1 : TPoint; Deg : double);
var Ha : TPoint;
begin
// Нарисуем стрелку, путем "приляпывания еще двух линий", где P1 -
// точка принадлежащая главной прямой и лежащая на нужном
//расстоянии (len) от головы этой линии
Cnv.MoveTo(Po.x, Po.Y);
Ha:=RoundPoint(P1, Po, Deg);
Cnv.LineTo(Ha.X, Ha.Y);
Ha:=RoundPoint(P1, Po, -Deg);
Cnv.MoveTo(Ha.X, Ha.Y);
Cnv.LineTo(Po.X, Po.Y);
end;

procedure ArrowedLine(C : TCanvas; const L : TILine;
Deg : double;
Len : integer);
var H1 : TPoint;
R : double;
begin
// Нарисуем
with L do
begin
C.MoveTo(lS.X,lS.Y);
C.LineTo(lE.X,lE.Y);
R:=sqrt(sqr(lE.X-lS.X)+sqr(lE.Y-lS.Y));
if R>len/2 then
begin
// Расчитаем базовую точку стрелки (крылья сложены)
R:=1-Len/R;
H1:=Point(round(lS.X+(lE.X-lS.X)*R) ,
round(lS.Y+(lE.Y-lS.Y)*R));
DrawArrow(C, lE, H1, Deg);
end;
end;
end;


Домашнее задание :))

1.Проверить приведенный код.
2.Дорисуйте стрелку дугой, соединяющей концы "крыльев" и имеющей вогнутость вовнутрь стрелки.


DDS   (2003-09-03 10:26:00) [2]

Не просто же так приляпать, надо же, чтобы она правильная была


Е-Моё имя   (2003-09-02 12:01:00) [3]

приляпать еще 2 линии


Наверх

Титульная страница Поиск, карта сайта Написать письмо