3

for example,In the following code, in the function “glVertex3f”, a constant between 1 and-1 is used to represent a point

glBegin(GL_LINES); { glColor3ub(255, 0, 0); glVertex3f(-1,0,0);glVertex3f(1,0,0); } 

But most of the time, we use ‘variables’ more often. Suppose the width of the window is 450, and half of it is 225. The parameter input range is between 0 and 225, and when we enter an integer according to this interval, I expect to get a proportional decimal value and use this decimal value to draw a straight line.

void DrawLine(GLint ix, GLint iy,GLint ia,GLint ib) { GLfloat width = 225; GLfloat x, y, z; GLfloat a, b, c; x = (GLfloat)(ix / width); y = (GLfloat)(iy / width); z = 0.2; a = (GLfloat)(ia / width); b = (GLfloat)(ib / width); c = 0.2; glBegin(GL_LINES); { glColor3ub(255, 0, 0); glVertex3f(x, y, z); glVertex3f(a, b, c); } glEnd(); } 

The above program doesn’t work at all. Please tell me what the problem is.

1 Answer 1

2

ix / width is an integral division You have to cast ix to a float, to do a floation point division:

x = (GLfloat)(ix) / (GLfloat)(width); 

Normalized device coordinates are in range [-1.0, 1.0]. There for the conversion from NDC to window coordinates is:

x = (GLfloat)(ix) / (GLfloat)(width) * 2.0f - 1.0f; 

However, I recommend to use an Orthographic projection which maps window coordinates to NDC:

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, 0, width, -1, 1); 

With this projection matrix you can use the integral window coordinates (ix, iy, ...) directly.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.