Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выставить на поверхности Карты высот числовые зачения 0-255?


Страницы:   1 2

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(Красный<Желтый<Зеленый<Голубой<Синий<Магнетта) шкале...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо