Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
ВнизРисование стрелки Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c