切圆的底面

时间:2018-12-08 18:06:16

标签: c++ visual-studio opengl

// #include loads up library files, the order can matter
// generally load glut.h last
#include <stdio.h> // this library is for standard input and output
#include "glut.h"// this library is for glut the OpenGL Utility Toolkit
#include <math.h>

// this is the initialisation function, called once only
void init() {
    glClearColor(0.0, 0.0, 1.0, 0.0); // set what colour you want the background to be
    glMatrixMode(GL_PROJECTION); // set the matrix mode, we will look at this later
                             // set the projection window size in x an y.
    gluOrtho2D(0.0, 500, 0.0, 500.0);
}

// this is the display function it is called when ever you want to draw something
// all drawing should be called form here
void circle() {
    // draw circle
    float theta;
    glClear(GL_COLOR_BUFFER_BIT); // clear the screen using the background colour
    glBegin(GL_POLYGON);
    glColor3f(1.0, 0.0, 0.0); // set colour to red
    for (int i = 0; i < 320; i++) {
        theta = i * 3.142 / 180;
        glVertex2f(190 + 50 * cos(theta), 250 + 70 * sin(theta));
    }
    glEnd();
    glFlush(); // force all drawing to finish
}

// this has the effect of repeatedly calling the display function
void display() {
    circle();
}

// as with many programming languages the main() function is the entry point for execution of the program
int main(int argc, char** argv) {
    glutInit(&argc, argv); //perform the GLUT initialization
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // more initialisation
    glutInitWindowSize(800, 600); // set window position
    glutInitWindowPosition(0, 0); // set window size
    glutCreateWindow("Circle"); // create a display with a given caption for the title bar
    init(); // call init function defined above
    glutDisplayFunc(display); // define what function to call to draw
                       // the last function in the program puts the program into infinite loop
    glutMainLoop();
    // this line exits the program
    return 0;
}

我添加了注释,以便您理解我的代码。该代码创建了一个大的红色圆圈,并切下了该圆圈的右下角,但我只想切下该底侧。我该如何实现?我真的很感谢您的帮助。

赞:

circle

1 个答案:

答案 0 :(得分:1)

如果要用Secant line切圆,则必须定义一个起始角度和一个终止角度,并指定从圆上的点开始的顶点坐标,并以结束角。

Full angle具有360度(2 * PI弧度)。底部(南部)的角度为-90度。

如果要在圆的底部切割一部分,则可以这样计算起点和终点角度:

int cutsegment = 45;
int start = -90 + cutsegment / 2;
int end   = 270 - cutsegment / 2;

for (int i = start; i <= end; i++) {
    theta = i * 3.142 / 180;
    glVertex2f(190 + 50 * cos(theta), 250 + 70 * sin(theta));
}