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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2012, 15:17   #1
un_known
 
Регистрация: 16.03.2012
Сообщений: 8
По умолчанию delphi поверхность Безье

добрый день. есть программа для построения поверхности безье, мне нужно с помощью нее построить карту какой-либо местности, с наложением текстуры.

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,OpenGL;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    dc:HDC;
    hrc:HGLRC;
 procedure SetDCPixelFormat;
const
 n=100; p=0.05;
var
  Form1: TForm1;
  x,y:array [0..n-1] of GLFloat;
  z:array [0..n-1,0..n-1] of GLFloat;
  i,j,k:integer;

implementation
Procedure TForm1.SetDCPixelFormat;
var
  i:integer;
  pfd:TPixelFormatDescriptor;
begin
  FillChar(pfd,sizeOf(pfd),0);
  pfd.dwFlags:=pfd_Draw_to_Window  or  pfd_Support_OpenGL or       pfd_DoubleBuffer;
  i:=ChoosePixelFormat(dc,@pfd);
  SetPixelFormat(dc,i,@pfd);
  end;
procedure TForm1.FormCreate(Sender: TObject);
 begin
   dc:=GetDC(handle);
   SetDCPixelFormat;
   hrc:=wglCreateContext(dc);
   wglMakeCurrent(dc,hrc);

    for i:=0 to n-1 do
      begin
        x[i]:=i*p-1;
        y[i]:=x[i];
      end;

     for i:=1 to n-2 do
     for j:=1 to n-2 do
       z[i,j]:=2*random-1; //как получить эту высоту для каждой точки из рисунка?
     
    for k:=1 to 5 do
     for i:=1 to n-2 do
     for j:=1 to n-2 do
     z[i,j]:=(z[i-1,j-1]+z[i-1,j]+z[i-1,j+1]+z[i,j-1]+
        z[i,j]+z[i,j+1]+z[i+1,j-1]+z[i+1,j]+z[i+1,j+1])/9;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
   i,j:GLInt;
begin
    glpushmatrix;
    glClearColor(0.0,0.3,0.0,0.0);
    glClear(Gl_Color_Buffer_Bit or GL_DEPTH_Buffer_Bit);
     for i:=0 to n-1 do
     for j:=0 to n-2 do
    begin
   glBegin(Gl_Line_loop);
     glVertex3f(x[i],y[j],z[i,j]);
     glVertex3f(x[i+1],y[j],z[i+1,j]);
     glVertex3f(x[i],y[j+1],z[i,j+1]);
     glVertex3f(x[i+1],y[j+1],z[i+1,j+1]);
   glend;
 end;
   SwapBuffers(dc);
   glpopmatrix;
end;

end.
сначала (без наложения текстуры) нужно из черно-белого изображения получать какую либо из rgb координат, определяя тем самым высоту каждой точки, чтобы получилась модель данной карты? как это осуществить? прикреплен пример карты
Изображения
Тип файла: jpg 1.jpg (353.1 Кб, 209 просмотров)
Тип файла: jpg 11.jpg (68.6 Кб, 204 просмотров)

Последний раз редактировалось un_known; 16.03.2012 в 16:14.
un_known вне форума Ответить с цитированием
Старый 17.03.2012, 01:05   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

В uses добавляем модуль jpeg , чтобы грузить *.jpg . Далее в создаём глобальную переменные jpg:TJPEGImage; и bmp:TBitmap; и делаем так:
Код:
    jpg:=TJPEGImage.Create;
    jpg.CompressionQuality := 100;
    jpg.LoadFromFile('11.jpg');
    bmp := TBitmap.Create;
    bmp.Assign(jpg);
.........
z[i,j]:=(GetRValue(Bmp.Canvas.Pixels[i,j])+
              GetGValue(Bmp.Canvas.Pixels[i,j])+
              GetBValue(Bmp.Canvas.Pixels[i,j]))/un_known;  
// un_known - какая-то константа, подобранная  экспериментально.
.....
jpg.Free;
bmp.Free;
Но в вашем случае для массива Z нужно использовать размеры my_width = bmp.Width и my_Height =bmp.Height вместо N=100.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 17.03.2012, 22:45   #3
un_known
 
Регистрация: 16.03.2012
Сообщений: 8
По умолчанию

