You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求科赫曲线中等边三角形顶部顶点坐标的数学方法及代码解析

科赫曲线中等边三角形顶点坐标解析与代码注释

我来帮你拆解这段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)的核心是向量旋转:

  1. 首先把目标线段AB三等分,得到C(1/3处)和D(2/3处),这两个点之间的线段就是要替换成等边三角形的边。
  2. 向量CD的坐标是(dx/3, dy/3)(dx是线段AB的横向差,dy是纵向差)。
  3. 要得到等边三角形的顶点,我们需要把向量CD绕C点逆时针旋转60°(如果想向下绘制三角形,把SIN改成负的即可)。
  4. 60°的三角函数值是固定的:cos60°=0.5,sin60°=√3/2≈0.866,代入旋转公式就得到了x5和y5的计算式。

更简便的坐标求解方法

除了向量旋转,还可以用中点+垂直偏移的方法直接计算,逻辑更直观:

  1. 先找到线段AB的中点(midX, midY),也就是((x1+x2)/2, (y1+y2)/2)。
  2. 计算等边三角形的高:因为替换的线段长度是AB/3,所以高为(√3/2)*(AB长度/3) = AB长度*√3/6。
  3. 找到垂直于线段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:21:13