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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2012, 02:19   #1
Иварунька
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 12
По умолчанию Алгоритм брезенхема

Привет! Итак соорудил кодище с Алгоритмом Брезенхема. Но он позволяет по чему то рисовать линии только справа и с лева относительно диагоналей. Будьте добры, помогите советом. Подсвечу чем могу где должна быть проблема. Заранее Спасибо!
Код:
{$R *.dfm}
 
procedure TForm1.Brezenhems(x0, y0, x1, y1: integer);
var
 pn, // vi4isljaemij paramets sootno6enija naklona
n, //nomer interaciji
dx, dy, //x1-x0, y1-y0
xn, yn, //x i y koordinati v kazdoj to4ke
xi, yi:integer; //(-1 ili 1)
begin
 
 xn:=x0; // polu4enija na4alnix koordinat iz edit boksov
 yn:=y0; // polu4enija na4alnix koordinat iz edit boksov
 dx:=abs(x1-x0); // NAklon liniji
 dy:=abs(y1-y0); // NAklon liniji
 
 If x1>x0 then
 xi:=1 else xi:=-1;
 
If y1>y0 then
 yi:=1 else yi:=-1; 
 
 Image1.Canvas.Pixels[x0,y0]:=clRed;
 
 if dx>dy then    
 begin
 n:=-1;
 pn:= 2*dy - dx;
  
 while xn<>x1 do //cikl zapisi vsex etix zna4enij v matricu i vipolnenieje samogo prostavlenija pikselej
 begin
 If pn>0 then   {O6ibka gdeto tuta}
 begin
 n:=n+1;
 xn:=xn+xi;
 yn:=yn+yi;
 pn:=pn+2*dy-2*dx;
 end
 else
 begin
 n:=n+1;
 xn:=xn+xi;
 
 pn:=pn+2*dy;
 end;
 {kakije zna4enija budut propisivatsaj v matricu}
 Image1.Canvas.Pixels[xn, yn]:=clGreen;
 StringGrid1.RowCount:=n+1;
 StringGrid1.Cells[0, n+1]:= IntToStr(n);
 StringGrid1.Cells[1, n+1]:= IntToStr(xn);
 StringGrid1.Cells[2, n+1]:= IntToStr(yn);
 StringGrid1.Cells[3, n+1]:= IntToStr(pn);
     {konec kakije zna4enija budut propisivatsaj v matricu}
 end;
end;
end;
  {verxnjaja stroja matrici}
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.Pen.Color:=clWhite;
StringGrid1.Cells[0,0]:='NR';
StringGrid1.Cells[1,0]:='Xn';
StringGrid1.Cells[2,0]:='Yn';
StringGrid1.Cells[3,0]:='Pn';
end;
   {kenoc verxnjaja stroja matrici}
 
{fiksacija kursora koordinat}
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Label5.Caption:='X='+IntToStr(x)+', y='+intTOStr(y);
end;
  {konec fiksaciji kursora koordinat}
 
 
 {otpravka koordinat ir edit boksov v funkciju}
procedure TForm1.Button2Click(Sender: TObject);
var x0, y0, x1, y1:integer;
 
begin
 
 
  x0:=((Image1.Height) div 2);
  y0:=((Image1.Width) div 2);
  x1:=StrToInt(Edit3.Text);
  y1:=StrToInt(Edit4.Text);
 
  brezenhems(x0, y0, x1, y1);
end;
 {konec otpravka koordinat ir edit boksov v funkciju}
 
 {zamazivanije kvadratom vsego narisovannogo i stiranije zna4enij v matrice}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
Image1.Canvas.Pen.Color:=clWhite;
Image1.Canvas.Rectangle(0,0, image1.Width, Image1.Height);
For i:=1 to StringGrid1.RowCount do
  For j:=0 to StringGrid1.ColCount do
  StringGrid1.Cells[i,j]:='  ';
 
end;
 
 
 
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var x0, y0, x1, y1,abix,abiy:integer;
 
begin
 
 
  x0:=((Image1.Height) div 2);
  y0:=((Image1.Width) div 2);
  x1:=X;
  y1:=Y;
  Edit3.Text:=IntToStr(X);
   Edit4.Text:=IntToStr(Y);
 
 
  brezenhems(x0, y0, x1, y1);
end;
 
 
end.
Изображения
Тип файла: jpg Untitled.jpg (24.9 Кб, 115 просмотров)

Последний раз редактировалось Иварунька; 19.11.2012 в 02:25.
Иварунька вне форума Ответить с цитированием
Старый 20.11.2012, 00:57   #2
Иварунька
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 12
По умолчанию

Всё разобрался! Всем кто попытался вникнуть пасибо)
А для будущих поколения вот полноценный код.
Код:

var
  Form1: TForm1;
    abux,abuy:integer;
implementation

{$R *.dfm}

procedure TForm1.Brezenhems(x0, y0, x1, y1: integer);
var pn, //risinajosha parametra vertiba
n, //iteracija numurs
dx, dy, //x1-x0, y1-y0
xn, yn, //x un y koordinashu vertibas katra soli
xi, yi:integer; //(-1 vai 1)
begin

 xn:=x0; // funkcija otpravila zna4enije koordinat iz edit boksov(dljazapisi koordinat na kazdom 6agu)
 yn:=y0; // funkcija otpravila zna4enije koordinat iz edit boksov(dljazapisi koordinat na kazdom 6agu)
 dx:=abs(x1-x0); // NAklon liniji
 dy:=abs(y1-y0); // NAklon liniji

 If x1>x0 then
 xi:=1 else xi:=-1;{vi4isljaet polozitelnoje li napravlenije}