спасибо большое, с этим разобралась.
нашла пример, где поверхность рисуется следующим образом:
Код:
 
 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints);
 glEnable(GL_MAP2_VERTEX_3);
 glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
и в разделе констант вручную задается двумерный массив из 16 опорных точек.
в моем случае три массива: одномерные x и y; двумерный z, который высчитывается след образом:
Код:
    for i:=0 to Bitmap.Width-1 do
    for j:=0 to Bitmap.Height-1 do
      begin
       Col:=Bitmap.Canvas.Pixels[j,i];
       z[i,j]:=0.003*getRvalue(Col);
      end;
не могу разобраться, какой мне нужно задать массив опорных точек, чтобы построить нужную поверхность?
un_known вне форума Ответить с цитированием
Старый 18.03.2012, 11:49   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
и в разделе констант вручную задается двумерный массив из 16 опорных точек.
У Вас должен быть трёхмерный массив [1..m, 1..n, 0..2], где первые две размерности - это величины сетки, а третья размерность - это координаты в 3D-пространстве. Но строить карту местности через поверхность Безье, ИМХО, извращение.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 18.03.2012, 20:36   #5
un_known
 
Регистрация: 16.03.2012
Сообщений: 8
По умолчанию

спасибо )
ну это было наставление преподавателя сделать так, а каким образом лучше построить? )
un_known вне форума Ответить с цитированием
Старый 18.03.2012, 22:00   #6
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Ну вот самый простой способ(см. "Вложения"- Borland Studio Projects.rar в самом низу этого комментария).
На стрелочки можно крутить карту.
Так же можно сделать zoom, если добавить глобальную переменную "un_known" и на кнопки "+" и "-" написать действия
Код:
un_known:=un_known+0.1;
un_known:=un_known-0.1;
А в FormPaint в функции glScale вместо 0.5 использовать un_known.

P.S. Если что-то по коду непонятно, не стесняйтесь, спрашивайте.
Вложения
Тип файла: rar Borland Studio Projects.rar (766.6 Кб, 46 просмотров)
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.03.2012 в 21:59.
Rin вне форума Ответить с цитированием
Старый 25.03.2012, 10:56   #7
un_known
 
Регистрация: 16.03.2012
Сообщений: 8
По умолчанию

спасибо огромное за код и за объяснения, вроде все ясно )) такой вопрос только, при вращении карты немного подвисает, с паузами крутит ее. это можно как то исправить? я буду строить карту чуть большего масштаба и думаю будет подвисать еще сильнее. если осуществить поворот кнопкой мыши будет быстрее?
un_known вне форума Ответить с цитированием
Старый 26.03.2012, 10:07   #8
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

У меня не тормозит. Мышкой , так мышкой. Объявите такие глобальные переменные:
Код:
rx,ry,ox,oy:integer;// для поворота мышью
push:boolean=false;// для поворота мышью
И напишите на события мыши такие строки:
Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);{при нажатии левой кнопки
мыши запоминаем положение координат мыши}
begin
IF button=mbLeft then
begin
 push:=true;
 ox:=rx-x;
 oy:=ry-y;
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);{при нажатии кнопки и передвижении мыши
  мы вертим объект}
begin
 if push then
 begin
     rx:=ox+x;
     ry:=oy+y;
   Formpaint(nil);//перерисовываем форму
 end;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);//
begin
push:=false;
end;
В FormPaint будет так:
Код:
      glRotate(rx,0,1,0);
      glRotate(ry,1,0,0);
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 27.03.2012, 07:18   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
Можно ли схематично построить дома на карте
Можно. Места, где стоят дома, на карте высот пометить белым.
Изображения
Тип файла: jpg безым.jpg (12.4 Кб, 133 просмотров)
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кривая Безье. Muaxaxa Общие вопросы Delphi 2 28.11.2011 01:03
Кривая Безье. Muaxaxa Помощь студентам 2 28.11.2011 00:49
Поверхность в Excel stakam Помощь студентам 3 17.12.2010 16:49
Поверхность(Delphi) vanya92 Помощь студентам 0 22.11.2010 20:04
Поверхность по массиву точек на OpenGL в Delphi Mixasik Помощь студентам 1 21.07.2008 16:41