Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 3

Отображение точек с заданными координатами в OpenGL

05.11.2013, 23:17. Показов 1375. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!

Только начал изучать OpenGL. В принципе при просмотре уроков все более ли менее ясно. Но я решил посмотреть возможности OpenGL на выводе реальных данных. И вот тут у меня возникли проблемы, связанные с непониманием настройки системы координат, пирамид визуализации и т.п.
Суть такая - необходимо отобразить точки с координатами, которые лежат в таких пределах:
MinX=938059.99 MaxX=940978.32
MinY=6641968.24 MaxY=6646082.34
MinZ=840.12 MaxZ=912.11.
Код такой:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
BOOL bSetupPixelFormat(HDC hdc)
{
  PIXELFORMATDESCRIPTOR pfd, *ppfd;
  int pixelformat;
 
  ppfd = &pfd;
 
  ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
  ppfd->nVersion = 1;
  ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  ppfd->dwLayerMask = PFD_MAIN_PLANE;
  ppfd->iPixelType = PFD_TYPE_RGBA;
  ppfd->cColorBits = 16;
  ppfd->cDepthBits = 16;
 
  ppfd->cAccumBits = 0;
  ppfd->cStencilBits = 0;
 
  if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
  {
    MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
    return FALSE;
  }
  if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
  {
    MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
    return FALSE;
  }
  return TRUE;
}
 
void __fastcall TFormView1::FormCreate(TObject *Sender)
{
   ghDC = GetDC(Handle);
   if (!bSetupPixelFormat(ghDC)) Close();
   ghRC = wglCreateContext(ghDC);
   wglMakeCurrent(ghDC, ghRC);
   glClearColor(0.3, 0.3, 0.3, 0.0);
   FormResize(Sender);
 
   glEnable(GL_COLOR_MATERIAL);
   glEnable(GL_DEPTH_TEST);
 
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
     float p[4]={3,3,3,1},
           d[3]={-1,-1,-3};
   glLightfv(GL_LIGHT0,GL_POSITION,p);
   glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d); 
}
 
void __fastcall TFormView1::FormResize(TObject *Sender)
{
  glViewport(10, 5, 300, 200);
  glMatrixMode ( GL_PROJECTION );
  glLoadIdentity();
  glOrtho(MinX,MaxX, MinY,MaxY, MinZ,MaxZ);
  //glFrustum (-5,5, -5,5, -5,5);
  //gluOrtho2D(MinX,MaxX, MinY,MaxY);
  gluLookAt(MinX,MinY,MaxZ, MinX,MinY,MaxZ, 1,1,1);
  glMatrixMode ( GL_MODELVIEW );
  glLoadIdentity();
  InvalidateRect ( Handle,NULL,False );
}
 
void __fastcall TFormView1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(ghRC)
  {
    wglMakeCurrent(ghDC,0);
    wglDeleteContext(ghRC);
  }
  if(ghDC)ReleaseDC(Handle, ghDC);
}
 
