Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33

Разбиение поверхности прямоугольника

13.03.2012, 22:34. Показов 3184. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер граждане форумчане! Я написала программу рекурсивного разбиения прямоугольника с использованием библиотеки OpenGL, но мне выдаёт ошибку.
Помогите пожалуйста исправить ошибку или подскажите пожалуйста хотябы где мне исправлять нужно.
Вот текст программы:
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
//---------------------------------------------------------------------------
#include <gl.h>
//#include <glax.h>
#include <glu.h>
#include <glut.h>
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
#pragma argsused
int FillFlag=1;
void DrawRect(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, GLint FillFlag);/*{
         // glBegin (GL_QUAD_STRIP);
         glVertex2f(x1,y1); glVertex2f(x2,y1); glVertex2f(x2,y2); glVertex2f(x1,y2);  }
    //  glEnd(GL_QUAD_STRIP);}
void Display(void){
         GLfloat x1,y1,x2,y2; GLdouble R, Xc,Yc;
         glClearColor(1,0,0,1); glClear(GL_COLOR_BUFFER_BIT);
         x1=Xc-R; y1=Yc-R;x2=Xc+R;y2=Yc+R;
         DrawRect(x1, y1, x2, y2, 1);
         glFinish();    }  /*/
void RectangleDraw (int Current, int Count, double R, double Xc, double Yc, int m){
         int i, x1, x2, y1, y2; double pi=3.14159265;
         if (Current==Count) {if ((Xc-R>=x1) || (Xc+R<=x2) || (Yc-R>=y1) || (Yc+R<=y2)) {
             DrawRect(Xc-R,Yc-R,Xc+R,Yc+R,1); }
         else {i=0; do {RectangleDraw(Current+1,Count,R/2,Xc+R*cos(2*pi*i/m)/2,Yc+R*sin(2*pi*i)/2,m); i++;}
             while (i<m);
         if (i>=m){RectangleDraw(Current+1,Count,R/2,Xc,Yc,m);}  }
int main(int argc, char **argv){
         glutInit(&argc,argv); glColor3d(0,1,0);  glBegin (GL_QUAD_STRIP);
         glClearColor(1,0,0,1); glClear(GL_COLOR_BUFFER_BIT);
         int x1, y1, x2,y2, n, m, j; double R,Xc,Yc;
         printf("Vvedite kolichestvo razbienii"); scanf("%d",&n);
         printf("Vvedite kolichestvo graney"); scanf("%d",&m);
         printf("Vvedite koordinati po ocheredi:");
         printf("x1="); scanf("%d",&x1);
         printf("y1="); scanf("%d",&y1);
         printf("x2="); scanf("%d",&x2);
         printf("y2="); scanf("%d",&y2);
         glVertex2f(x1,y1); glVertex2f(x2,y1); glVertex2f(x2,y2); glVertex2f(x1,y2);
         R=pow((pow((x2-x1),2)+pow((y2-y1),2)),1/2);
         Xc=x1+(x2-x1)/2; Yc=y1+(y2-y1)/2;
         j=1;
         do {RectangleDraw(1,j,R,Xc,Yc,m); j++;} while (j<=n);
        glutInitDisplayMode(GLUT_RGBA);
        glutInitWindowSize(640,640);
        glutCreateWindow("ytyt4319");
       // glutDisplayFunc(Display);
        glEnd(GL_QUAD_STRIP);
       /* getch();//system("pause"); */
       glutMainLoop();
        return 0;
     };}}
 
//---------------------------------------------------------------------------
Вот текст ошибок:
C
1
2
[C++ Error] Unit1.c(30): E2140 Declaration is not allowed here
[C++ Error] Unit1.c(30): E2141 Declaration syntax error
З.Ы. Первый раз пишу программу с использованием библиотеки OpenGL
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.03.2012, 22:34
Ответы с готовыми решениями:

Разбиение прямоугольника на квадраты
Привет всем! Решаю такую задачу: Дан прямоугольник с размерами a х b. От него отрезают квадраты максимального размера, пока это возможно....

