2016-08-26 11 views
0

浮動小数点値を使用してOpenGLでベジェ曲線を描画しようとしています。私は多くの異なるコード例を使用しようとしました。下の私の現在のコードは実行されますが、カーブは画面に表示されません。ベジェ曲線を描く通常の方法は、曲線を描くにはGLUORTHO2D()関数を使用することを意味する整数値を使用します。しかし、浮動小数点値を使ってカーブを描きたい。 x range(-1,1)およびy range(-1,1)などです。浮動小数点値を使用してOpenGLでベジェ曲線を描画する方法

if x=(500)のようになると考えてください。(-1 to 1)if y=(800)と考えてください。(-1,1)です。

私はすでに整数値を使ってみましたが、それは私のために働いていました。整数値を使用して私のコードは以下のとおりです:

#include <GL/glut.h> 
#include <math.h> 
#include <stdio.h> 
#define CTRL_COUNT 100 
int ctrlPointsCount; 
int ctrlPointsX[CTRL_COUNT], ctrlPointsY[CTRL_COUNT]; 
int X1[3]={20,25,20}, Y1[3]={5,24,38}; //first point(x1[0],y1[0]) second(x1[1],y1[1]) third(x1[2],y1[2]) 

void myInit() 
{ 
glClearColor(0.0,0.0,0.0,0.0); 
glColor3f(1.0,0.0,0.0); 
glPointSize(8.0); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(0.0,128.0,0.0,96.0); 
} 
//p(t)=(1-t)^3*p0+3t(1-t)^2*p1+3t^2(1-t)p2+t^3p3 
float getNextBezierPointX(float t) 
{ 
float x=0.0; 

for(int i=0; i<ctrlPointsCount; i++) 
{ 
int c; 
if(i==0 || i==ctrlPointsCount-1) 
    c = 1; 
else 
{ 
    c = ctrlPointsCount-1; 
} 
x += c * pow(t, i) * pow(1-t, ctrlPointsCount-1-i) * ctrlPointsX[i]; 
} 


return x; 
} 

float getNextBezierPointY(float t) 
{ 
float y=0.0; 

for(int i=0; i<ctrlPointsCount; i++) 
{ 
int c; 
if(i==0 || i==ctrlPointsCount-1) 
    c = 1; 
else 
{ 
    c = ctrlPointsCount-1; 
} 
y += c * pow(t, i) * pow(1-t, ctrlPointsCount-1-i) * ctrlPointsY[i]; 
} 



return y; 
} 
void drawline() 
{ 
// draw control points using red color 
for(int i=0; i < 3; i++) 
{ 
glBegin(GL_POINTS); 
glVertex2i(ctrlPointsX[i], ctrlPointsY[i]); 
glEnd(); 
glFlush(); 
} 
// draw bezier curve using control poitns by calculating next points using   cubic bezier curve formula 
float oldX=ctrlPointsX[0], oldY=ctrlPointsY[0]; 
for(double t = 0.0;t <= 1.0; t += 0.01) { 

float x = getNextBezierPointX(t); 
float y = getNextBezierPointY(t); 
//glColor3f(1.0,t,1.0); 
glColor3f(1.0,1.0,1.0); 
glBegin(GL_LINES); 
glVertex2f(oldX, oldY); 
glVertex2f(x, y); 
glEnd(); 
glFlush(); 

oldX = x; 
oldY = y; 
} 
} 

void myDisplay() 
{ 
glClear(GL_COLOR_BUFFER_BIT); 
glColor3f(1.0,0.0,0.0); 
ctrlPointsCount=3; 
for(int i=0;i<3;i++) 
{ 
ctrlPointsX[i] = X1[i]; 
ctrlPointsY[i] = Y1[i]; 
} 
drawline(); 


glFlush(); 
} 


int main(int argc, char *argv[]) 
{ 

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
glutInitWindowSize(640,480); 
glutInitWindowPosition(100,150); 
glutCreateWindow("Bezier Curve"); 
glutDisplayFunc(myDisplay); 
myInit(); 
glutMainLoop(); 
return 0; 
} 

私は浮動小数点値を使用しようとすると、私のために動作しません。画面上の曲線は表示されません。浮動小数点値を使用して私のコードは以下の通りです:

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <GL/glut.h> 
using namespace std; 
#define CTRL_COUNT 100 

