Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2009, 19:57   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Алгоритм построения линии по координатам.

{ *** Вступление *** }
Просмотрел все разделы форума, но не нашел подходящего - если не там, прошу извинить.
{ *** Тема *** }
Пытаюсь получить алгоритм построения линии из точки А в точку Б. Т.е. у меня есть координаты (X1,X2,Y1,Y2), ну например:
Код:
1,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,1
Моя задача - провести линию из первой точки во вторую.
{ *** Вопрос *** }
Не натолкнет кто-нибудь на мысль?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.11.2009, 20:02   #2
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Берем разности между соответствующими координатами.
Делим их.
В цикле пока не достигнем точки прибавляем к каждой координате коэф. прироста.
//-----------------
Берем разность.
Находим радиус, находим угол, это если представить одну из точек центром окружности. А дальше x:=x0+cos(angle)*r; y:=y0+sin(angle)*r, где r постоянно увеличиваем, пока не будем как радиус.

Последний раз редактировалось Levsha100; 15.11.2009 в 20:04.
Levsha100 вне форума Ответить с цитированием
Старый 15.11.2009, 20:04   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

вот недавно читал ,может это, то что нужно?

http://ru.wikipedia.org/wiki/Алгоритм_Брезенхема
counter вне форума Ответить с цитированием
Старый 15.11.2009, 20:08   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Спасибо за наВодку. Голова сегодня не варит вообще.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.11.2009, 21:06   #5
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Когда-то делал, даже с антиалиасингом.

Модуль с процедурой черчения линии:
Код:
unit WuGraph;

interface

uses
  Windows, Graphics;

//-------------------------------------------------------------------------  

procedure WuLineTo(Canvas: TCanvas; X,Y: Integer);
procedure WuLine(Canvas: TCanvas; X1,Y1,X2,Y2: Integer);

//-------------------------------------------------------------------------

implementation

//-------------------------------------------------------------------------

function ColorGradient(C1,C2: TColor; K: Double): Integer;
var
  R,G,B: Byte;
begin
  C1:=ColorToRGB(C1); C2:=ColorToRGB(C2);
  R:=round(GetRValue(C1)*(1-K)+GetRValue(C2)*K);
  G:=round(GetGValue(C1)*(1-K)+GetGValue(C2)*K);
  B:=round(GetBValue(C1)*(1-K)+GetBValue(C2)*K);
  result:=RGB(R,G,B);
end; //ColorGradient

//-------------------------------------------------------------------------

procedure WuLineTo(Canvas: TCanvas; X,Y: Integer);
//Алгоритм Ву (разложение отрезка в растр со сглаживанием)
//http://ru.wikipedia.org/wiki/Алгоритм_Ву
var
  X0,Y0,KX,C1,C2,H,i: Integer;
  T,KY: Double;
begin
  C1:=Canvas.Pen.Color; //цвет линии
  C2:=Canvas.Brush.Color; //цвет фона
  H:=Canvas.Pen.Width; //толщина линии
  if H < 1 then H:=1;
  X0:=Canvas.PenPos.X; Y0:=Canvas.PenPos.Y; //координаты начала
  if X < X0 then
    begin //всегда чертим слева на право
      KX:=X0; X0:=X; X:=KX;
      KX:=Y0; Y0:=Y; Y:=KX;
    end;
  T:=(Y-Y0)/(X-X0); //тангенс угла наклона к оси X
  KY:=Y0;
  for KX:=X0 to X do
    begin
      Canvas.Pixels[KX,trunc(KY)-trunc(H/2)]:=ColorGradient(C1,C2,frac(KY));
      for i:=1 to H-1 do
        Canvas.Pixels[KX,trunc(KY)-trunc(H/2)+i]:=ColorGradient(C1,0,0);
      Canvas.Pixels[KX,trunc(KY)-trunc(H/2)+H]:=ColorGradient(C2,C1,frac(KY));
      KY:=KY+T;
    end;
  Canvas.MoveTo(X,Y); //перемещаем перо в конец линии
end; //WuLineTo

//-------------------------------------------------------------------------

procedure WuLine(Canvas: TCanvas; X1,Y1,X2,Y2: Integer);
begin
  Canvas.MoveTo(X1,Y1); WuLineTo(Canvas,X2,Y2);
end; //WuLine

//-------------------------------------------------------------------------

end.
Обращаемся к процедурам так:
Код:
Image1.Canvas.Pen.Width:=3; //толщина линии
Image1.Canvas.Pen.Color:=clNavy; //цвет линии
Image1.Canvas.Brush.Color:=clWhite; //цвет фона
WuLine(Image1.Canvas,50,100,500,120);
_Dmitry вне форума Ответить с цитированием
Старый 15.11.2009, 21:08   #6
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Матан 1 семестр универа. Уравнение прямой, проходящей через две точки. Получается функция f(x), по которй и строиться прямая.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 15.11.2009, 22:53   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Лучше использовать Алгоритм Брезенхема, он быстрее работает, чем геометрические построения.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет длин отрезков по координатам. Aleksandr Microsoft Office Excel 2 21.10.2009 16:44
Вывод по координатам Alyonka_v Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 15.09.2009 20:10
Рисование дуги круга по координатам(С++) Olya90 Помощь студентам 0 07.05.2009 13:52
Принадлежность объекта по координатам Angel_CJ Помощь студентам 9 12.09.2007 18:43
Рассчет времени по координатам Квэнди Свободное общение 5 28.12.2006 12:59