Вниз
Скачать: CL | DM;

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

← →
DDS   (2003-09-01 17:33) [0]

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


← →
Е-Моё имя ©   (2003-09-02 12:01) [1]

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


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

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


← →
Verg ©   (2003-09-03 10:50) [3]

Ну надо, очевидно, расчитать координаты начал этих двух "крылышек" у стрелки, учитывая координаты основной прямой.
Заложиться, например, углом наклона (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.Дорисуйте стрелку дугой, соединяющей концы "крыльев" и имеющей вогнутость вовнутрь стрелки.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.015 c
1-11975
DmS
2003-12-19 14:01
2004.01.05
скомпилировать EXE вместе с ВPL


11-11844
titnn
2003-04-15 22:59
2004.01.05
Почему DLL сделанная в KOL не работает ?


3-11803
Dmitriy O.
2003-12-09 09:47
2004.01.05
Почему не работает dbExpress ?


3-11790
Dimaz-z
2003-12-08 21:57
2004.01.05
Проблема с кодировкой в ClientDataSet.


6-12010
kevinkf
2003-11-05 16:01
2004.01.05
Снифер - учет трафика




   Наверх