Использовать рекурсивную функцию деления прямоугольника на два прямоугольника меньших размеров
Разработка программы для вывода изображения на экран &quot;Деление прямоугольника&quot;. Отобразить прямоугольник заданных...

Ввести площадь и периметр прямоугольника. Вывести длины сторон этого прямоугольника
Помогите написать программу... Пользователь водит прямоугольника площадь и периметр. Надо нарисовать прямоугольник на экране и вывести...

29
2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33
18.03.2012, 15:48  [ТС]
Студворк — интернет-сервис помощи студентам
Здорово. А можете пожалуйста сбросить свою библиотеку OpenGL. Вы не поверите, но у меня опять высвечует ошибку:
[C++ Error] glut.h(146): E2337 Only one of a set of overloaded functions can be "C"
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
18.03.2012, 16:24
у меня вроде такие
Вложения
Тип файла: rar GL.rar (407.9 Кб, 12 просмотров)
1
2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33
03.04.2012, 01:46  [ТС]
Доброго времени суток граждане форумчане! Помогите пожалуйста ещё раз. Я видоизменила свою программу, она компилируется превосходно, ни одной ошибки не выдаёт. Когда запускаю программу, ввожу вложеность рекурсии, количество разбиений, координаты, мне рисуется чёрный прямоугольник вместо цветного, хотя параметры указывают на цветной. Как исправить эту проблему?
Вот текст программы:
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
   //---------------------------------------------------------------------------
#include <windows.h>
#include <H:\4319\b\gl.h>
#include <H:\4319\b\glu.h>
#include <H:\4319\b\glut.h>
 
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
GLint Width = 512, Height = 512;
GLint x1, y1, x2,y2, n, m, j;  GLdouble R,Xc,Yc;
 
void RectangleDraw (GLint Current, GLint Count, GLdouble R, GLdouble Xc, GLdouble Yc, GLint m){
         GLint i; GLdouble a1,b1,a2,b2; GLfloat c,d;
         a1=Xc-R; b1=Yc-R; a2=Xc+R; b2=Yc+R;
if (m>0){ c=Xc+R*cos(2*M_PI*i/m)/2;
         d=Yc+R*sin(2*M_PI*i/m)/2;};
         if (Current==Count)
         {if ((a1>=x1)&&(a2<=x2)&&(b1>=y1)&&(b2<=y2))
         {   glColor3i(255,0,255);
             glBegin (GL_QUADS);
             glVertex2i(floor(a1),floor(b1));
             glVertex2i(floor(a2),floor(b1));
             glVertex2i(floor(a2),floor(b2));
             glVertex2i(floor(a1),floor(b2));
             glEnd();
              } return;}
         else {for(i=0;i<m;i++) RectangleDraw(Current+1,Count,R/2,c,d,m);
        if (i>m)  RectangleDraw(Current+1,Count,R/2,Xc,Yc,m);} return;}
void Display(void){ GLint z1,z2,r1;
        /**/printf("Vvedite kolichestvo razbienii: "); scanf("%d",&n);
         printf("Vvedite vlogenost rekursii >0: "); scanf("%d",&m);
if (m<=0){printf("Vvedite vlogenost rekursii >0: "); scanf("%d",&m);};
         printf("Vvedite koordinati po ocheredi:");
         printf("x1="); scanf("%d",&x1);
         printf("y1="); scanf("%d",&y1);
         printf("x2="); scanf("%d",&x2);
         printf("y2="); scanf("%d",&y2); /**/
        /* x1=1; x2=491; y1=1; y2=491; n=10; m=6; /**/
             z1=pow((x2-x1),2); z2=pow((y2-y1),2); r1=pow((z1+z2),1/2);
       R=r1/5;
     Xc=x1+z1/2; Yc=y1+z2/2;
       glClearColor(1,0,1,1);
       glClear(GL_COLOR_BUFFER_BIT);
       glColor3i(255,255,0);
       glBegin (GL_QUADS);
       glVertex2i(x1,y1);
       glVertex2i(x2,y1);
       glVertex2i(x2,y2);
       glVertex2i(x1,y2);
       glEnd();
       for(j=1;j<=n;j++)RectangleDraw(1,j,R,Xc,Yc,m);
     glFinish();    }
