Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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)

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо