非递归实现Julia科赫曲线绘制失败,寻求技术帮助
非递归科赫曲线的问题修正(Julia实现)
问题分析
你的代码存在三个核心错误:
- 三等分点计算错误:
seg_points函数的点计算逻辑偏离线段三等分的数学定义,导致分段点位置完全错误。 - 迭代点集构造错误:
koch_curve函数直接将新点追加到原数组末尾,未维护折线的顺序,最终点集混乱无法形成正确分形。 - 尖点计算逻辑偏差:
polygon函数的向量旋转逻辑需调整,以匹配科赫曲线等边三角形尖点的构造规则。
修正后的代码
1. 线段三等分函数(修正版)
function seg_points(startPoint, endPoint, n=3) mids = [] vec = endPoint - startPoint # 计算起点到终点的方向向量 for i in 1:n-1 # 从起点出发,按比例移动生成三等分点 push!(mids, startPoint + (i/n) * vec) end return mids end
2. 尖点计算函数(修正版)
function polygon(p1, p2) vec = p2 - p1 # 获取当前线段的向量 # 逆时针旋转60度的旋转矩阵计算 rotated_vec = [vec[1]*cos(π/3) - vec[2]*sin(π/3), vec[1]*sin(π/3) + vec[2]*cos(π/3)] # 从p1出发,加上旋转后的向量得到等边三角形尖点 return p1 + rotated_vec end
3. 分形点集生成函数(修正版)
function koch_curve(order::Int, startPoint = [0.0,0.0], endPoint = [1.0,0.0]) pts = [startPoint, endPoint] for _ in 1:order new_pts = [] # 遍历每一段线段,替换为科赫曲线的分段结构 for j in 2:length(pts) a = pts[j-1] b = pts[j] c, d = seg_points(a, b) # c为1/3点,d为2/3点 e = polygon(c, d) # 生成等边三角形尖点 # 按顺序添加分段点:a → c → e → d push!(new_pts, a, c, e, d) end # 添加最后一个终点,完成当前迭代的点集 push!(new_pts, pts[end]) # 更新点集为当前迭代后的结果 pts = new_pts end return pts end
验证与使用
可以用Plots.jl绘制修正后的曲线:
using Plots pts = koch_curve(5) plot(getindex.(pts,1), getindex.(pts,2), legend=false, axis=:equal)
此时order=5的曲线会符合科赫分形的预期形态。
内容的提问来源于stack exchange,提问作者Milo
相关产品推荐
相关产品推荐

