Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...
Комментарии на английском переведите на русский. Дополните код комментариями, чтоб было понятно как работает алгоритм
Пример, к которому вы оставили комментарий строит именно то самое изображение на языке с#, которое вам необходимо. Отличается только цветовая палитра.

Счетчики и рейтинг

Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
Lazarus 1.2.4

Задача : построить (растеризовать) эллипс, зная координаты его центра и длины меньшей и большей полуосей a и b соответственно.
Суть алгоритма : использование модифицированного алгоритма Брезенхема для построение окружности . Как и в оригинальном алгоритме Брезенхема, выбор ближайшей точки основан на анализе знаков управляющих
В поля "X" и "Y" вводятся координаты центра окружности, в поля "a" и "b" — длины соответствующих полуосей.

Код программы: 

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, ColorBox;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    ColorBox1: TColorBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure DrawEllipse (x, y, a, b : Integer; color: TColor);
var
col,  row : Integer;  //Column - "Столбец", row - "ряд,строка"
// Нет необходимости создавать переменные ниже
// Но я пользуюсь правилом " Используется более 1 раза -- создай переменную "
a_sqr, b_sqr, two_a_sqr, two_b_sqr, four_a_sqr, four_b_sqr, d: Longint; // Чтобы избежать переполнения int при больших значениях a или b
begin
a_sqr:=a*a;   //a^2
b_sqr:=b*b;   //b^2
row:=b;
col:=0;
two_a_sqr:=a_sqr<<1;     //2*a^2
two_b_sqr:=b_sqr<<1;     //2*b^2
four_a_sqr:=a_sqr<<2;    //4*a^2
four_b_sqr:=b_sqr<<2;    //4*b^2
d:=two_a_sqr*((row-1)*(row))+a_sqr+two_b_sqr*(1-a_sqr);
while (a_sqr*row > b_sqr*col) do
      begin
           Form1.PaintBox1.Canvas.Pixels[x+col, y+row]:=color;
           Form1.PaintBox1.Canvas.Pixels[x+col, y-row]:=color;
           Form1.PaintBox1.Canvas.Pixels[x-col, y+row]:=color;
           Form1.PaintBox1.Canvas.Pixels[x-col, y-row]:=color;
           if d >= 0 then
           begin
                row:=row-1;
                d:=d-four_a_sqr*row;
           end;
           d:=d+two_b_sqr*(3+col*2);
           col:=col+1;
      end;
      d:=two_b_sqr*(col+1)*col+two_a_sqr*(row*(row-2)+1)+(1-two_a_sqr)*b_sqr;
      while ((row)+1)<>0 do
            begin
                 Form1.PaintBox1.Canvas.Pixels[x+col, y+row]:=color;
                 Form1.PaintBox1.Canvas.Pixels[x+col, y-row]:=color;
                 Form1.PaintBox1.Canvas.Pixels[x-col, y+row]:=color;
                 Form1.PaintBox1.Canvas.Pixels[x-col, y-row]:=color;
                 if d<=0 then
                    begin
                         col:=col+1;
                         d:=d+four_b_sqr*col;
                    end;
                 row:=row-1;
                 d:=d+two_a_sqr*(3-(row << 1 ));
            end;
 
end;
procedure TForm1.Button1Click(Sender: TObject);     // Обработка события нажатия кнопки Draw
begin
  DrawEllipse (StrToInt(Edit1.Text),  StrToInt(Edit2.Text),StrToInt(Edit3.Text), StrToInt(Edit4.Text), ColorBox1.Selected);        // 4 координаты и цвет, который  исрользуется для рисования
end;
 
end.

Прикрепленный файлРазмер
konsmanov_2_ellepse_example.zip272.79 кб