int ctrlPointsCount; 
int ctrlPointsX[CTRL_COUNT], ctrlPointsY[CTRL_COUNT]; 
double X1[3] = { 0.26015037593985, 0.43609022556391, 0.6 }, Y1[3] = {   0.946875, 0.884375, 0.946875 }; 
//Initializes 3D rendering 
void initRendering() { 
glEnable(GL_DEPTH_TEST); 
} 
float getNextBezierPointX(float t) 
{ 
float x = 0.0; 

for (int i = 0; i<ctrlPointsCount; i++) 
{ 
int c; 
if (i == 0 || i == ctrlPointsCount - 1) 
    c = 1; 
else 
{ 
    c = ctrlPointsCount - 1; 
} 
x += c * pow(t, i) * pow(1 - t, ctrlPointsCount - 1 - i) *  ctrlPointsX[i]; 
} 

return x; 
} 
float getNextBezierPointY(float t) 
{ 
float y = 0.0; 
for (int i = 0; i<ctrlPointsCount; i++) 
{ 
int c; 
if (i == 0 || i == ctrlPointsCount - 1) 
    c = 1; 
else 
{ 
    c = ctrlPointsCount - 1; 
} 
y += c * pow(t, i) * pow(1 - t, ctrlPointsCount - 1 - i) *  ctrlPointsY[i]; 
} 
return y; 
} 
void drawline() 
{ 
// draw control points using red color 
for (int i = 0; i < 3; i++) 
{ 
glBegin(GL_POINTS); 
glVertex2i(ctrlPointsX[i], ctrlPointsY[i]); 
glEnd(); 
glFlush(); 
} 
// draw bezier curve using control poitns by calculating next points using   cubic bezier curve formula 
float oldX = ctrlPointsX[0], oldY = ctrlPointsY[0]; 
for (double t = 0.0; t <= 1.0; t += 0.01) 
     { 
float x = getNextBezierPointX(t); 
float y = getNextBezierPointY(t); 
//glColor3f(1.0,t,1.0); 
glColor3f(1.0, 1.0, 1.0); 
glBegin(GL_LINES); 
glVertex2f(oldX, oldY); 
glVertex2f(x, y); 
glEnd(); 
glFlush(); 
oldX = x; 
oldY = y; 
} 
} 
//Called when the window is resized 
void handleResize(int w, int h) { 
glViewport(0, 0, w, h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45.0, (double)w/(double)h, 1.0, 200.0); 
} 
float _angle = 0.0; 
float _cameraAngle = 0.0; 
float _ang_tri = 0.0; 
//Draws the 3D scene 
void drawScene() { 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); //Reset the drawing perspective 
ctrlPointsCount = 3; 
for (int i = 0; i<3; i++) 
{ 
ctrlPointsX[i] = X1[i]; 
ctrlPointsY[i] = Y1[i]; 
} 
drawline(); 
glutSwapBuffers(); 
} 
void update(int value) { 
_angle += 2.0f; 
if (_angle > 360) { 
_angle -= 360; 
} 
_ang_tri += 2.0f; 
if (_ang_tri > 360) { 
_ang_tri -= 360; 
} 
glutPostRedisplay(); //Tell GLUT that the display has changed 
//Tell GLUT to call update again in 25 milliseconds 
glutTimerFunc(25, update, 0); 
} 
int main(int argc, char** argv) { 
//Initialize GLUT 

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(1331, 641); 
glutInitWindowPosition(0, 0); 

//Create the window 
glutCreateWindow("Our cg project"); 
initRendering(); 

//Set handler functions 
glutDisplayFunc(drawScene); 

glutReshapeFunc(handleResize); 

glutTimerFunc(25, update, 0); //Add a timer 

glClearColor(0.0, 0.7, 1.5,0.0); 

glutMainLoop(); 
return 0; 
} 

答えて

1

問題は、このここにある:

int ctrlPointsX[CTRL_COUNT], ctrlPointsY[CTRL_COUNT]; 
double X1[3] = { 0.26015037593985, 0.43609022556391, 0.6 }, Y1[3] = {0.946875, 0.884375, 0.946875 }; 

for (int i = 0; i<3; i++) 
{ 
ctrlPointsX[i] = X1[i]; 
ctrlPointsY[i] = Y1[i]; 
} 

ctrlPointsXctrlPointsYは整数値のみを保持することができます。したがって、ctrlPointsX[i] = X1[i]ctrlPointsY[i] = Y1[i]を実行すると、浮動小数点数を整数に変換することになります。

double ctrlPointsX[CTRL_COUNT], ctrlPointsY[CTRL_COUNT]; 
double X1[3] = { 0.26015037593985, 0.43609022556391, 0.6 }, Y1[3] = {0.946875, 0.884375, 0.946875 }; 

これはあなたの問題を解決する必要があります。だから、すべての制御点は、あなたがあまりにもdouble型として制御点の配列を宣言する必要が0

になります。

+0

thanks.itが私のために働いています(もう一度ありがとう) – nayan

関連する問題