Среда программирования:
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 кб |