在koch曲线中找到等边三角形顶点坐标的算法是什么

时间:2018-04-05 19:23:22

标签: opengl graphics

  1. 我有一个用于创建Koch曲线的OpenGL程序,但我无法找出找到等边三角形坐标的公式。

  2. 请帮助我理解以下代码中的2-3行代码注释。

  3. 如果还有其他简单的方法可以找到坐标,请指导我。

  4. #include<iostream>
    using namespace std;
    #include<math.h>
    #include<GL/glut.h>
    #define SIN 0.866
    #define COS 0.5
    
    int n;
    int X1=0,X2=550,Y1=200,Y2=200;
    
    void Koch(int X1, int Y1, int X2, int Y2,int m)
    {
        int xx,yy,x[5],y[5],lx,ly;
        lx=(X2-X1)/3;
        ly=(Y2-Y1)/3; 
        x[0]=X1;
        y[0]=Y1;
        x[4]=X2;
        y[4]=Y2;
        x[1]=x[0]+lx;
        y[1]=y[0]+ly;
        x[3]=x[0]+2*lx;
        y[3]=y[0]+2*ly;
        xx=x[3]-x[1];
        yy=y[3]-y[1];
        x[2]=xx*(0.5) + yy*(SIN);    // What does this line mean
        y[2]=-xx*(SIN)+yy*(0.5);
        x[2]=x[2]+x[1];
        y[2]=y[2]+y[1];
    
        if(m>0)
        {
            Koch(x[0],y[0],x[1],y[1],m-1);
            Koch(x[1],y[1],x[2],y[2],m-1);
            Koch(x[2],y[2],x[3],y[3],m-1);
            Koch(x[3],y[3],x[4],y[4],m-1); 
        }       
        else
        {
            glBegin(GL_LINES);
            glVertex2d(x[0],(y[0]));
            glVertex2d(x[1],(y[1]));
            glEnd();
            glBegin(GL_LINES);
            glVertex2d(x[1],(y[1]));
            glVertex2d(x[2],(y[2]));
            glEnd();            
            glBegin(GL_LINES);
            glVertex2d(x[2],(y[2]));
            glVertex2d(x[3],(y[3]));
            glEnd();            
            glBegin(GL_LINES);
            glVertex2d(x[3],(y[3]));
            glVertex2d(x[4],(y[4]));
            glEnd();            
        }
    }
    
    void MyDisplay()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0,1.0,1.0);
        Koch(X1,Y1,X2,Y2,2);
        glFlush();
    }
    
    void MyInit()
    {
        glClearColor(0.0,0.0,0.0,1.0);
        glColor3f(1.0,1.0,0.0);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0 , 640 , 480 , 0);
    }
    
    int main(int argc,char **argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowPosition(0,0);
        glutInitWindowSize(640,480);
        glutCreateWindow("Koch Curve");
        MyInit();
        glutDisplayFunc(MyDisplay);
        glutMainLoop();
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

SIN大约等于数学的sin函数sin(60)。 COS等于cos(60)的数学cos函数。为了解决这个问题,我在#define中对值进行了ArcSin和ArcCos。

一种思考罪和cos的方法对我有用,就是当你用一个小数乘以一个小数(如0.866)时,你占了这个数字的86.6%。因此,当你取一个x值并将其乘以cos和y值并乘以sin时,x和/或y值可以略微上升/下降,这就是你如何使用sin和cos制作一个圆圈。 (这个解释可能对所有人都不起作用,但对我的理解有用)。

至于算法的效率,我不确定,因为我没有运行您的代码,但您可以查看this。它包含一个算法(在Python中),但可以转换为C ++。