Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.10.2008, 11:40
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Восклицание Рисование линий...

Всем доброго времени суток! Таков вопрос: Как нарисовать прямую используя Pixels то есть "В ручную"? Как сделать цикл прорисовки по пикселям??? Очень надо зарание спасибо!
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #2  
Старый 25.10.2008, 13:18
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Восклицание

Ау...
Помогите!!! Надо сделать небольшую процедуру...
Даешь ей 4 координаты, а он тебе линию рисует! Это ж не сложно!!!
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #3  
Старый 25.10.2008, 13:35
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Ну, если не сложно, то в чем проблема?
Код:
procedure DrawLine(Canv : TCanvas; C1, C2 : TPoint);
begin
  Canv.MoveTo(C1.X, C1.Y);
  Canv.LineTo(C2.X, C2.Y);
end;
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #4  
Старый 25.10.2008, 14:12
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Радость

Я прям ждал подобного ответа... Вы меня немного не поняли мне нужна функция которая будет рисовать с помощью Pixels!!! К примеру:
Код:
For gip := 0 to l do
begin
[ну а тут должна быть та заветная формула!]
Image1.Canvas.Pixels[x3,y3] := clBlack;
end;
Help!...
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #5  
Старый 25.10.2008, 14:31
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

если вопрос в заветной формуле, то используя уравнения прямой, можно получить, что в цикле от Х1 до Х2 (координаты Х соответсвенно начала и конца линии), ищем Y3(X3), который равен:
Код:
Y3:=Y1+((X3-X1)*(Y2-Y1))/(X2-X1);
(X1,Y1) и (X2,Y2) - соответственно координаты точек начала и конца прямой, Y3 - искомая координата точки для использования в операторе
Код:
Image1.Canvas.Pixels[x3,y3] := clBlack;

а Х3 изменяется в цикле, вот и все, должно работать
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard

Последний раз редактировалось cotseec, 25.10.2008 в 15:27.
Ответить с цитированием
  #6  
Старый 25.10.2008, 15:26
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Если все правильно рассчитал то
Код:
procedure ImageLine(bPoint, ePoint: TPoint; Canvas: TCanvas; const Color: TColor);
var
 x, y: Integer;
 K, B: Extended;
// меняем местами А и В
  procedure xChg(var A, B: Integer);
  begin
   A := A + B;
   B := A - B;
   A := A - B;
  end;

begin
 if bPoint.X <> ePoint.X then // любая прямая отличная от вертикальной
 begin
   if bPoint.X > ePoint.X then // если коэффициенты не в порядке возрастания
   begin
    xChg(bPoint.X, ePoint.X);
    xChg(bPoint.Y, ePoint.Y);
   end;
// коэффициент наклона
  K := (ePoint.Y - bPoint.Y)/(ePoint.X - bPoint.X);
// постоянная состовляющая
  B := bPoint.Y - K*bPoint.X;
// вывод
   for x := bPoint.X to ePoint.X do
   begin
    y := Round(K*x + B); // формула

    Canvas.Pixels[x, y] := Color;
   end;
 end
 else // для вертикальной прямой
 begin
  x := bPoint.X; // постоянна

  if bPoint.Y > ePoint.Y then // меняем если нужно
   xChg(bPoint.Y, ePoint.Y);

   for y := bPoint.Y to ePoint.Y do // рисуем
    Canvas.Pixels[x, y] := Color;
 end;
end;

Использовать примерно так

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 bPoint, ePoint: TPoint;
begin
 bPoint.X := StrToInt(Edit1.Text);
 bPoint.Y := StrToInt(Edit2.Text);;
 ePoint.X := StrToInt(Edit3.Text);;
 ePoint.Y := StrToInt(Edit4.Text);;

 ImageLine(bPoint, ePoint, Image1.Canvas, clBlack);
end;
Ответить с цитированием
  #7  
Старый 25.10.2008, 16:21
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Если ты думаешь, что это тривиальная задача, то ты ошибаешься. Есть два способа рисовать линию. Первый: найти угол наклона этой прямой и по известным формулам увеличивать радиус на малую величину и ставить пиксел в соответствии с полученными координатами. Второй и умный: алгоритм Брезенхама, короче ищи в инете, ну или в книгах
Ответить с цитированием
  #8  
Старый 25.10.2008, 18:06
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

А вот почему он так полхо вырисывовал при углах близких к 90 градусам
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025