c++ - 在 openGL 中绘制一个 9 点圆?

标签 c++ opengl

我正在尝试为我的 openGL 类项目绘制一个 9 点圆,有问题吗?我的老师几乎没有教过我们如何用圆圈做任何事情。他给了我们关于如何“绘制”三角形的代码,并告诉我们找到普通圆的顶点和中心点的公式是什么。但是从来没有涉及过如何使用它们进行编码,尤其是他希望我们这样做的方式。他告诉我们使用

class GLintPoint {
public:
GLint x, y;
};

我们可以将它们命名为 A、B、C,然后找到顶点 a = B - A。我假设这将是 a.x = B.x - A.x,原因相同,但我不确定。他因为医疗原因不得不离开(我假设是手术),所以我不能问他,他仍然要在本周末到期。

他在离开前给了我们这个代码。

#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include "canvas.h"

const int screenWidth = 640;
const int screenHeight = 480;

Canvas cvs(screenWidth, screenHeight, "Relative Drawing Example", 1);



class GLintPoint {
public:
GLint x, y;
};

#define NUM 3
static GLintPoint List[NUM];

// myInit

void myInit(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble )screenWidth, 0.0, (GLdouble)screenHeight);
}

// myDisplay
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}

void mykey(unsigned char key, int x, int y)
{
if (key == 'Q' || key == 'q') exit(0);
}



// draw arc 

void draw_arc(GLdouble cx, GLdouble cy, GLdouble r, GLdouble startAngle,
GLdouble sweepAngle)
{
glBegin(GL_LINE_STRIP);
for (GLdouble t = startAngle; t < startAngle+sweepAngle; t += 0.001)
{
    GLdouble x = cx + r*cos(DEG2RAD*t);
    GLdouble y = cy + r*sin(DEG2RAD*t);
    glVertex2d(x, y);
}
glEnd();
}  


// myMouse

void myMouse(int button, int state, int x, int y)
{

static int last = -1;



if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && last < (NUM -1))
{
    List[++last].x = x;
    List[  last].y = screenHeight - y;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINE_STRIP);
        for (int i = 0; i <= last; i++) {           
    if(last <=0){
    cvs.moveTo(List[i].x, List[i].y);       
    }
    else
    cvs.lineTo(List[i].x, List[i].y);
    }
    int i = 0;
    cvs.lineTo(List[i].x, List[i].y);
    glEnd();
    glFlush();
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
    last = -1;

GLintPoint a.x = 

}

// main



int main(int argc, char ** argv)
{ 
//glutInit(&argc, argv);
//glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);
//glutInitWindowSize(screenWidth, screenHeight);
//glutInitWindowPosition(100, 150);
//glutCreateWindow("case study 4.2");
glutDisplayFunc(myDisplay);
glutMouseFunc(myMouse);
glutKeyboardFunc(mykey);
myInit();
glutMainLoop();
return 0;
}

#include <math.h>
// define some ascii key names
#define GLUT_KEY_ESC 27

// Keeps track of a single point ( turtle position )
class Point2d {
public:
Point2d() { x = y = 0.0f; }
Point2d( float xx, float yy ) { x = xx; y = yy; }
void set( float xx, float yy ) { x = xx; y = yy; }
void setX( float xx ) { x = xx; }
void setY( float yy ) { y = yy; }
float getX() { return x; }
float getY() { return y; }
void draw( void ) { glBegin( GL_POINTS );
                    glVertex2f( (GLfloat)x, (GLfloat)y );
                    glEnd();
                  }
private:
float x, y;
};

//Data type for an array of points
class Point2dArray {
 static const int MAX_NUM = 100;
 public:
    int num;
Point2d pt[MAX_NUM];
};

class IntRect {
public:
 IntRect() { l = 0; r = 100; b = 0; t = 100; }
 IntRect( int left, int right, int bottom, int top )
    { l = left; r = right; b = bottom; t = top; }
 void set( int left, int right, int bottom, int top )
    { l = left; r = right; b = bottom; t = top; }
 void draw( void ) { glRecti( l, b, r, t ); }
 int getL() { return l; }
 int getR() { return r; }
 int getT() { return t; }
 int getB() { return b; }

  private:
   int l, r, b, t;
 };

class RealRect {
public:
RealRect() { l = 0; r = 100; b = 0; t = 100; }
RealRect( float left, float right, float bottom, float top )
    { l = left; r = right; b = bottom; t = top; }
void set( float left, float right, float bottom, float top )
    { l = left; r = right; b = bottom; t = top; }
void draw( void ) { glRectf( l, b, r, t ); }
float ratio( void ) { return (r - l)/(t - b); }
float getL() { return l; }
float getR() { return r; }
float getT() { return t; }
float getB() { return b; }

  private:
   float l, r, b, t;
};

class Canvas {
public:
Canvas( int width, int height, char* windowTitle, int buffer );
void setWindow( float l, float r, float b, float t );
void setViewport( int w, int h );
void autoSetWindow(void);

 float getWindowAspectRatio( void );

 void lineTo( float x, float y );
 void lineTo( Point2d p );
void moveTo( float x, float y );
void moveTo( Point2d p );
void turnTo( float angle );
void turn( float angle );
void forward( float dist, int visible );
int getWinId(void);
void initCT(void);
void scale2D(double, double);
void translate2D(double, double);
void rotate2D(double);

