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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2018, 12:31   #1
Gabe_Mccloud
 
Регистрация: 14.06.2018
Сообщений: 4
По умолчанию Кривая Безье С++

Подскажите пожалуйста новичку. Задача такова: Нужно написать программу, в которой осуществляется ввод с консоли трёх пар целочисленных значений являющихся точками в двумерном пространстве в формате x1 y1 x2 y2 x3 y3. Затем, вывести на экран координаты точек кривой Безье для всех целочисленных x построенных через заданные точки.
Подключил OpenGl
код:
Код:
#include <iostream>
#include <math.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#define NO_POINTS 6
using namespace std;
//Global Points for x and y coordinates
int x[NO_POINTS];
int y[NO_POINTS];
int q=0,k=0;
//For Drawing bezier between two calculated points
double oldX,oldY,currentX,currentY;

//Display Function
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

//Initiate values for display
void init(void)
{
	glClearColor(0.529412, 0.807843, 0.921569, 0.0f);
	glColor3f(0.545098, 0.270588, 0.0745098);
	glPointSize(4.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//Set up orthographics matrix
	gluOrtho2D(0,1280,0,720);
}

//Draw line between passed set of 2 points
void drawLine(float l,float m, float j, float i)
{
	glBegin(GL_LINES);
	glVertex2f(l,m);
	glVertex2f(j,i);
	glEnd();
	glFlush();
}

//Drawing a point
void drawDot(int l, int m)
{
	glBegin(GL_POINTS);
	glVertex2i(l,m);
	glEnd();
	glFlush();
}


//De Casteljau's algorithm
void deCas()
{
	double t;
	for(t=0;t<=1.0;t=t+0.001)
	{
		currentX=(1-t)*((1-t)*((1-t)*x[0]+t*x[1])+t*((1-t)*x[1]+t*x[2]))+t*((1-t)*((1-t)*x[1]+t*x[2])+t*((1-t)*x[2]+t*x[3]));
		currentY=(1-t)*((1-t)*((1-t)*y[0]+t*y[1])+t*((1-t)*y[1]+t*y[2]))+t*((1-t)*((1-t)*y[1]+t*y[2])+t*((1-t)*y[2]+t*y[3]));
		drawLine(oldX,720-oldY,currentX,720-currentY);
		oldX=currentX;
		oldY=currentY;
	}
}



//Draw points and curve using De Casteljau's
void placeDots(int button, int state, int i, int j)
{
	if(state==GLUT_DOWN)
	{
		if(button==GLUT_LEFT_BUTTON)
		{
			if(q < NO_POINTS)
			{
				x[q]=(int)i;
				y[k]=(int)j;
				drawDot(x[q],720-y[k]);	//Drawing the points clicked by mouse
				//For the first point in bezier
				if(q==0)oldX=x[q];
				if(q==0)oldY=y[q];
				q++;
				k++;
			}
			else if(q == NO_POINTS)
			{
				deCas();
				q++;
			}
		}
	}
}

//Function to intialize all values
int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(1280,720);
	glutInitWindowPosition(0,0);
	glutCreateWindow("De Casteljau's Algorithm");
	glutMouseFunc(placeDots);
 	glutDisplayFunc(display);
 	init();
	glutMainLoop();
	return 0;
}
Не могу сообразить, ввод точек кривой с помощью клавиатуры как в задаче(x1,x2,x3,y1,y2,y3), а не с помощью мыши. В OpenGl нашел функцию void keyboard(unsigned char key, int x, int y), но она тут не совсем подходит.
Gabe_Mccloud вне форума Ответить с цитированием
Старый 14.06.2018, 13:24   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А зачем в задаче ОпенГЛ?

Цитата:
Сообщение от Gabe_Mccloud Посмотреть сообщение
В OpenGl нашел функцию void keyboard(unsigned char key, int x, int y), но она тут не совсем подходит.
Естественно. ОпенГЛ же рисовалка, а не движок.

Цитата:
Сообщение от Gabe_Mccloud Посмотреть сообщение
Не могу сообразить, ввод точек кривой с помощью клавиатуры как в задаче(x1,x2,x3,y1,y2,y3), а не с помощью мыши.
Код:
std::cout << "Input points: ";
std::cin >> x1 >> x2 >> ...;
p51x вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
NURBS и Безье ser70 Общие вопросы C/C++ 1 06.08.2014 11:52
Кривая Безье промежуточные значения Horus92 Помощь студентам 2 17.01.2012 15:23
Кривая Безье. Muaxaxa Общие вопросы Delphi 2 28.11.2011 01:03
Кривая Безье. Muaxaxa Помощь студентам 2 28.11.2011 00:49
Кривая Безье ELL Помощь студентам 4 20.05.2008 22:56