Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
ВнизКарта высот(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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c