2 / 2 / 3
Регистрация: 29.06.2011
Сообщений: 33

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

13.03.2012, 22:34. Показов 3334. Ответов 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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,474
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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,474
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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,474
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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,474
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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,474
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru