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

Вход на сайт

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

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

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

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

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

Рейтинг@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 кб