  private:
  Point2d CP;
  float CD;
  IntRect viewport;
  RealRect window;
  int winId;
  float delx, dely;
  char code1, code2;
  char formCode(Point2d p);
  void chopLine(Point2d &p, char c);
  int clipSegment(Point2d &p1, Point2d &p2);
  };

Canvas::Canvas( int width, int height, char* windowTitle, int buffer = 1 ) {
 char* argv[1];
 char dummyString[1];
 argv[0] = dummyString;
 int argc = 1;

 glutInit( &argc, argv );

 glutInitDisplayMode( ((buffer == 1) ? GLUT_SINGLE : GLUT_DOUBLE) | GLUT_RGB );
 glutInitWindowSize( width, height );
 glutInitWindowPosition( (1024 - width) / 2, (768 - height) / 2 );
 winId = glutCreateWindow( windowTitle );
 setWindow( 1000.0f, -1000.0f, 1000.0f, -1000.0f );
 CP.set( 0.0f, 0.0f );
 CD = 0.0f;
 }  

int Canvas::getWinId(void)
{
  return winId;
}

float Canvas::getWindowAspectRatio(void)
{
  return (window.getR() - window.getL())/(window.getT() - window.getB());
}

void Canvas::setWindow( float l, float r, float b, float t ) {
window.set( l, r, b, t );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D( (GLdouble) l, (GLdouble) r, (GLdouble) b, (GLdouble) t );
}

void Canvas::autoSetWindow(void) {
float l = window.getL();
float r = window.getR();
float b = window.getB();
float t = window.getT();

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D( (GLdouble) l, (GLdouble) r, (GLdouble) b, (GLdouble) t);
}

void Canvas::setViewport( GLsizei width, GLsizei height) {
float aspectRatio = getWindowAspectRatio();
GLint l, b;
GLsizei w, h;

 if ((float) width / (float) height >= aspectRatio) {
l = (GLint) ((width - height * aspectRatio)/2.0);
    b = 0;
    w = (GLsizei) (height * aspectRatio);
h = height;
   }
   else {
    l = 0;
b = (int) ((height - width / aspectRatio)/2.0);
w = width;
    h = (GLsizei) (width / aspectRatio);
    }
    glViewport( l, b, w, h );
    }

void Canvas::lineTo( float x, float y ) {
glBegin( GL_LINES );
glVertex2f( (GLfloat) CP.getX(), (GLfloat) CP.getY() );
glVertex2f( (GLfloat) x, (GLfloat) y );
glEnd();
CP.set( x, y );
glFlush();
}

void Canvas::lineTo( Point2d p ) {
glBegin( GL_LINES );
glVertex2f( (GLfloat) CP.getX(), (GLfloat) CP.getY() );
glVertex2f( (GLfloat) p.getX(), (GLfloat) p.getY() );
glEnd();
CP.set( p.getX(), p.getY() );
glFlush();
}

void Canvas::moveTo( float x, float y ) {
CP.set( x, y );
}

void Canvas::moveTo( Point2d p ) {
CP.set( p.getX(), p.getY() );
}

void Canvas::turn(float angle) {
CD += angle;
}

void Canvas::turnTo(float angle) {
CD = angle;
}

void Canvas::forward( float dist, int visible ) {
 const float RadPerDeg=0.017453393;
float x = CP.getX()+dist*cos(RadPerDeg*CD);
float y = CP.getY()+dist*sin(RadPerDeg*CD);
float l = window.getL();
float r = window.getR();
float b = window.getB();
float t = window.getT();

 l = (x < l)?x:l;
 r = (x > r)?x:r;
 b = (y < b)?y:b;
 t = (y > t)?y:t;
 window.set(l, r, b, t);
 if (visible)
lineTo(x, y);
 else 
moveTo(x, y);
 }

还有这些公式。就像他给我的那张纸上写的一样 a = B -A b = C - B c - A - C

c = A = 1/2((a + ((b(dot product) c)/(matrix of a (dotproduct)c)) * (matrix of a))

r = (magnitude of a)/2 squareroot(((b(dot product) c)/(matrix of a (dotproduct)c))^2 +          1)

我不想问,但我知道当我不知所措时,任何人都可以对他要我做的事情做出正面或反面的判断吗?或者任何人都可以指导我如何制作 9 点圆的正确方向吗?它占我期末成绩的 10%,所以我不要求代码只是复制/粘贴“我该怎么做?”这就是我要问的。

最佳答案

您不能真正在 OpenGL 中绘制曲线,只能绘制多边形。因此,如果有人让我在 OpenGL 中绘制一个九点圆,我会假设他们的意思是一个有 9 条边的多边形,其中每个点都沿着圆的周边均匀分布。

关于c++ - 在 openGL 中绘制一个 9 点圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15342391/

相关文章:

c++ - 如何在不友好或声明指针的情况下在类主体中转发声明未嵌套的类

c++ - 变量赋值

c++ - OpenGL 3.3 投影矩阵错误

java - 如果简单的数组可以工作,为什么还要在 OpenGL (LWJGL) 中使用缓冲区?

java - LWJGL OpenGL黑屏

c++ - 在 OpenGL 中向 3D 对象添加光源

c++ - glGetFloatv 导致堆栈粉碎

c++ - 运行时错误,可能是输入问题?

python - Opencv 级联分类而不是检测

c++ - 如何获得与Python中相同的系统时间?