我有一个用于创建Koch曲线的OpenGL程序,但我无法找出找到等边三角形坐标的公式。
请帮助我理解以下代码中的2-3行代码注释。
如果还有其他简单的方法可以找到坐标,请指导我。
#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;
}
答案 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 ++。