void Reshape(GLint w, GLint h)
   { Width = w; Height = h;
     glViewport(0, 0, w, h);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(0, w, 0, h, -1.0, 1.0);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
}
int main(int argc, char *argv[]){
         glutInit(&argc,argv);
         glutInitDisplayMode(GLUT_RGBA);
         glutInitWindowSize(Width, Height);
         glutCreateWindow("Klicenko Anna");
         glutDisplayFunc(Display);
         glutReshapeFunc(Reshape);
         glutMainLoop();
                  return 0;
     }
//---------------------------------------------------------------------------
Вложения
Тип файла: rar b.rar (505.4 Кб, 9 просмотров)
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
03.04.2012, 09:52
у меня рисует розовый фон в GL-окне. и вообще очень странно себя ведет - постоянно спрашивает на сколько разбить от того, что запросы делаются из функции отображения - наверное это не совсем то что нужно. для того что бы полигоны закрашивались смотреть в сторону
C++
1
2
        glPolygonMode(GL_FRONT, GL_FILL);
        glPolygonMode(GL_BACK, GL_FILL);
по поводу матрицы проецирования. у меня она делается так
C++
1
2
3
4
    glViewport(0, 0, ww, hw);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(l, r, b, t, 1.0, -1.0);
у вас вроде так же, но вы потом еще затираете сформированную матрицу через еще один вызов
C++
1
glLoadIdentity();
Добавлено через 1 минуту
...может запросить параметры один раз перед созданием GL-окна?
1
2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33
03.04.2012, 13:19  [ТС]
Розовый фон и должен был выводится. Я вставила запрос параметров один раз перед созданием GL-окна. Компилируется всё хорошо, нет ошибок. Далее в окошке ввожу координаты, количество разбиений и вложенность рекурсии и второе окошко с прорисовкой не высвечивается. Матрицу проэцирования я оставила без изминений.
Текст кода:
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 <H:\4319\aa\gl.h>
#include <H:\4319\aa\glu.h>
#include <H:\4319\aa\glut.h>
 
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
GLint Width = 700, Height = 700;
GLint x1, y1, x2,y2, n, m, j;  GLdouble R,Xc,Yc;
 
void RectangleDraw (GLint Current, GLint Count, GLdouble R, GLdouble Xc, GLdouble Yc, GLint m){
         GLint i; GLdouble a1,b1,a2,b2; GLfloat c,d;
         a1=Xc-R; b1=Yc-R; a2=Xc+R; b2=Yc+R;
if (m>0){ c=Xc+R*cos(2*M_PI*i/m)/2;
         d=Yc+R*sin(2*M_PI*i/m)/2;};
         if (Current==Count)
         {if ((a1>=x1)&&(a2<=x2)&&(b1>=y1)&&(b2<=y2))
         {   glColor3i(255,0,255);
             glBegin (GL_QUADS);
             glVertex2i(floor(a1),floor(b1));
             glVertex2i(floor(a2),floor(b1));
             glVertex2i(floor(a2),floor(b2));
             glVertex2i(floor(a1),floor(b2));
             glEnd();
              } return;}
         else {for(i=0;i<m;i++) RectangleDraw(Current+1,Count,R/2,c,d,m);
        if (i>m)  RectangleDraw(Current+1,Count,R/2,Xc,Yc,m);} return;}
 
void Display(void){GLint z1; GLint z2; GLint r1;
       glClearColor(1,1,1,1);
       glClear(GL_COLOR_BUFFER_BIT);
       glColor3i(255,255,0);
       glBegin (GL_QUADS);
       glVertex2i(x1,y1);
       glVertex2i(x2,y1);
       glVertex2i(x2,y2);
       glVertex2i(x1,y2);
       glEnd();
       z1=pow((x2-x1),2); z2=pow((y2-y1),2); r1=pow((z1+z2),1/2);
       R=r1/5;
     Xc=x1+z1/2; Yc=y1+z2/2;
       for(j=1;j<=n;j++)RectangleDraw(1,j,R,Xc,Yc,m);
     glFinish();    }
 
