gnuplot彩色立方体绘制及数据块加载失败问题求助
问题分析与解决方案
一、数据块加载失败的原因与修复
在gnuplot脚本文件中,内联数据块($d1这类)的定义格式和交互式输入不同:
- 交互式输入时,直接输入
$d1后逐行写数据,空行结束即可; - 但通过
load加载脚本文件时,必须用分界符明确标记数据块的开始和结束,否则gnuplot会把后续代码误判为数据块内容,导致执行失败。
正确的脚本内数据块写法:
$d1 << EOD 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 EOD $d2 << EOD # 这里写入$d2的立方体顶点数据 EOD
用$数据块名 << EOD开头,EOD结尾(EOD可替换为任意未在数据中出现的字符串),中间插入顶点数据即可。
二、魔方绘制的高效实现方案
不需要为27个小立方体单独定义数据块,可通过基础立方体数据块+循环偏移+条件上色的方式实现,代码更简洁且易维护:
完整示例代码
# 定义基础小立方体的8个顶点(边长0.9,避免相邻立方体重叠) $base_cube << EOD -0.45 -0.45 -0.45 -0.45 -0.45 0.45 -0.45 0.45 0.45 -0.45 0.45 -0.45 0.45 0.45 -0.45 0.45 0.45 0.45 0.45 -0.45 0.45 0.45 -0.45 -0.45 EOD # 绘图样式设置 set style fill solid 1.0 set style polygon fc rgb variable set view equal xyz set ticslevel 0 set hidden3d set title "Rubik's Cube" # 定义魔方各面颜色 color_x_plus = "0xff0000" # 右侧红 color_x_minus = "0xff8800" # 左侧橙 color_y_plus = "0xffff00" # 上侧黄 color_y_minus = "0xffffff" # 下侧白 color_z_plus = "0x00ff00" # 前侧绿 color_z_minus = "0x0000ff" # 后侧蓝 # 循环生成27个小立方体 do for [x=-1:1] { do for [y=-1:1] { do for [z=-1:1] { # 计算当前小立方体的位置偏移 dx = x * 1.0 dy = y * 1.0 dz = z * 1.0 # 绘制灰色立方体本体 splot $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb "0xcccccc" notitle, \ # 根据位置绘制对应颜色的贴纸面 (x == 1 ? $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb color_x_plus notitle : 0/0), \ (x == -1 ? $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb color_x_minus notitle : 0/0), \ (y == 1 ? $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb color_y_plus notitle : 0/0), \ (y == -1 ? $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb color_y_minus notitle : 0/0), \ (z == 1 ? $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb color_z_plus notitle : 0/0), \ (z == -1 ? $base_cube using ($1+dx):($2+dy):($3+dz) with polygons fc rgb color_z_minus notitle : 0/0) } } }
代码说明
- 基础立方体:只定义一次小立方体的顶点数据,后续通过偏移量生成所有位置的立方体;
- 循环遍历:通过三重循环覆盖x/y/z轴的-1/0/1三个位置,对应魔方的27个小立方体;
- 条件上色:利用
(条件 ? 绘制代码 : 0/0)的语法,仅为处于魔方外围的小立方体绘制对应颜色的贴纸面,0/0表示不绘制该部分; - 避免重叠:基础立方体边长设为0.9,相邻立方体间距0.1,解决面重叠导致的颜色覆盖问题。
内容的提问来源于stack exchange,提问作者Gyuszi Suto
相关产品推荐
相关产品推荐

