代码之家  ›  专栏  ›  技术社区  ›  Muddy

切割圆的底面

  •  2
  • Muddy  · 技术社区  · 6 年前
    // #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 回复  |  直到 6 年前
        1
  •  1
  •   Rabbid76    6 年前

    如果你想用 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));
    }