void __fastcall TFormView1::FormPaint(TObject *Sender)
{
  glClear(GL_DEPTH_BUFFER_BIT |  GL_COLOR_BUFFER_BIT);
 
  glPointSize(2);
  glColor3f(0.0,0.0,1.0);
  
  glBegin(GL_POINTS);
  for (int i=0; i<Form1->PointCount; i++)
  {
    if (MinX>Form1->Files[i].X) MinX=Form1->Files[i].X;
    if (MinY>Form1->Files[i].Y) MinY=Form1->Files[i].Y;
    if (MinZ>Form1->Files[i].Z) MinZ=Form1->Files[i].Z;
 
    if (MaxX<Form1->Files[i].X) MaxX=Form1->Files[i].X;
    if (MaxY<Form1->Files[i].Y) MaxY=Form1->Files[i].Y;
    if (MaxZ<Form1->Files[i].Z) MaxZ=Form1->Files[i].Z;
 
 
    glVertex3d(Form1->Files[i].X, Form1->Files[i].Y, Form1->Files[i].Z);
  }
  glEnd();
 
      //+X
    glColor3f(1,0,0);
    glBegin(GL_LINES);
    glVertex3f(MinX+10,MinY,MinZ);
    glVertex3f(MaxX+10,MinY,MinZ);
    glEnd();
 
    //+Y
    glColor3f(0,1,0);
    glBegin(GL_LINES);
    glVertex3f(MinX,MinY+10,MinZ);
    glVertex3f(MinX,MaxY+10,MinZ);
    glEnd();
 
    //+Z
    glColor3f(0,0,1);
    glBegin(GL_LINES);
    glVertex3f(MinX,MinY,MinZ);
    glVertex3f(MinX,MinY,MaxZ);
    glEnd();
 
  SwapBuffers(ghDC);
}
Очень прошу помощи в объяснении как настроить систему координат и все остальное, чтобы увидеть загруженные точки.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2013, 23:17
Ответы с готовыми решениями:

Задача на проверку точек с заданными координатами
Здравствуйте! Проблема такая, что при вводе x и y точка принадлежит фигуре. Пример ввода значений (-2, -2) (1, 2) (1.5, 2). Буду...

Построить совокупность попарно связанных п точек с заданными координатами
1)Построить совокупность попарно связанных п точек с заданными координатами (координаты точек задаются с клавиатуры). 2) Дано натуральное...

Построить совокупность попарно связанных п точек с заданными координатами
Построить совокупность попарно связанных п точек с заданными координатами (координаты точек задаются с клавиатуры)....

2
 Аватар для snake32
3510 / 1693 / 236
Регистрация: 26.02.2009
Сообщений: 8,453
Записей в блоге: 6
06.11.2013, 10:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
BOOL bSetupPixelFormat(HDC hdc)
{
  PIXELFORMATDESCRIPTOR pfd, *ppfd;
  int pixelformat;
 
  ppfd = &pfd;
 
  ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
  ppfd->nVersion = 1;
  ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  ppfd->dwLayerMask = PFD_MAIN_PLANE;
  ppfd->iPixelType = PFD_TYPE_RGBA;
  ppfd->cColorBits = 32; // глубина цвета в 16 бит было очень очень давно
  ppfd->cDepthBits = 32;
 
  ppfd->cAccumBits = 0;
  ppfd->cStencilBits = 0;
 
  if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
  {
    MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
    return FALSE;
  }
  if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
  {
    MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
    return FALSE;
  }
  return TRUE;
}
 
void __fastcall TFormView1::FormCreate(TObject *Sender)
{
   ghDC = GetDC(Handle);
   if (!bSetupPixelFormat(ghDC)) Close();
   ghRC = wglCreateContext(ghDC);
   wglMakeCurrent(ghDC, ghRC);
   glClearColor(0.3, 0.3, 0.3, 0.0);
   FormResize(Sender);
 
   // я бы пока повременил с источниками света
   // тем более для правильного отображения нужны 
   // нормали к вершинам коих у вас нет
   /*glEnable(GL_COLOR_MATERIAL);
   glEnable(GL_DEPTH_TEST);
 
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
     float p[4]={3,3,3,1},
           d[3]={-1,-1,-3};
   glLightfv(GL_LIGHT0,GL_POSITION,p);
   glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d); */
}
 
void __fastcall TFormView1::FormResize(TObject *Sender)
{
  glViewport(10, 5, 300, 200);
  glMatrixMode ( GL_PROJECTION );
  glLoadIdentity();
  glOrtho( MinX,MaxX, MinY,MaxY, MinZ,MaxZ );
  
  glMatrixMode ( GL_MODELVIEW );
  glLoadIdentity();
  gluLookAt( (MaxX-MinX)/2.0, (MaxY-MinY)/2.0, (MaxZ-MinZ)/2.0, 
                  (MaxX-MinX)/2.0, (MaxY-MinY)/2.0, (MaxZ-MinZ)/2.0 + 1.0, 
                 0.0, 1.0, 0.0 );
  InvalidateRect ( Handle, NULL, False );
}
 
