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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2013, 21:03   #1
sinhwiz
Новичок
Джуниор
 
Регистрация: 20.06.2013
Сообщений: 2
По умолчанию Метод Фонга и Гуро (Gouraud shading и Phong shading)

Привет всем. Нужно нарисовать тор и затенить его двумя методами(Фонга и Гуро). Тор у меня состоит из множества треугольников, которые я закрасил на первое время через рандом. Скрин прикрепил.
Помогите реализовать затенение методами Фонга и Гуро.
Вот код рисующий эту фигуру, a,b и с это координаты соответствующих вершин треугольников.
Код:
procedure TModel.Draw(w,h:Integer);
var
  i:Integer;
  a,b,c:TPoint;
  r:Integer;
begin
  with bmp do
  begin
    Width:=w;
    Height:=h;
    with Canvas do
    begin
      Brush.Color:=clBtnFace;
      Rectangle(0,0,w,h);
    end;
    if arr2.hsize>0 then
    begin
    hh:=1;
      i:=-3;
      arr2.Sort;
      while i<arr2.hsize-3 do
      begin
        i:=i+3;
        a.X:=Floor(arr2.arr[i,0]);
        a.Y:=Floor(arr2.arr[i,1]);
        b.X:=Floor(arr2.arr[i+1,0]);
        b.Y:=Floor(arr2.arr[i+1,1]);
        c.X:=Floor(arr2.arr[i+2,0]);
        c.Y:=Floor(arr2.arr[i+2,1]);
        begin
            randomize;
            r:=random(255);
            Canvas.Brush.Color:=RGB(r,r,r);
            Canvas.Pen.Color:= RGB(r,r,r);
            Canvas.Polygon([a,b,c]);
          with Canvas do
          begin
            MoveTo(a.X,a.Y);
            LineTo(b.X,b.Y);
            LineTo(c.X,c.Y);
            LineTo(a.X,a.Y);
          end;
        end;
      end;
    end;
  end;
  cvs.Draw(0,0,bmp);
end;
Изображения
Тип файла: png Тор.png (9.1 Кб, 153 просмотров)
sinhwiz вне форума Ответить с цитированием
Старый 20.06.2013, 22:31   #2
sinhwiz
Новичок
Джуниор
 
Регистрация: 20.06.2013
Сообщений: 2
По умолчанию

Гуро помоему будет так:
Код:
procedure TModel.Draw(w,h:Integer);
var
  i:Integer;
  a,b,c:TPoint;
  r:Integer;
  ax,ay,az,bx,by,bz,nx,ny,nz,d,hh:Extended;
begin
  with bmp do
  begin
    Width:=w;
    Height:=h;
    with Canvas do
    begin
      Brush.Color:=clBtnFace;
      Rectangle(0,0,w,h);
    end;
    if arr2.hsize>0 then
    begin
    hh:=1;
      i:=-3;
      arr2.Sort;
      while i<arr2.hsize-3 do
      begin
        i:=i+3;
        a.X:=Floor(arr2.arr[i,0]);
        a.Y:=Floor(arr2.arr[i,1]);
        b.X:=Floor(arr2.arr[i+1,0]);
        b.Y:=Floor(arr2.arr[i+1,1]);
        c.X:=Floor(arr2.arr[i+2,0]);
        c.Y:=Floor(arr2.arr[i+2,1]);
        ax:=arr2.arr[i,0];
        ay:=arr2.arr[i,1];
        az:=arr2.arr[i,2];
        bx:=arr2.arr[i+1,0];
        by:=arr2.arr[i+1,1];
        bz:=arr2.arr[i+1,2];
        nx:=ay*bz-az*by;
        ny:=az*bx-ax*bz;
        nz:=ax*by-ay*bx;
        d:=sqrt(nx*nx+ny*ny+nz*nz);
        nx:=nx/d;
        nx:=Abs(nx);
        r:=Round(nx*255);
        r:=Abs(r);
        if r>255 then r:=255;
        r:=255-r;
        begin
            Canvas.Brush.Color:=RGB(r,r,r);
            Canvas.Pen.Color:= RGB(r,r,r);
            Canvas.Polygon([a,b,c]);
          with Canvas do
          begin
            MoveTo(a.X,a.Y);
            LineTo(b.X,b.Y);
            LineTo(c.X,c.Y);
            LineTo(a.X,a.Y);
          end;
        end;
      end;
    end;
  end;
  cvs.Draw(0,0,bmp);
end;
sinhwiz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
заливка по Гуро, интенсивность и цвет HelalynFlowers Помощь студентам 5 16.05.2013 13:38
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! OneBri Помощь студентам 0 03.10.2012 08:42
метод Гуро, Фонга михончик Помощь студентам 4 28.05.2012 06:17
Заливка Гуро Alenkakiss C++ Builder 1 07.03.2010 12:48