Главная страница
    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.028 c
14-1102073326
Alex*
2004-12-03 14:28
2004.12.26
Аналог утилты "Быстрый просмотр" в Win 2000 и XP


1-1103013863
R
2004-12-14 11:44
2004.12.26
Округление до целого


14-1102335018
Санёк
2004-12-06 15:10
2004.12.26
Помогите с информатикой


1-1102668128
Usat|k
2004-12-10 11:42
2004.12.26
Форма на все окно


1-1102957836
Павел
2004-12-13 20:10
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский