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

Вход на сайт

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

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

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

torrvic, возможно, Вам нужно добавить -lGLU
Извините за тупой вопрос. У меня при сборке Вашего примера выходит ошибка: "undefined reference to gluLookAt". Не могу найти в какой библиотеке находится эта функция. У меня задано: -lGL -lglut ... Искал в /usr/lib таким образом: nm lib*so* | grep...
Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...

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

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

Программа демонстрирует построение шара, освещенного источником света. Используются формула построения шара, перспективная проекция и модель освещения Ламберта.

По нажатию на кнопку "Draw" начинается построение.

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

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    procedure Rastr( x,y,z: Double ); // Процедура растеризации в экранные координаты
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
Var x,y,z: Double ;
begin
  // Расчет координат x,y,z по уравнению сферы. Растеризация каждой точки
  x:=-1;
  while x<=1 do begin
    y:=-1;
    while y<=1 do  begin
      if 1-x*x-y*y >= 0 then begin
        z := sqrt(1-x*x-y*y);
        Rastr(x,y,z);
      end;
      y := y+0.003;
    end;
    x := x+0.003;
  end;
end;
 
procedure TForm1.Rastr(x, y, z: Double);
Var xs, ys, zs: Integer; // экранные координаты
    Scale, k: Integer;  // масштаб и расстояние до наблюдателя
    I_D, lx,ly,lz: Double; // Координаты источника света и диффузное освещение
begin
   Scale:=200; // Масштаб
   k:=-5; // Расстояние до наблюдателя
   lx:=0.5; // Координаты источника света
   ly:=0.5;
   lz:=0.707107;
   // Перспективная проекция, масштаб и сдвиг в середину области рисования
   xs:= Round(k*x/(z+k)*Scale)+PaintBox1.Width div 2;
   ys:= Round(k*y/(z+k)*Scale)+PaintBox1.Height div 2;
   // Расчет рассеивающего освещения по формуле Ламберта
   I_D := (x*lx+y*ly+z*lz);
   if I_D > 0 then
     PaintBox1.Canvas.Pixels[xs,ys] := RGBToColor(0,0,Round(255*I_D))
   else
     PaintBox1.Canvas.Pixels[xs,ys] := RGBToColor(0,0,10); // Фоновое освещение
end;
 
end.  

Прикрепленный файлРазмер
Пример освещения по Ламберту854.29 кб