void __fastcall TFormView1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(ghRC)
  {
    wglMakeCurrent(ghDC,0);
    wglDeleteContext(ghRC);
  }
  if(ghDC)ReleaseDC(Handle, ghDC);
}
 
void __fastcall TFormView1::FormPaint(TObject *Sender)
{
  glClear( GL_DEPTH_BUFFER_BIT |  GL_COLOR_BUFFER_BIT );
 
  glPointSize(2);
  glColor3f(0.0,0.0,1.0);
  
  glBegin(GL_POINTS);
  for (int i=0; i<Form1->PointCount; i++)
  {
    if (MinX>Form1->Files[i].X) MinX=Form1->Files[i].X;
    if (MinY>Form1->Files[i].Y) MinY=Form1->Files[i].Y;
    if (MinZ>Form1->Files[i].Z) MinZ=Form1->Files[i].Z;
 
    if (MaxX<Form1->Files[i].X) MaxX=Form1->Files[i].X;
    if (MaxY<Form1->Files[i].Y) MaxY=Form1->Files[i].Y;
    if (MaxZ<Form1->Files[i].Z) MaxZ=Form1->Files[i].Z;
 
 
    glVertex3d(Form1->Files[i].X, Form1->Files[i].Y, Form1->Files[i].Z);
  }
  glEnd();
 
      //+X
    glColor3f(1,0,0);
    glBegin(GL_LINES);
    glVertex3f(MinX+10,MinY,MinZ);
    glVertex3f(MaxX+10,MinY,MinZ);
    glEnd();
 
    //+Y
    glColor3f(0,1,0);
    glBegin(GL_LINES);
    glVertex3f(MinX,MinY+10,MinZ);
    glVertex3f(MinX,MaxY+10,MinZ);
    glEnd();
 
    //+Z
    glColor3f(0,0,1);
    glBegin(GL_LINES);
    glVertex3f(MinX,MinY,MinZ);
    glVertex3f(MinX,MinY,MaxZ);
    glEnd();
 
  SwapBuffers(ghDC);
}
наверно так

Добавлено через 1 минуту
Цитата Сообщение от Freimaks Посмотреть сообщение
MinX=938059.99 MaxX=940978.32
MinY=6641968.24 MaxY=6646082.34
MinZ=840.12 MaxZ=912.11.
Слишком большие цифры. точность отображения будет не айс
0
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 3
06.11.2013, 13:05  [ТС]
snake32, к сожалению и так тоже ничего не видно - ни одной из загруженных точек...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2013, 13:05
Помогаю со студенческими работами здесь

Для каждой из точек указать расстояние до точки с заданными координатами
Здраствуйте! Нужно написать программу с использованием подпрограммы-процедуры или подпрограммы-функции решения задачи. Процедуру...

Определить, какая из трёх точек наиболее удалена от точки с заданными координатами
На плоскости 3 точки заданы своими координатами:(x1,y1),(x2,y2),(x3,y3).Определить, какая из точек наиболее удалена от точки с заданными...

Разработайте функцию, добавляющую на изображение 1000 точек с координатами заданными случайным образом
Всем привет есть обработчик изображения using System; using System.Collections.Generic; using System.ComponentModel; using...

Определить и вывести на экран номера точек с заданными координатами которые лежат на оси OY
помогите плиз с задачей в паскале Определить и вывести на экран номера точек с координатами А(x1,y1), B(x2,y2), C(x3,y3), которые...

Заданы координаты 4-х точек. Подсчитать сумму расстояний до точки с заданными координатами (проверьте решение)
Здравствуйте ,столкнулся с трудностью при решении данной задачи,проверьте пожалуйста решение и укажите ошибки. Написать программу решения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru