I have drawn a circle in OpenGL. What I would like to do is to repeatedly show a part of it. For example, instead of showing just one circle, showing 4 of half circle continuously. I thought it is possible by having two for loops and using a glViewport(parameters) inside. But I failed to do it so.
I have my code here, the for loops are at beginning of circle() function. I would appreciate if someone can help me on this.
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <fstream>
using namespace std;
int pntX1, pntY1, r;
void myInit()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(4.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 101.0, 0.0, 101.0);
}
void drawPolyLineFile(char * fileName)
{
fstream inStream;
inStream.open(fileName, ios::in);
if (inStream.fail())
return;
glClear(GL_COLOR_BUFFER_BIT);
GLint numpolys, numlines, x, y;
inStream >> numpolys;
for (int j = 0; j < numpolys; j++)
{
inStream >> numlines;
glBegin(GL_LINE_STRIP);
for (int i = 0; i < numlines; i++)
{
inStream >> x >> y;
glVertex2i(x, y);
}
glEnd();
}
glFlush();
inStream.close();
}
void writePixel(GLint x, GLint y)
{
glBegin(GL_POINTS);
glVertex2i(x + pntX1, y + pntY1);
glEnd();
}
void circlePoints(int x, int y) {
writePixel(x, y);
writePixel(y, x);
writePixel(y, -x);
writePixel(x, -y);
writePixel(-x, -y);
writePixel(-y, -x);
writePixel(-y, x);
writePixel(-x, y);
}
void setWindow(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(left, right, bottom, top);
}
void setViewPort(GLint left, GLint right, GLint bottom, GLint top)
{
glViewport(left, bottom, right - left, top - bottom);
}
void Circle() {
//int x1=100,y1=100,r=50;
//int x=0,y=r;
//int d = 3/2 - r;
//glViewport(50, 50, 50, 50);
/*
setWindow(0.0, 101.0, 0.0, 101.0);
for (int i = 0; i<1; i++)
for (int j = 0; j < 1; j++)
{
//glViewport(i * 50 +, j * 50, 50, 50);
glViewport(50, 50, 50, 50);
drawPolyLineFile("dino.dat");
}
*/
//glViewport(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0, 0);
int x = 0;
int r = 50;
int y = r;
int h = (1 - r);
int deltaE = 3;
int deltaSE = (-2)*r + 5;
circlePoints(x, y);
while (y > x) {
if (h<0) {
h += deltaE;
deltaE += 2;
deltaSE += 2;
}
else {
h += deltaSE;
deltaE += 2;
deltaSE += 4;
y--;
}
x++;
circlePoints(x, y);
}
}
void Display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glPointSize(1.0);
Circle();
glFlush();
}
int main(int argc, char *argv[])
{
pntX1 = 50; pntY1 = 50; r = 50;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(101, 101.0);
glutInitWindowPosition(100, 150);
glutCreateWindow("My circles");
//glViewport(0, 0, 100, 100);
/*
setWindow(0, 500.0, 0, 500.0);
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
{
glViewport(i*250, j*250, 250, 250);
//drawPolylineFile("circles.dat");
}
*/
glutDisplayFunc(Display);
myInit();
glutMainLoop();
return 0;
}