如何用GNU Octave在环面上实现K5的平面嵌入?
在环面上实现K5完全图嵌入(GNU Octave实现)
核心思路
K5是5个顶点两两相连的完全图,环面是少数能无交叉嵌入K5的曲面之一。要实现顶点和边均位于环面表面,需利用环面参数方程定义顶点位置,并结合环面的拓扑周期性绘制不穿过内部的边。
完整实现代码
% 环面参数:am为管半径,rm为环面中心到管中心的距离 am = 1.; rm = 3.; % 生成高采样率环面网格,提升平滑度 t = linspace(-pi, pi, 32); p = linspace(0., 2.*pi, 32); [t,p] = meshgrid(p,t); x = (rm + am.*cos(p)).*cos(t); y = (rm + am.*cos(p)).*sin(t); z = am.*sin(p); % 绘制半透明环面,方便观察内部边 hsurf = surf(x,y,z); axis equal; set(hsurf, 'FaceColor','interp','FaceAlpha',0.5,'EdgeAlpha',0.25); hold on; % 定义K5的5个顶点在环面上的参数坐标(θ, φ) num_verts = 5; theta_vals = linspace(0, 2*pi, num_verts); % 纬圈角度分布 phi_vals = linspace(0, 2*pi, num_verts); % 经圈角度分布 % 计算每个顶点的3D坐标 verts = zeros(num_verts, 3); for i = 1:num_verts verts(i,1) = (rm + am*cos(theta_vals(i))) * cos(phi_vals(i)); verts(i,2) = (rm + am*cos(theta_vals(i))) * sin(phi_vals(i)); verts(i,3) = am*sin(theta_vals(i)); end % 绘制红色实心顶点标记 scatter3(verts(:,1), verts(:,2), verts(:,3), 100, 'r', 'filled'); % 遍历所有顶点对,绘制环面表面的边 for i = 1:num_verts for j = i+1:num_verts % 获取两个顶点的参数坐标 theta1 = theta_vals(i); phi1 = phi_vals(i); theta2 = theta_vals(j); phi2 = phi_vals(j); % 利用环面周期性选择φ方向最短路径,避免边穿入内部 d_phi = phi2 - phi1; if abs(d_phi) > pi phi2 = phi2 - sign(d_phi)*2*pi; end % 生成边的采样点 s = linspace(0, 1, 50); theta_s = theta1 + s*(theta2 - theta1); phi_s = phi1 + s*(phi2 - phi1); % 计算边的3D坐标并绘制 x_edge = (rm + am.*cos(theta_s)).*cos(phi_s); y_edge = (rm + am.*cos(theta_s)).*sin(phi_s); z_edge = am.*sin(theta_s); plot3(x_edge, y_edge, z_edge, 'b', 'LineWidth', 1.5); end end hold off; view(3);
代码说明
- 环面优化:提升网格采样数至32,让环面显示更平滑;半透明设置便于观察被遮挡的边。
- 顶点分布:将5个顶点均匀分布在环面的经纬圈上,减少边的重叠交叉。
- 边的处理:通过调整φ参数利用环面周期性,确保边沿表面最短路径绘制,不会穿入环面内部。
- 可视化区分:用红色实心点标记顶点,蓝色线条绘制边,清晰区分图元素。
内容的提问来源于stack exchange,提问作者23pmta006 23pmta006
相关产品推荐
相关产品推荐