If y1>y0 then
 yi:=1 else yi:=-1; {vi4isljaet polozitelnoje li napravlenije}

 Image1.Canvas.Pixels[x0,y0]:=clRed;

 if dx>dy then    //opredeljenije neklonnosti, tipo po x ili y pro6losj bol6e
 begin
     n:=-1;
 pn:= 2*dy - dx;

 while xn<>x1 do //cikl zapisi vsex etix zna4enij v matricu
 begin
 If pn>=0 then
 begin
 n:=n+1;
 xn:=xn+xi;
 yn:=yn+yi;
 pn:=pn+2*dy-2*dx;
 end
 else
 begin
 n:=n+1;
 xn:=xn+xi;

 pn:=pn+2*dy;
 end;

 {kakije zna4enija budut propisivatsaj v matricu}
  
 Image1.Canvas.Pixels[xn, yn]:=clGreen;
 StringGrid1.RowCount:=n+1;
 StringGrid1.Cells[0, n+1]:= IntToStr(n);
 StringGrid1.Cells[1, n+1]:= IntToStr(xn);
 StringGrid1.Cells[2, n+1]:= IntToStr(yn);
 StringGrid1.Cells[3, n+1]:= IntToStr(pn);
     {konec kakije zna4enija budut propisivatsaj v matricu}
 end;
end;
if dx<dy then
  begin
      n:=-1;
  pn:=2*dx-dy;

  while yn<>y1 do
    begin
    if Pn>0 then
       begin
       xn:=xn+xi;
       yn:=yn+yi;
       Pn:=Pn+2*dx-2*dy;
       end
      else //pn<=0
      begin
       xn:=xn;
       yn:=yn+yi;
       Pn:=Pn+2*dx;
       end;
    Image1.Canvas.Pixels[xn, yn]:=clgreen;
    StringGrid1.RowCount:=n+1;
    StringGrid1.Cells[0, n+1]:=IntToStr(n);  // iterac nr
    StringGrid1.Cells[1, n+1]:=IntToStr(xn);  //x
    StringGrid1.Cells[2, n+1]:=IntToStr(yn);   //y
    StringGrid1.Cells[3, n+1]:=IntToStr(pn);  //risin param vert
end;
end;
end;
  {verxnjaja stroja matrici}
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.Pen.Color:=clWhite;
StringGrid1.Cells[0,0]:='NR';
StringGrid1.Cells[1,0]:='Xn';
StringGrid1.Cells[2,0]:='Yn';
StringGrid1.Cells[3,0]:='Pn';
end;
   {kenoc verxnjaja stroja matrici}

{fiksacija kursora koordinat}
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Label5.Caption:='X='+IntToStr(x)+', y='+intTOStr(y);
end;
  {konec fiksaciji kursora koordinat}


 {otpravka koordinat ir edit boksov v funkciju}
procedure TForm1.Button2Click(Sender: TObject);
var x0, y0, x1, y1:integer;

begin


  x0:=((Image1.Height) div 2);
  y0:=((Image1.Width) div 2);
  x1:=StrToInt(Edit3.Text);
  y1:=StrToInt(Edit4.Text);

  brezenhems(x0, y0, x1, y1);
end;
 {konec otpravka koordinat ir edit boksov v funkciju}

 {zamazivanije kvadratom vsego narisovannogo i stiranije zna4enij v matrice}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
Image1.Canvas.Pen.Color:=clWhite;
Image1.Canvas.Rectangle(0,0, image1.Width, Image1.Height);
For i:=1 to StringGrid1.RowCount do
  For j:=0 to StringGrid1.ColCount do
  StringGrid1.Cells[i,j]:='  ';

end;




procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var x0, y0, x1, y1,abix,abiy:integer;

begin
   if (Button = mbRight)and(Shift=[])then begin

      x0:=abux;
  y0:=abuy;
     x1:=X;
     y1:=Y;
  Edit3.Text:=IntToStr(X);
   Edit4.Text:=IntToStr(Y);
     brezenhems(x0, y0, x1, y1);

   end
   else
   begin
  x0:=((Image1.Height) div 2);
  y0:=((Image1.Width) div 2);
  x1:=X;
  y1:=Y;
  Edit3.Text:=IntToStr(X);
   Edit4.Text:=IntToStr(Y);


  brezenhems(x0, y0, x1, y1);
  end; 
end;
     

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
abux:=X;
abuy:=Y;
Form1.Edit1.Text:=IntToStr(X);
Form1.Edit2.Text:=IntToStr(Y);
end;

end.
Иварунька вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм. iamhated Помощь студентам 1 15.01.2012 16:24
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм iamhated Помощь студентам 1 14.01.2012 16:22
Снежинка алгоритмом Брезенхема Wrack C++ Builder 1 11.09.2011 22:43
Алгоритм Брезенхема vedro-compota Общие вопросы Delphi 5 31.05.2010 19:49
Алгоритм Брезенхема для рисования эллипса vedro-compota Общие вопросы Delphi 4 24.05.2010 20:35