void Reshape(GLint w, GLint h)
   { Width = w; Height = h;
       glViewport(0, 0, w, h);
       glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(0, w, 0, h, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
   /**/  }
 
int main(int argc, char *argv[]){
         printf("Vvedite kolichestvo razbienii: "); scanf("%d",&n);
         printf("Vvedite vlogenost rekursii >0: "); scanf("%d",&m);
if (m<=0){printf("Vvedite vlogenost rekursii >0: "); scanf("%d",&m);};
         printf("Vvedite koordinati po ocheredi:");
         printf("x1="); scanf("%d",&x1);
         printf("y1="); scanf("%d",&y1);
         printf("x2="); scanf("%d",&x2);
         printf("y2="); scanf("%d",&y2); /**/
 
         glutInit(&argc,argv);
         glutInitDisplayMode(GLUT_RGBA);
         glutInitWindowSize(Width, Height);
         glutCreateWindow("Klicenko Anna");
         glutDisplayFunc(Display);
         glutReshapeFunc(Reshape);
         glutMainLoop();
                  return 0;
     }
 
//---------------------------------------------------------------------------
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
03.04.2012, 15:22
про матрицу - это я сглупил, вы правильно очищали матрицу модели. однако для орто как я и говорил нужно 1 и -1 местами поменять - иначе действительно висит. у меня высвечивается на белом фоне черный квадрат в левом нижнем углу. ввожу количество разбиений 4, рекурсия 1, координаты -100/-100/100/100.
1
2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33
04.04.2012, 00:13  [ТС]
А как можно сделать так, чтобы было видно визуально это разбиение, чтобы хотябы контуры прямоугольников были другого цвета?
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
04.04.2012, 07:59
немного запоздалый вопрос - а как делается разбиение собственно? программа работает и рисует, но что именно за картину вы хотите получить)?
0
2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33
04.04.2012, 12:45  [ТС]
Вводим количество разбиений, вложеность рекурсии,координаты. Для начала оно рисует прямоугольник, потом разбивает на n частей и потом каждуюю часть ещё дробит пооддельности m раз, где m - вложеность рекурсии, n - количество разбиений. Вовсяком случае я так понимаю.
Для примера прикрепляю рисунок, как оно должно быть. Здесь n=5, m=6, x1=150, y1=150, x2=500, y2=500.
Миниатюры
Разбиение поверхности прямоугольника  
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
04.04.2012, 14:48
согласно вашему алгоритму который я вижу сквозь строчки в программе она на самом деле делает нечто ужасное и никак не совпадающее с тем что вы говорите

Добавлено через 4 минуты
например, координаты центра первого квадрата если я правильно понимаю должны вычисляться не как x1+z1/2 а как (x1+x2)/2...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2012, 14:48
Помогаю со студенческими работами здесь

Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и периметр прямоугольника.
как решить эту задачу с помощью delphi? Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и...

Нужно два градиентных прямоугольника расположить поверх белого прямоугольника
Нужно два градиентных прямоугольника расположить поверх белого прямоугольника. &lt;?xml version=&quot;1.0&quot;...

Определить, где находится текущая точка: внутри прямоугольника, снаружи, на границе прямоугольника
Представьте, что у вас на форме есть прямоугольник, границы которого на 10 пикселей отстоят от границ рабочей области формы. Необходимо...

Вычисление 2 точек на границе прямоугольника, зная точку внутри прямоугольника и Тангенс угла наклона
Помогите понять общий алгоритм....( Вычисление 2 точек на границе прямоугольника, зная точку внутри прямоугольника и Тангенс угла...

Известны вершины прямоугольника. Найти площадь и периметр прямоугольника
Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и периметр прямоугольника.


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru