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

Рисование стрелки   Найти похожие ветки 

 
AD_infiniTUM   (2003-12-17 15:40) [0]

Как в конце линии нарисовать стрелку, если известны координаты начала и конца линии. Может в Delphi для этого есть встроенные функции?


 
Skier ©   (2003-12-17 15:41) [1]


> Может в Delphi для этого есть встроенные функции?

Нет.


 
Семен Сорокин ©   (2003-12-17 16:00) [2]

есть:
MoveTo()
LineTo()
:)


 
Skier ©   (2003-12-17 16:01) [3]

Oops ! А ведь и правда есть ! :o)


 
Anatoly Podgoretsky ©   (2003-12-17 16:05) [4]

Ну к ним надо прилепить функцию, дорисовки пера, в зависимости от направлений, ну это уже обычная тригонометрия


 
REA ©   (2003-12-17 16:25) [5]

PolyLine([Point1, Point2, Point3])


 
MV   (2003-12-17 16:34) [6]

Надеюсь, разберешься (выдрано из рабочего кода):
------------------------------------------------
procedure TForm1.DrawLink(Link : TLink; PrjTo : TProject);
var XBase, YBase : Integer;
XDelta, YDelta : integer;
Src, Trg : TPoint; // Откуда - куда
Y1, Y2, Y3, Y4 : integer;
Alpha : Single;
Minimun : Integer;
begin
// Откуда
Src.X := Link.Affecting.Left + Link.Affecting.Width;
Src.Y := Link.Affecting.Top;
// Куда
Trg.X := PrjTo.Left;
Trg.Y := PrjTo.Top;

Y1 := Abs(Src.Y - Trg.Y);
Y2 := Abs(Src.Y - Trg.Y - PrjTo.Height);
Y3 := Abs(Src.Y + Link.Affecting.Height - Trg.Y);
Y4 := Abs(Src.Y + Link.Affecting.Height - Trg.Y - PrjTo.Height);
Minimun := Min(Y1,min(Y2,min(Y3,Y4)));

if Minimun = Y1 then begin

end else if Minimun = Y2 then begin
Trg.Y := Trg.Y + PrjTo.Height
end else if Minimun = Y3 then begin
Src.Y := Src.Y + Link.Affecting.Height
end else begin
Trg.Y := Trg.Y + PrjTo.Height;
Trg.Y := Trg.Y + PrjTo.Height
end;

XBase := Src.X - Trg.X;
YBase := Src.Y - Trg.Y;

pbMain.Canvas.Pen.Width := Link.Width;
pbMain.Canvas.Pen.Color := Link.Color;

if (XBase = 0) and (YBase = 0) then exit; // Стрелку рисовать не надо

pbMain.Canvas.MoveTo(Src.X, Src.Y);
pbMain.Canvas.LineTo(Trg.X, Trg.Y);

if YBase = 0 then // Горизонтальная стрелка
if XBase > 0 then Alpha := -3.1415926535897932385 / 2 // Вправо
else Alpha := 3.1415926535897932385 /2 // Влево
else
Alpha := ArcTan(XBase / YBase);

if YBase > 0 then Alpha := Alpha + 3.1415926535897932385 ;

XDelta := Round(10 * Sin(Alpha + 0.2));
YDelta := Round(10 * Cos(Alpha + 0.2));

pbMain.Canvas.LineTo(Trg.X - XDelta, Trg.Y - YDelta);

pbMain.Canvas.MoveTo(Trg.X, Trg.Y);

XDelta := Round(10 * Sin(Alpha - 0.2));
YDelta := Round(10 * Cos(Alpha - 0.2));

pbMain.Canvas.LineTo(Trg.X - XDelta, Trg.Y - YDelta);

end;


 
AD_infiniTUM   (2003-12-17 17:03) [7]

MV
Спасибо за стоящий ответ.

А про LineTo и MoveTo я и до этого знал, но просто знаения этого слишком мало...


 
MV   (2003-12-17 17:04) [8]

Пжалста!



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

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



Память: 0.46 MB
Время: 0.013 c
3-99447
Алексей_
2003-12-05 22:58
2003.12.30
сохранение


6-99687
Kevinkf
2003-10-30 07:48
2003.12.30
Создание NAT и подсчет трафика


3-99468
MalkoLinge
2003-12-05 10:40
2003.12.30
Определить все Constraints схемы


14-99694
oens
2003-12-10 00:34
2003.12.30
Shareware


6-99672
Melcor
2003-10-31 14:54
2003.12.30
Как отправлять пакеты по сети?




   Наверх