![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выставить на поверхности Карты высот числовые зачения 0-255?
Vladimir1984 © (2006-12-13 02:24:00)Как выставить на поверхности Карты высот числовые зачения 0-255?
Vladimir1984 (2006-12-13 04:15:00) [1]полный исходник тут...
http://slil.ru/23563603
Vladimir1984 (2006-12-13 04:13:00) [2]Программа откывает файл BMP, строит 3D поверхость по линейке HSL.
Задача: При клике на необходимый участок этой 3Д поверхности, появилась надпись с числовым значением соответсвующей высоте.
Rial (2006-12-13 04:07:00) [3]Нифига не понял, что надо. Сдаюсь, помогите :)
А так, по кода глядя:
1. В подпроцедурке переменная H явно лишняя.
Почему бы не использовать везде Result.
2.А если L=N ?
3.^Byte=PByte;
4.Real - не самый лучший тип. Для быстродействия Single лучше.
5.
b:=Pointer(DWORD(bmp.ScanLine[bmp.Height-1-j])+i*BytesPerPixel +0);
g:=Pointer(DWORD(bmp.ScanLine[bmp.Height-1-j])+i*BytesPerPixel+1);
r:=Pointer(DWORD(bmp.ScanLine[bmp.Height-1-j])+i*BytesPerPixel+2);
заменить можно на
Type
TBGR = packed record
B, G , R : Byte;
end;
Var
Buf : ^TRGB;
Buf:=Pointer(Cardinal(bmp.ScanLine[bmp.Height-1-j])+i*BytesPerPixel);
Хотя правда все скорость напрочь убивается процедурой
преобразования цвета :(
6.
bmp.Height - кешировали же один раз уже, зачем опять метод вызывать ?
7.
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;
Хм... я ошибаюсь... или куда направлены эти номали ?
8.
glColor3f(cx[j,k,1],cx[j,k,2],cx[j,k,3]);
а вот если сделать
Cx : Array... of GLSignle;
то можно будет написать так:
glColor3fv(@Cx[J, K]);
То же и glVertex3f касается.
Vladimir1984 (2006-12-13 03:56:00) [4]Что мне еще надо озвучить?
Джо (2006-12-13 03:49:00) [5]У... Наконец, на 16-м посте вылезла «незначительная» подробность, что для визуализации используется OpenGL. То есть, маркировку микросхемы уже озвучили.
Vladimir1984 (2006-12-13 03:47:00) [6]Проблема:
Карта высот(heightmap) как я уже сказал по линейке HSL:
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:=60*(G-N)/(L-N);
if (G>=R)and(R>=B)then H:=60+60*(L-R)/(L-N);
if (G>=B)and(B>=R)then H:=120+60*(B-N)/(L-N);
if (B>=G)and(G>=R)then H:=180+60*(L-G)/(L-N);
if (B>=R)and(R>=G)then H:=240+60*(R-N)/(L-N);
//â ðàäóãå ïîñëå ôèîëåòîâîãî èäåò îïÿòü ïåðåõîä ê êðàñíîìó
//åñëè åãî íàäî ó÷èòûâàòü ðàññêîììåíòèð 243;é
// 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[bmp.Height-1-j])+i*BytesPerPixel+0);
g:=Pointer(DWORD(bmp.ScanLine[bmp.Height-1-j])+i*BytesPerPixel+1);
r:=Pointer(DWORD(bmp.ScanLine[bmp.Height-1-j])+i*BytesPerPixel+2);
vx[i,j]:=RGB2Hue(r^, g^, b^); //âîò çäåñü óñòàíàâëèâàåò 241;ÿ âûñîòà âåðøèí â äèàïàçîíå îò 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;
Тут задаются координаты...
begin
glBegin(GL_TRIANGLES);
for j:=2 to w-2 do
for k:=2 to h-2 do
begin
glColor3f(cx[j,k,1],cx[j,k,2],cx[j,k,3]);
glVertex3f(j-dw,vx[j,k]-dv,k-dh);
glColor3f(cx[j+1,k,1],cx[j+1,k,2],cx[j+1,k,3]);
glVertex3f(j-dw+1,vx[j+1,k]-dv,k-dh);
glColor3f(cx[j+1,k+1,1],cx[j+1,k+1,2],cx[j+1,k+1,3]);
glVertex3f(j-dw+1,vx[j+1,k+1]-dv,k-dh+1);
end;
Rial (2006-12-13 03:29:00) [7]Грузим растр:
Var
Bmp:TBitmap;
...
Bmp.LoadFromFile(FileName);
Грузим JPEG картинку:
Var
J : tJPEGImage;
Bmp : TBitmap;
..
J.LoadFromFile(...);
Bmp.Assign(J);
Теперь рисуем на картинке
Bitmap.Canvas.Font.Color:=XXX;
Bitmap.Canvas.Font.Size :=XXX;
Bitmap.Canvas.TextOut(X, Y, Text);
Затем
Bmp.SaveToFile(...);
Джо (2006-12-13 03:29:00) [8]> Сейчас попробую поконкретнее объяснить...
>
> [12] Vladimir1984 © (13.12.06 03:26)
> Вариант 3
Очень конкретно, ничего не скажешь. Это все равно, чтобы я на свой вопрос из [9] «уточнил», что микросхему левой рукой из кармана мне доставать сложно.
Джо (2006-12-13 03:28:00) [9]> [11] Vladimir1984 © (13.12.06 03:25)
> Зачем так грубо? То что у меня проблема с объяснением для
> программиста...это из за неопытности...я не спорю...
Это не грубо. Это доступно объясняю, что мой вопрос для микроэлектронщика то же самое, что ваш вопрос для программиста. То есть, ответить на него невозможно принципиально.
Vladimir1984 (2006-12-13 03:26:00) [10]Вариант 3
Vladimir1984 (2006-12-13 03:25:00) [11]Зачем так грубо? То что у меня проблема с объяснением для программиста...это из за неопытности...я не спорю...
Сейчас попробую поконкретнее объяснить...
Rial (2006-12-13 03:22:00) [12]Проблема то в чем заключается ?
1.Преобразовать значение цвета HSL в цифру.
2.Получить на картинке цвет пиксела.
3.Нарисовать на картинке текст, содержащий цифру.
4.Ваш вариант.
Джо (2006-12-13 03:18:00) [13]> [8] Vladimir1984 © (13.12.06 03:15)
> Инженер микроэлектроник, никогда не был программистом...не
> вольно занимаюсь этим =)
Так вот, Владимир, если Вас не затруднит, ответьте мне, пожалуйста, на вопрос по Вашей специальности (ответ на него мне очень важен). Вопрос такой: «какая маркировка на той микросхеме, что лежит у меня в заднем кармане брюк и как мне уменьшить сопротивление в резисторе XXX»?
Vladimir1984 (2006-12-13 03:15:00) [14]Инженер микроэлектроник, никогда не был программистом...не вольно занимаюсь этим =)
Джо (2006-12-13 03:14:00) [15]Владимир, если Вас не затруднит... Какое у Вас профильное образование? В целях улучшения взаимопонимания интересуюсь.
Vladimir1984 (2006-12-13 03:13:00) [16]Ну ясаен красен что не на самом пикселе...у выше смотри картинку
Rial (2006-12-13 03:12:00) [17]Надпись на каждом пикселе... великолепно!
Я тоже недавно решал задачу, как в лаборатории, чтобы не украли,
к каждой молекуле изотопа U235 прикрепить микрожучок :)
В итоге прицепил каждую титановой цепью и больше не мучался.
Vladimir1984 (2006-12-13 03:11:00) [18]Вот что то в таком духе...
http://slil.ru/23563496
Джо (2006-12-13 03:08:00) [19]Гм...
Vladimir1984 (2006-12-13 03:07:00) [20]Тоесть чтобы на каждом пикселе была цифровая надпись..
У меня карта высот по цветовой HSL(Красный<Желтый<Зеленый<Голубой<Синий<Магнетта) шкале...