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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2010, 17:58   #1
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию OpenGl рисование многоугольников.

Добрый день, возникла сложность, отображать многоугольники на плоскости. Программа должна работать по принципу, нажимая левой кнопкой мышки расставляешь точки, нажимая правую, переходишь к рисованию следующего многоугольника, все многоугольники должны отображаться. Что то не работает, не могу понять что.Спасибо.

Код:
#pragma comment(lib, "gl/opengl32.lib")
#pragma comment(lib, "gl/glu32.lib")
#pragma comment(lib, "gl/glut32.lib")

#include <windows.h>
#include <math.h>
#include <iostream>
using namespace std;

#include "gl/gl.h"
#include "gl/glu.h"
#include "gl/glut.h"
#define N 20
#define M 20
struct POIN
{
public:
	int x;
	int y;
};
	int cidx=0;
	int j=0;
	int i=0;
	POINT** points = new POINT*[M];
	POINT& p = points[i][j];

	int cidx1=0;
void mouse (int button, int state, int x, int y)
{
	switch (button)
	{
	case GLUT_LEFT_BUTTON:
		if (cidx<20)
		{
			points[cidx1][cidx].x=x;
			points[cidx1][cidx].y=400-y;
			cidx++;
		}
	break;
	case GLUT_RIGHT_BUTTON:
		cidx1=cidx1++;
	break;
	}
}
void RenderScene()
{	
	int cidx11=0;
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_POINT_SMOOTH);
	glPointSize(5);
	glBegin(GL_POINTS);
	for (int i=0;i<cidx-1;i++)
	{
		glVertex2i(points[cidx1][i].x,points[cidx1][i].y);
	}
	glutPostRedisplay();
	glEnd();
	glBegin(GL_TRIANGLE_FAN);
	for (int i=0;i<cidx-1;i++)
	{
		glVertex2i(points[cidx1][i].x,points[cidx1][i].y);
	}
	glEnd();
	glFlush();

}

void setupRC(void)
{
	glClearColor(1,1,1,1);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0,400,0,400);
	glColor3f(1,0,0);
}
void main(void)
{
	for(int i=0;i<M;++i)points[i] = new POINT[N];
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(50,100);
	glutInitWindowSize(400,400);
	glutCreateWindow("Simple");
	glutDisplayFunc(RenderScene);
	glutMouseFunc(mouse);
	setupRC();
	glutMainLoop();
}
CWD вне форума Ответить с цитированием
Старый 20.09.2010, 20:15   #2
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Ну же, очень нужно. Подскажите, кто знает.
CWD вне форума Ответить с цитированием
Старый 21.09.2010, 02:56   #3
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

я сам недавно начал изучать опенГЛ так что если совру что-нибудь не обижайтес

В обшщем не совсем ясно что делается в нажатии мышки и зачем? при каждом (каждом!) нажатии мышки заполняется структура из 20 точек(макс). ладно.

Поскольку структурка глобальная то достучаться можно из функции дисплея. Насколько я понимаю - проблема в том, что треугольники рисуются только если окно подвигать, перекрыть, или переключаться верно?
Что творится в функции дисплея сегодня я не осилю просто, но учитывая тот факт, что не ранее чем в прошлый четверг я защитил такую же работу, могу порекомендовать сделать изменения. Начнем с алгоритма прорисовки треугольника. Если вы обратитесь в книжку Хилса OpenGL. Программирование компьютерной графики', то там будет написано, что запоминать (запоминать) нужно только базовую точку (вершину всех треугольников), и последнюю нарисованную. Таким образом имеем массив двух точек (может и трех не помню точно - это уже детали реализации) и в функции мышки при нажатии левой мышки смотрим базовую точку, последнюю точку, и рисуем полигон. В целом все просто. Как подобный алгоритм внедрить в ваш код я не знаю, но я тут подумал, что, похоже, и треугольник в функции дисплея не очень рисуется. верно? Я бы на вашем месте пересмотрел код. Знаете дело такое. первый раз для себя, второй уже преподу (бывает )

PS Всё есть в хилсе. около 50ти страниц работа от и до
С наилучшими пожеланиями.

Последний раз редактировалось Познающий; 21.09.2010 в 02:57. Причина: ps
Познающий вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование символов OpenGL Познающий Win Api 4 12.09.2010 21:43
пересечение выпуклых многоугольников fint_ushami Помощь студентам 0 05.12.2009 18:19
Рисование затекстурированного полигона в OpenGL. Вадим Буренков Мультимедиа в Delphi 2 17.08.2009 16:22