![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Line
Bobby Digital © (2004-12-10 15:57:00)Как имея две точки A(x,y) и B (x,y) связать их линией?
begin...end (2004-12-10 16:20:00) [1]> [2] Bobby Digital © (10.12.04 16:05)
> Замечательно, приведи хотя бы один пример
Один уже привели, приведу ещё один:
var
A, B: TPoint;
Canvas: TCanvas;
begin
...
Canvas.PolyLine([A, Point(A.X + 5, A.Y + 5), B])
end.
ninja (2004-12-10 16:16:00) [2]я вот как делал. может, код корявый, но я только так умею :)
параметр mas - ето указатель на дин. массив из точек, в который записываем их координаты. x0,y0 - откуда, x1, y1 - куда.
procedure DoLine(mas: PPointArray; x0, y0, x1, y1: Integer);
label Quit;
var
counter: integer;
k: Real; //коэффициент наклона прямой
begin
counter:=0;
SetLength(mas^, 10000); //с запасом на всякий случай
if (x1-x0) = 0 then begin //прямая вида х=у
while y0<>y1 do begin
if y0<y1 then inc(y0) else dec(y0);
mas^[counter].x:=x0;
mas^[counter].y:=y0;
inc(counter);
end;
goto Quit;
end;
if (y1-y0) = 0 then begin //прямая вида у=х
while x0<>x1 do begin
if x0<x1 then inc(x0) else dec(x0);
mas^[counter].x:=x0;
mas^[counter].y:=y0;
inc(counter);
end;
goto Quit;
end;
if abs(x1-x0)>=abs(y1-y0) then begin //ф-ция вида у(х)=kx
k:=(y1-y0)/(x1-x0);
while abs(x1-x0)>0 do begin
if x0<x1 then inc(x0);
if x0>x1 then dec(x0);
mas^[counter].x:=x0;
mas^[counter].y:=y1+round((x0-x1)*k);
inc(counter);
end;
goto Quit;
end;
if abs(x1-x0)<abs(y1-y0) then begin //ф-ция вида х(у)=ky
k:=(x1-x0)/(y1-y0);
while abs(y1-y0)>0 do begin
if y0<y1 then inc(y0);
if y0>y1 then dec(y0);
mas^[counter].y:=y0;
mas^[counter].x:=x1+round((y0-y1)*k);
inc(counter);
end;
end;
Quit:
SetLength(mas^, counter);
end;
Bobby Digital (2004-12-10 16:13:00) [3]
> Семен Сорокин ©
Сенкс
Семен Сорокин (2004-12-10 16:06:00) [4]
> приведи хотя бы один пример
with SomeaCanvas do begin
MoveTo(A.X, A.Y);
LineTo(B.X, B.Y);
end;
Bobby Digital (2004-12-10 16:05:00) [5]Замечательно, приведи хотя бы один пример
begin...end (2004-12-10 16:03:00) [6]> Bobby Digital © (10.12.04 15:57)
Задача имеет бесчисленное множество решений.