Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Line   Найти похожие ветки 

 
Bobby Digital ©   (2004-12-10 15:57) [0]

Как имея две точки A(x,y) и B (x,y) связать их линией?


 
begin...end ©   (2004-12-10 16:03) [1]

> Bobby Digital ©   (10.12.04 15:57)

Задача имеет бесчисленное множество решений.


 
Bobby Digital ©   (2004-12-10 16:05) [2]

Замечательно, приведи хотя бы один пример


 
Семен Сорокин ©   (2004-12-10 16:06) [3]


> приведи хотя бы один пример

with SomeaCanvas do begin
MoveTo(A.X, A.Y);
LineTo(B.X, B.Y);
end;


 
Bobby Digital ©   (2004-12-10 16:13) [4]


> Семен Сорокин ©

Сенкс


 
ninja ©   (2004-12-10 16:16) [5]

я вот как делал. может, код корявый, но я только так умею :)
параметр 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;


 
begin...end ©   (2004-12-10 16:20) [6]

> [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.



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

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

Наверх




Память: 0.48 MB
Время: 0.033 c
1-1102974763
Kolan
2004-12-14 00:52
2004.12.26
Как измерить скорость алгоритма.Знаю что было но не нашел.


14-1102425219
Dmitriy O.
2004-12-07 16:13
2004.12.26
У кого диска разбит на несколько ?


6-1097676923
Dead Lord
2004-10-13 18:15
2004.12.26
chat


3-1101968688
speed
2004-12-02 09:24
2004.12.26
информационно-поисковая система.


11-1084444333
Stargazer
2004-05-13 14:32
2004.12.26
KOL + Ogg Vorbis