Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 1 / 2
Регистрация: 30.10.2012
Сообщений: 113

Ребята, нужно реализовать сечения / пунктирные линии для полигонов Delphi + Opengl. Желательно седня

22.10.2014, 19:40. Показов 1770. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пользователь будет выбирать координаты для выделенного объекта мышкой, уже замучился искать и химичить гребанные костыли. Вобщем получилось только четверть дела, нарисовать квадратную линию (обычная не работает), равное координатам,ширины, как сделать чтобы данная линия вписалась в выделенный объект/фигуру, поворачивалась с ним, вобщем как дополнительный контур/вершина была.
вот список иницилизации объектов, с той самой линией в самом, низу, может подскажите как модифицировать?
Delphi
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
{======================================================================
Ініцілізація списку геометричних фігур}
procedure TViewObjF.ListObj;
var i:integer;  a:real;
begin
  //побудова призми
  glNewList(BuildPrizm, GL_COMPILE);
  glScalef(5,5,5);  //визначення початкових характеристик для призми
  glTranslatef (0.4, 0.0, 0.0);
  // передня ліва частина
  glBegin(GL_TRIANGLES);
    glVertex3f(1, 0, 0);
    glVertex3f(0, 0, 0);
    glVertex3f(0, 1, 0);
  glEnd();
  // передня права частина
  glBegin(GL_TRIANGLES);
    glVertex3f(1, 0, 1);
    glVertex3f(0, 0, 1);
    glVertex3f(0, 1, 1);
  glEnd();
  // нижня частигп
  glBegin(GL_QUADS);
    glVertex3f(0, 0, 0);
    glVertex3f(1, 0, 0);
    glVertex3f(1, 0, 1);
    glVertex3f(0, 0, 1);
  glEnd();
  // зпадня частина
  glBegin(GL_QUADS);
    glVertex3f(0, 0, 0);
    glVertex3f(0, 1, 0);
    glVertex3f(0, 1, 1);
    glVertex3f(0, 0, 1);
  glEnd();
  // верхня частина
  glBegin(GL_QUADS);
    glVertex3f(0, 1, 0);
    glVertex3f(1, 0, 0);
    glVertex3f(1, 0, 1);
    glVertex3f(0, 1, 1);
  glEnd();
  glTranslatef (-0.4, -0.0, -0.0);
  glEndList;
  //побудова паралелепіпеду
  {glNewList(BuildParalel, GL_COMPILE);
  glScalef(5,5,10);
  glTranslatef (0.5, 0.5, 0.5);
  glBegin(GL_QUADs);
    glNormal3f(-1.0,  0.0,  0.0);
    glVertex3f(-0.5, -0.5,-0.5);
    glVertex3f(-0.5, -0.5, 0.5);
    glVertex3f(-0.5,  0.5, 0.5);
    glVertex3f(-0.5,  0.5,-0.5);
  glEnd;
  glBegin(GL_QUADs);
    glNormal3f( 0.0,  1.0,  0.0);
    glVertex3f(-0.5,  0.5,-0.5);
    glVertex3f(-0.5,  0.5, 0.5);
    glVertex3f( 0.5,  0.5, 0.5);
    glVertex3f( 0.5,  0.5,-0.5);
  glEnd;
  glBegin(GL_QUADs);
    glNormal3f( 1.0,  0.0,  0.0);
    glVertex3f( 0.5,  0.5,-0.5);
    glVertex3f( 0.5,  0.5, 0.5);
    glVertex3f( 0.5, -0.5, 0.5);
    glVertex3f( 0.5, -0.5,-0.5);
  glEnd;
  glBegin(GL_QUADs);
   glNormal3f( 0.0, -1.0,  0.0);
    glVertex3f( 0.5, -0.5,-0.5);
    glVertex3f( 0.5, -0.5, 0.5);
    glVertex3f(-0.5, -0.5, 0.5);
    glVertex3f(-0.5, -0.5,-0.5);
  glEnd;
  glBegin(GL_QUADs);
    glNormal3f( 0.0,  0.0,  1.0);
    glVertex3f( 0.5, -0.5, 0.5);
    glVertex3f( 0.5,  0.5, 0.5);
    glVertex3f(-0.5,  0.5, 0.5);
    glVertex3f(-0.5, -0.5, 0.5);
  glEnd;
  glBegin(GL_QUADs);
    glNormal3f( 0.0,  0.0, -1.0);
    glVertex3f( 0.5,  0.5,-0.5);
    glVertex3f( 0.5, -0.5,-0.5);
    glVertex3f(-0.5, -0.5,-0.5);
    glVertex3f(-0.5,  0.5,-0.5);
  glEnd; }
  glutSolidCube(1);
  glTranslatef (-0.5, -0.5, -0.5);
  glEndList;
  {------------------------------------------
побудова піраміди }
 glNewList(BuildPiramid, GL_COMPILE);
 glScalef(5,5,10);
  glRotatef (90, 1.0, 0.0, 0.0);
 glTranslatef (0.5, 0.5, 0.5);
 glBegin(GL_TRIANGLES);           // будуємо 4-трикутникову піраміду
   // передня частина
   glNormal3f(1.0, 0.0, 0.0);
   glVertex3f( 0.0, 1.0, 0.0);
   glColor3f(1,0,0);
   glVertex3f(-1.0, -1.0, 1.0);
   glVertex3f(1.0, -1.0, 1.0);
 glEnd();
   // права бокова частина
  glBegin(GL_TRIANGLES);
  gllinewidth(2);
   glNormal3f(0.0, 0.0, -1.0);
   glColor3f(1,0,0);
   glVertex3f(0.0, 1.0, 0.0);
   glColor3f(1,0,0);
   glVertex3f(1.0, -1.0, 1.0);
   glColor3f(1,0,0);
   glVertex3f(1.0, -1.0, -1.0);
   glEnd();
   // задня частина
  glBegin(GL_TRIANGLES);
   glNormal3f(0.0, -1.0, 0.0);
   glVertex3f(0.0, 1.0, 0.0);
   glVertex3f(1.0, -1.0, -1.0);
   glVertex3f(-1.0, -1.0, -1.0);
  glEnd();
   // ліва бокова частина
  glBegin(GL_TRIANGLES);
   glNormal3f(0.0, 0.0, 1.0);
   glVertex3f( 0.0, 1.0, 0.0);
   glVertex3f(-1.0,-1.0,-1.0);
   glVertex3f(-1.0,-1.0, 1.0);
 glEnd();
  glTranslatef (-0.5, -0.5, -0.5);
  glEndList;
  LGoriz:=15;  LVertical:=20;
   //побудова кулі
  glNewList(BuildSphere, GL_COMPILE);
  glScalef(5,5,5);
    glTranslatef (0.5, 0.5, 0.5);
    gluSphere(Quadric,0.5, LGoriz, LVertical); //будуємо кулю за радіусов та кількості ліній по горизонталі і вертикальні
    glTranslatef (-0.5, -0.5, -0.5);
  glEndList;
  //побудова циліндра
  glNewList(BuildCylinder, GL_COMPILE);
    glScalef(5,5,5);
    glTranslatef (0.5, 0.5, 0);
    gluCylinder (Quadric, 0.5, 0.5, 1,  LGoriz, LVertical); //будуємо циліндр та кількості ліній по горизонталі і вертикальні
    glTranslatef (-0.5, -0.5, 0);
  glEndList;
  //побудова конуса
  glNewList(BuildKonus, GL_COMPILE_AND_EXECUTE);
    glScalef(5,5,5);
    glTranslatef (0.5, 0.5, 0);
    gluCylinder(Quadric, 0.5, 0, 2, LGoriz, LVertical);  //будуємо конус та кількості ліній по горизонталі і вертикальні
    glTranslatef (-0.5, -0.5, 0);
  glEndList;
 
 
  //побудова перерізу - вот самамая линия сечения
   glNewList(BuildLine, GL_COMPILE);
   // glColor3ub(0,255,255);
   glscale(0.001,5,0.001);
   glRotatef(90, 1.0, 0.0, 0.0);
 // glRotatef(objs[markerobj].Y, 0.0, 1.0, 0.0);
 // glRotatef(objs[markerobj].Z, 0.0, 0.0, 1.0);
    gllinewidth(2);
 glTranslatef (objs[markerobj].X,objs[markerobj].Y, objs[markerobj].Z);
 glutSolidCube(1);
  glTranslatef (-objs[markerobj].X,-objs[markerobj].Y, -objs[markerobj].Z);
 glEnd;
 glEndList;
