求科赫曲线中等边三角形顶部顶点坐标的数学方法及代码解析
科赫曲线中等边三角形顶点坐标解析与代码注释
我来帮你拆解这段OpenGL科赫曲线代码里的核心逻辑,先给你补全并注释完整代码,再解析顶点计算的原理,最后分享更简便的求解方法。
注释后的完整代码
#include<iostream> using namespace std; #include<math.h> #include<GL/glut.h> // 预定义sin60°≈0.866(即√3/2)和cos60°=0.5,用于旋转向量的计算 #define SIN 0.866 #define COS 0.5 int n; // 科赫曲线的迭代次数 // 初始线段的两个端点:从屏幕左侧(0,200)到右侧(550,200) int X1=0,X2=550,Y1=200,Y2=200; // 递归绘制科赫曲线的核心函数 // 参数:当前线段的起点(x1,y1)、终点(x2,y2)、剩余迭代次数n void Koch(int x1, int y1, int x2, int y2, int n) { // 迭代次数为0时,直接绘制当前线段(递归终止条件) if(n == 0) { glBegin(GL_LINES); glVertex2i(x1, y1); // 线段起点 glVertex2i(x2, y2); // 线段终点 glEnd(); } else { // 计算当前线段的横向、纵向长度差 int dx = x2 - x1; int dy = y2 - y1; // 计算线段三等分后的两个分点 int x3 = x1 + dx/3; // 第一个分点C(线段1/3处) int y3 = y1 + dy/3; int x4 = x1 + 2*dx/3; // 第二个分点D(线段2/3处) int y4 = y1 + 2*dy/3; // 计算等边三角形顶部顶点E的坐标 // 核心逻辑:把向量CD(从C到D)逆时针旋转60°,再叠加到C点坐标上 // 旋转公式:向量(a,b)逆时针转θ后为(a*cosθ - b*sinθ, a*sinθ + b*cosθ) // 这里向量CD的坐标是(dx/3, dy/3),代入60°的三角函数值 int x5 = x3 + (dx/3)*COS - (dy/3)*SIN; int y5 = y3 + (dx/3)*SIN + (dy/3)*COS; // 递归绘制四段曲线:AC、CE、ED、DB Koch(x1, y1, x3, y3, n-1); Koch(x3, y3, x5, y5, n-1); Koch(x5, y5, x4, y4, n-1); Koch(x4, y4, x2, y2, n-1); } } // OpenGL的显示回调函数,负责绘制画面 void display() { glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓冲区 glColor3f(1.0, 1.0, 1.0); // 设置绘制颜色为白色 Koch(X1, Y1, X2, Y2, n); // 调用科赫曲线绘制函数 glFlush(); // 刷新绘图命令 } // 主函数:初始化GLUT环境并启动程序 int main(int argc, char** argv) { cout<<"请输入迭代次数n: "; cin>>n; glutInit(&argc, argv); // 初始化GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式(单缓冲、RGB颜色) glutInitWindowSize(600, 400); // 设置窗口大小 glutInitWindowPosition(100, 100); // 设置窗口初始位置 glutCreateWindow("Koch Curve"); // 创建窗口,标题为"Koch Curve" glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景色为黑色 gluOrtho2D(0, 600, 0, 400); // 设置2D正交投影区域(适配窗口大小) glutDisplayFunc(display); // 注册显示回调函数 glutMainLoop(); // 启动GLUT事件循环 return 0; }
等边三角形顶点计算逻辑解析
代码里计算顶点(x5,y5)的核心是向量旋转:
- 首先把目标线段
AB三等分,得到C(1/3处)和D(2/3处),这两个点之间的线段就是要替换成等边三角形的边。 - 向量
CD的坐标是(dx/3, dy/3)(dx是线段AB的横向差,dy是纵向差)。 - 要得到等边三角形的顶点,我们需要把向量
CD绕C点逆时针旋转60°(如果想向下绘制三角形,把SIN改成负的即可)。 - 60°的三角函数值是固定的:
cos60°=0.5,sin60°=√3/2≈0.866,代入旋转公式就得到了x5和y5的计算式。
更简便的坐标求解方法
除了向量旋转,还可以用中点+垂直偏移的方法直接计算,逻辑更直观:
- 先找到线段
AB的中点(midX, midY),也就是((x1+x2)/2, (y1+y2)/2)。 - 计算等边三角形的高:因为替换的线段长度是
AB/3,所以高为(√3/2)*(AB长度/3) = AB长度*√3/6。 - 找到垂直于线段
AB的方向(向上或向下),把中点向这个方向移动高的距离,就得到等边三角形的顶点。
代码实现示例:
// 用中点+垂直偏移计算E点 double dx = x2 - x1; double dy = y2 - y1; double lineLen = sqrt(dx*dx + dy*dy); // 线段AB的长度 double midX = (x1 + x2) / 2.0; double midY = (y1 + y2) / 2.0; double height = lineLen * sqrt(3) / 6; // 等边三角形的高 // 垂直于AB的单位向量(向上方向) double perpX = -dy / lineLen; double perpY = dx / lineLen; // 计算顶点E的坐标 int x5 = midX + perpX * height; int y5 = midY + perpY * height;
这个方法不需要计算三等分点,直接通过线段两端点就能得到顶点,代码更简洁,逻辑也更容易理解。
内容的提问来源于stack exchange,提问作者NiRaj Wagh
相关产品推荐
相关产品推荐

