Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.05;
Скачать: 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 вся ветка

Текущий архив: 2004.01.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.031 c
14-12054
Undert
2003-12-10 12:22
2004.01.05
ColorAllocate


3-11809
iWorm
2003-12-09 02:32
2004.01.05
Вставка новой записи


7-12173
Dima_dvp
2003-10-23 03:38
2004.01.05
Global HOOK без DLL.. Это как? Или вообще ни хук?


3-11794
Goida
2003-11-20 22:24
2004.01.05
Проблема с вызовом хранимых процедур


14-12144
csr
2003-12-12 17:50
2004.01.05
Про посылку почты!