//помітка об'єктів
 glNewList(Marker, GL_COMPILE);
 glBegin(GL_quads);
  glNormal3f(-0.025, -0.025, 0.025);
  glVertex3f(0.025, 0.025, 0.025);
  glVertex3f(-0.025, 0.025, 0.025);
  glVertex3f(-0.025, -0.025, 0.025);
  glVertex3f(0.025, -0.025, 0.025);
  glEnd;
  glBegin(GL_quads);
  glNormal3f(-0.025, -0.025, 0.025);
  glVertex3f(0.025, 0.025, -0.025);
  glVertex3f(0.025, -0.025, -0.025);
  glVertex3f(-0.025, -0.025, -0.025);
  glVertex3f(-0.025, 0.025, -0.025);
 glEnd;
 glBegin(GL_quads);
   glNormal3f(-0.025, -0.025, 0.025);
   glVertex3f(-0.025, 0.025, 0.025);
   glVertex3f(-0.025, 0.025, -0.025);
   glVertex3f(-0.025, -0.025, -0.025);
   glVertex3f(-0.025, -0.025, 0.025);
 glEnd;
 glBegin(GL_quads);
  glNormal3f(0.025, -0.025, 0.025);
  glVertex3f(0.025, 0.025, 0.025);
  glVertex3f(0.025, -0.025, 0.025);
  glVertex3f(0.025, -0.025, -0.025);
  glVertex3f(0.025, 0.025, -0.025);
 glEnd;
 glBegin(GL_quads);
   glNormal3f(-0.025, 0.025, -0.025);
   glVertex3f(-0.025, 0.025, -0.025);
   glVertex3f(-0.025, 0.025, 0.025);
   glVertex3f(0.025, 0.025, 0.025);
   glVertex3f(0.025, 0.025, -0.025);
 glEnd;
 glBegin(GL_quads);
  glNormal3f(-0.025, -0.025, -0.025);
  glVertex3f(-0.025, -0.025, -0.025);
  glVertex3f(0.025, -0.025, -0.025);
  glVertex3f(0.025, -0.025, 0.025);
  glVertex3f(-0.025, -0.025, 0.025);
 glEnd;
 glEndList;
