Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.038 c
4-1099758380
Flex
2004-11-06 19:26
2004.12.26
Имя компьютера.


1-1103032756
mega
2004-12-14 16:59
2004.12.26
раскрытие MenuItem


8-1096140394
hgd
2004-09-25 23:26
2004.12.26
Как быстрее всего вывести на Image Bitmap?


4-1100453172
dolphin
2004-11-14 20:26
2004.12.26
список имен папок и файлов


3-1101882356
Alex-
2004-12-01 09:25
2004.12.26
Освобождение памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский