Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

Карта высот(OpenGL) как заменить цвета?   Найти похожие ветки 

 
Vladimir1984 ©   (2006-12-24 23:27) [0]

У меня карта высот, исходная картинка bmp в Hue(мин цвет красный<желтый<зеленый<голубой<синий<малиновый)...
Как сделать так, чтобы цвета на уже постороенной поверхности можно было менять в ручную?
Часть кода...

procedure TfrmPulsar3D.bmp1Click(Sender: TObject);
   function RGB2Hue(R, G, B: byte): real;
   var
     N, L: byte;
     H: real;
   begin
     L:=max(R,G); L:=max(L,B);
     N:=min(R,G); N:=min(N,B);
     if (R=G)and(G=B)then
         H:=0
     else
       begin
         if (R>=G)and(G>=B)then H:=30*(G-N)/(L-N);
         if (G>=R)and(R>=B)then H:=30+30*(L-R)/(L-N);
         if (G>=B)and(B>=R)then H:=60+30*(B-N)/(L-N);
         if (B>=G)and(G>=R)then H:=90+30*(L-G)/(L-N);
         if (B>=R)and(R>=G)then H:=120+30*(R-N)/(L-N);
         //в радуге после фиолетового идет опять переход к красному
         //если его надо учитывать расскомментируй
        // if (R>=B)and(B>=G)then H:=300+60*(L-B)/(L-N)-1;
       end;
     result:=H;
   end;

var
 i,j,k:Integer;
 r,g,b: ^BYTE;
 BytesPerPixel: BYTE;
begin
 try
   if OpenPictureDialog1.Execute then
     if FileExists(OpenPictureDialog1.FileName) then
     begin
       bmp.Width:=0;
       bmp.Height:=0;
       bmp.LoadFromFile(OpenPictureDialog1.FileName);
       w:=bmp.Width;
       h:=bmp.Height;
       SetLength(vx,w);
       SetLength(nx,w);
       SetLength(cx,w);
       for i:=0 to w-1 do
       begin
         SetLength(vx[i],h);
         SetLength(nx[i],h);
         SetLength(cx[i],h);
       end;

       //посчитаем количество байт на пиксель
       if bmp.PixelFormat=pf32bit then BytesPerPixel:=4  //если 32бита, то4 байта на пиксель
       else BytesPerPixel:=3; //предположим, что картинка 24-битная, т.е. 3 байта на пиксель
              //с другими форматами (8бит, 16 бит) работать не будет

       for j:=0 to h-1 do
         for i:=0 to w-1 do
       // Выделяет значение интенсивности из значения цвета RGB
       // где R - Красный, G - Зеленый, B - Синий
         begin
            b:=Pointer(DWORD(bmp.ScanLine[j])+i*BytesPerPixel+0);
          g:=Pointer(DWORD(bmp.ScanLine[j])+i*BytesPerPixel+1);
          r:=Pointer(DWORD(bmp.ScanLine[j])+i*BytesPerPixel+2);
           vx[i,j]:=RGB2Hue(r^, g^, b^); //вот здесь устанавливается высота вершин в диапазоне от 0 до 360

           cx[i,j,1]:=r^/255;
           cx[i,j,2]:=g^/255;
           cx[i,j,3]:=b^/255;
         end;
       for i:=0 to w-1 do
         for j:=0 to h-1 do
           for k:=1 to 3 do
             nx[i,j,k]:=1;
       for i:=0 to w-2 do
         for j:=0 to h-2 do
           CalcNormals(i,vx[i,j],j,
                       i+1,vx[i+1,j],j,
                       i+1,vx[i+1,j+1],j+1,
                       nx[i,j,1],nx[i,j,2],nx[i,j,3]);
     end else
       MessageBox(Handle,
                  PAnsiChar("Файл "+OpenPictureDialog1.FileName+" не найден"),
                  "Ошибка",MB_OK or MB_ICONERROR);
 except
   MessageBox(Handle,
              PAnsiChar("Ошибка во время загрузки файла "+
                OpenPictureDialog1.FileName),
              "Ошибка",MB_OK or MB_ICONERROR);
 end;

end;


 
ors_archangel ©   (2006-12-25 05:38) [1]

Что значит в ручную?



Страницы: 1 вся ветка

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.027 c
15-1167066549
ocean
2006-12-25 20:09
2007.01.14
Программа кодирования папки


15-1166682900
вразлет
2006-12-21 09:35
2007.01.14
Туркменбаши того


3-1161779915
SLP
2006-10-25 16:38
2007.01.14
select с разных серверов и баз данных


15-1166901196
Начинающий5
2006-12-23 22:13
2007.01.14
Шифрование


15-1166554186
cando
2006-12-19 21:49
2007.01.14
пароли и имена подключений