end;
Проект уже нужно завтра показывать, помогите домодифицировать либо предложите пойти другим путём решения проблемы.
Для сферы/цилиндра принципы решил проблемы, путем изменения количества отрезов по горизонтали и вертикали.
Кто поможет, скину на пиво.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2014, 19:40
Ответы с готовыми решениями:

Пунктирные линии
Как построить пунктирную линию в си++?

Пунктирные линии
Только начинаю работать с OpenGL, поэтому вопрос может показаться глупым. Нужно сделать одну линию пунктирную , а другую нет. При...

Пунктирные линии DataGrid
Господа, долго пытался создать человеческую пунктирную разметку линий DataGrid. Самый основной способ, предлагаемый везде подряд, это...

3
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,463
22.10.2014, 20:29
не совсем понятно что именно вам нужно. код к сожалению не особо проливает свет на ваши муки. что значит выбирать координаты объекта (тем более в трехмерном пространстве)? что значит квадратная (!) линия? что значит вписать линию в объект? и как линия может быть вершиной?
0
0 / 1 / 2
Регистрация: 30.10.2012
Сообщений: 113
22.10.2014, 21:40  [ТС]
Сечения/пунктирные линии как на картинке в Как gl_line_loop заполнить цветом или им же нарисовать нарисовать сферу, с произвольным их добавлением, так ясно??? что посоветуете, какой алгоритм, более готовый есть???
и если есть возможность, как при смене режима полигона контуры/границы оставить такими же как при линейном режиме.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,463
22.10.2014, 22:59
можно попробовать так
-включаем режим при котором грани будут рисоваться линиями
-включаем режим рисования только лицевых граней
-указываем что лицевыми следует считать грани с обходом вершин против часовой стрелки
-рисуем объект
-включаем режим при котором линии будут рисоваться пунктиром
-указываем что лицевыми следует считать грани с обходом вершин по часовой стрелке
-рисуем объект
-отключаем режим при котором линии будут рисоваться пунктиром
----
корявый пример:
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
#include <windows.h>
#include <gl\gl.h>
#include <gl\glut.h>
#include <math.h>
 
static GLint width = 700; //øèðèíà ýêðàíà
static GLint height = 700; //âûñîòà ýêðàíà
 
static void render(void)
{
    glBegin(GL_POLYGON);
        glNormal3f(0, 0, -1);
        glVertex3f(0, 0, 0);
        glVertex3f(1, 0, 0);
        glVertex3f(1, 1, 0);
        glVertex3f(0, 1, 0);
    glEnd();
 
    glBegin(GL_POLYGON);
        glNormal3f(0, 0, 1);
        glVertex3f(1, 0, 1);
        glVertex3f(0, 0, 1);
        glVertex3f(0, 1, 1);
        glVertex3f(1, 1, 1);
    glEnd();
}
 
static void Display(void)
{
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
 
    glRotatef(45, 1, 0, 0);
    glRotatef(45, 0, 1, 0);
 
    glColor3f(1, 1, 1);
 
    glFrontFace(GL_CCW);
    render();
 
    glEnable(GL_LINE_STIPPLE);
    glLineStipple(1, 0x00FF);
 
    glFrontFace(GL_CW);
    render();
 
    glDisable(GL_LINE_STIPPLE);
 
    glFlush();
    glutSwapBuffers();
}
 
static void Reshape(GLint width, GLint height)
{
    ::width = width;
    ::height = height;
 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5, 5, -5, 5, -100, 100);
    gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
}
 
int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(width, height);
    glutCreateWindow("test");
 
    glPolygonMode(GL_FRONT, GL_LINE);
    glPolygonMode(GL_BACK, GL_LINE);
 
    glEnable(GL_CULL_FACE);
 
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutMainLoop();
 
    return 0;
}
Добавлено через 2 минуты
для сложных объектов у которых "с той стороны" есть "щупальца" смотрящие в нашу сторону такой подход будет давать артефакты
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.10.2014, 22:59
Помогаю со студенческими работами здесь

Странные штрих-пунктирные линии, как убрать?
Весь документ в таких линиях, как их убрать? https://yapcdn.net/se4/1/dtAyRqBFjjwU05.jpg

Нужно реализовать на ЛИСП метод золотого сечения
Доброго времени суток,помогите разработать на ЛИСП метод золотого сечения,очень буду благодарен


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru