我有一个完整城市的3D模型,并希望显示这些建筑物的等距视图.我使用gnuplot多边形,因为我认为我不能将pm3d用于坐标不在定义良好的网格上的多边形.多边形显示的颜色对应于它们获得的平均太阳辐照度.我还将地面多边形显示为线框,主要是自动设置xrange,yrange和zrange.
从遥远的地方看起来还不错,但是当你放大时,你会看到一些多边形的深度顺序是错误的.
你知道我怎么能以正确的顺序显示这些多边形吗?
像这样的东西会很棒,但它似乎只能使用splot.
这是一个Gnuplot文件来查看问题(2个建筑物和4个屋顶):
set style line 1 linecolor rgbcolor "#777777" linewidth 1
set style increment user
set palette file "-"
0.00000 0.23137 0.22353 0.64314
0.17990 0.47843 0.34510 0.71765
0.32010 0.34902 0.17647 0.55686
0.43990 0.40784 0.10980 0.36471
0.59010 0.46275 0.09020 0.16863
0.78000 0.86667 0.41569 0.24314
0.92990 0.92549 0.66667 0.33725
1.00000 0.97647 0.91765 0.82745
e
set cbrange [50:150]
set cbtics 25
set format cb "%.0f W/m²"
unset xtics
unset ytics
unset ztics
unset border
set colorbox
kzoom=1.0
phi=30.0
theta=60.0
set xyplane 0 # removes the offset of the xy plane
set view equal xyz # force equal units to all three axes
set view theta,phi,kzoom
set object 1 polygon from \
2.0,0.0,3.0 to \
3.0,0.0,3.5 to \
3.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0
set object 1 fill solid 0.9 border lw 2 fc palette cb 128.1315 front
set object 2 polygon from \
4.0,0.0,3.0 to \
4.0,2.0,3.0 to \
3.0,2.0,3.5 to \
3.0,0.0,3.5 to \
4.0,0.0,3.0
set object 2 fill solid 0.9 border lw 2 fc palette cb 128.62192 front
set object 3 polygon from \
2.0,0.0,0.0 to \
4.0,0.0,0.0 to \
4.0,0.0,3.0 to \
3.0,0.0,3.5 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 3 fill solid 0.9 border lw 2 fc palette cb 100.545204
set object 4 polygon from \
4.0,0.0,0.0 to \
4.0,2.0,0.0 to \
4.0,2.0,3.0 to \
4.0,0.0,3.0 to \
4.0,0.0,0.0
set object 4 fill solid 0.9 border lw 2 fc palette cb 85.58082
set object 5 polygon from \
4.0,2.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
3.0,2.0,3.5 to \
4.0,2.0,3.0 to \
4.0,2.0,0.0
set object 5 fill solid 0.9 border lw 2 fc palette cb 55.88219
set object 6 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,0.0
set object 6 fill solid 0.9 border lw 2 fc palette cb 85.25754
set object 7 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 7 fill solid 0.9 border lw 2 fc palette cb 85.25754
set object 8 polygon from \
0.0,0.0,3.0 to \
1.0,0.0,3.5 to \
1.0,2.0,3.5 to \
0.0,2.0,3.0 to \
0.0,0.0,3.0
set object 8 fill solid 0.9 border lw 2 fc palette cb 128.1315 front
set object 9 polygon from \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
1.0,2.0,3.5 to \
1.0,0.0,3.5 to \
2.0,0.0,3.0
set object 9 fill solid 0.9 border lw 2 fc palette cb 128.62192 front
set object 10 polygon from \
0.0,0.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
1.0,0.0,3.5 to \
0.0,0.0,3.0 to \
0.0,0.0,0.0
set object 10 fill solid 0.9 border lw 2 fc palette cb 100.545204
set object 11 polygon from \
2.0,0.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 11 fill solid 0.9 border lw 2 fc palette cb 85.58082
set object 12 polygon from \
2.0,2.0,0.0 to \
0.0,2.0,0.0 to \
0.0,2.0,3.0 to \
1.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 12 fill solid 0.9 border lw 2 fc palette cb 55.88219
set object 13 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,0.0
set object 13 fill solid 0.9 border lw 2 fc palette cb 85.25754
set object 14 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,3.0 to \
0.0,2.0,0.0
set object 14 fill solid 0.9 border lw 2 fc palette cb 85.25754
splot "-" with lines notitle ls 1, NaN notitle palette
2.0 0.0 0.0
2.0 2.0 0.0
4.0 2.0 0.0
4.0 0.0 0.0
2.0 0.0 0.0
0.0 0.0 0.0
0.0 2.0 0.0
2.0 2.0 0.0
2.0 0.0 0.0
0.0 0.0 0.0
e
pause mouse
Run Code Online (Sandbox Code Playgroud)
谢谢你的兴趣!
我找不到一个选项来说服 gnuplot 它应该自动设置多边形对象的深度顺序。我发现的唯一方法是已经以正确的顺序定义对象。然后 gnuplot 将它们中的每一个绘制在前一个之上,从而得到预期的结果。
\n以删除说明符后的示例多边形为例front,此方法更改了原始图片:
对此(删除后front):
到这个(排序后):
\n\n我想第三张图就是你想要的。
\n我使用 python 脚本对多边形进行排序,其基本上是:
\nset object x polygon from。set view theta, phi,它围绕 x 和 z 轴旋转多边形(暂时,仅用于排序)。xin set object x polygon。set object线条。请注意,此方法仅适用于静态图片。如果您想交互式旋转图片,则它不起作用。
\n另请注意,如果该方法不适用于您的完整数据文件,我可能搞乱了旋转矩阵或\n轴分配:)
\n我附上 python 脚本、绘图文件以及数据文件“plot_raw.dat”和“plot_sorted.dat”以供参考。
\n# poly.py\nfrom math import cos, sin, pi\nfrom re import sub, match, findall\n\nclass Polygon:\n\n def __init__(self):\n\n self.firstLine = ""\n self.points = []\n self.lastLine = ""\n\n\n def __str__(self):\n\n pointStrings = [",".join(map(str,point)) for point in self.points]\n\n s = ""\n s += self.firstLine\n s += " to \\\\\\n".join(pointStrings)\n s += "\\n"\n s += self.lastLine\n\n return s\n\n\n def readObjectFromFile(self, f, firstObjectLine):\n self.firstLine = firstObjectLine\n line = f.readline()\n while not match("set",line):\n coordinates = findall("[\\d.]+", line)\n coordinates = tuple(float(x) for x in coordinates)\n self.points.append(coordinates)\n line = f.readline()\n self.lastLine = line\n\n return self\n\n\n def meanAfterRotation(self, theta, phi):\n cx = 0.0\n cy = 0.0\n cz = 0.0\n\n theta = theta*pi/180.0\n phi = phi*pi/180.0\n\n for point in self.points:\n x,y,z = point\n x,y,z = (x, y*cos(theta) - z*sin(theta), y*sin(theta) + z*cos(theta))\n x,y,z = (x*cos(phi) - y*sin(phi), x*sin(phi) + y*cos(phi), z)\n cx, cy, cz = (cx + x, cy + y, cz + z)\n\n n = len(self.points)\n\n return (cx/n, cy/n, cz/n)\n\n\n def setPosition(self, posIndex):\n\n self.firstLine = sub("(\\d+)", str(posIndex), self.firstLine, 1)\n self.lastLine = sub("(\\d+)", str(posIndex), self.lastLine, 1)\n\n\n\n\npolygons = []\nwith open("poly_raw.dat") as f:\n\n line = f.readline()\n while line:\n\n if line.strip() != "":\n polygons.append(Polygon().readObjectFromFile(f,line))\n\n line = f.readline()\n\npolygons.sort(key = lambda x: x.meanAfterRotation(60,30)[1], reverse = True)\npos = 1\nfor p in polygons:\n p.setPosition(pos)\n pos += 1\n\nfor p in polygons:\n print(p)\nRun Code Online (Sandbox Code Playgroud)\ngnuplot 脚本:
\n# poly.plt, gnuplot 4.6\n# Does not work when interactively rotating the picture.\n\nset style line 1 linecolor rgbcolor "#777777" linewidth 1\nset style increment user\nset palette file "-"\n0.00000 0.23137 0.22353 0.64314\n0.17990 0.47843 0.34510 0.71765\n0.32010 0.34902 0.17647 0.55686\n0.43990 0.40784 0.10980 0.36471\n0.59010 0.46275 0.09020 0.16863\n0.78000 0.86667 0.41569 0.24314\n0.92990 0.92549 0.66667 0.33725\n1.00000 0.97647 0.91765 0.82745\ne\nset cbrange [50:150]\nset cbtics 25\nset format cb "%.0f W/m\xc2\xb2"\nunset xtics\nunset ytics\nunset ztics\nunset border\nset colorbox\n\nkzoom=1.0\nphi=30.0\ntheta=60.0\nset xyplane 0 # removes the offset of the xy plane\nset view equal xyz # force equal units to all three axes\nset view theta,phi,kzoom\n\n#load "poly_raw.dat"\nload "poly_sorted.dat"\n\nset terminal png\n#set output "raw.png"\nset output "sorted.png"\nsplot "-" with lines notitle ls 1, NaN notitle palette\n2.0 0.0 0.0\n2.0 2.0 0.0\n4.0 2.0 0.0\n4.0 0.0 0.0\n2.0 0.0 0.0\n\n0.0 0.0 0.0\n0.0 2.0 0.0\n2.0 2.0 0.0\n2.0 0.0 0.0\n0.0 0.0 0.0\ne\nRun Code Online (Sandbox Code Playgroud)\n删除说明符后未排序的多边形数据front:
set object 1 polygon from \\\n2.0,0.0,3.0 to \\\n3.0,0.0,3.5 to \\\n3.0,2.0,3.5 to \\\n2.0,2.0,3.0 to \\\n2.0,0.0,3.0\nset object 1 fill solid 0.9 border lw 2 fc palette cb 128.1315\n\nset object 2 polygon from \\\n4.0,0.0,3.0 to \\\n4.0,2.0,3.0 to \\\n3.0,2.0,3.5 to \\\n3.0,0.0,3.5 to \\\n4.0,0.0,3.0\nset object 2 fill solid 0.9 border lw 2 fc palette cb 128.62192\n\nset object 3 polygon from \\\n2.0,0.0,0.0 to \\\n4.0,0.0,0.0 to \\\n4.0,0.0,3.0 to \\\n3.0,0.0,3.5 to \\\n2.0,0.0,3.0 to \\\n2.0,0.0,0.0\nset object 3 fill solid 0.9 border lw 2 fc palette cb 100.545204\n\nset object 4 polygon from \\\n4.0,0.0,0.0 to \\\n4.0,2.0,0.0 to \\\n4.0,2.0,3.0 to \\\n4.0,0.0,3.0 to \\\n4.0,0.0,0.0\nset object 4 fill solid 0.9 border lw 2 fc palette cb 85.58082\n\nset object 5 polygon from \\\n4.0,2.0,0.0 to \\\n2.0,2.0,0.0 to \\\n2.0,2.0,3.0 to \\\n3.0,2.0,3.5 to \\\n4.0,2.0,3.0 to \\\n4.0,2.0,0.0\nset object 5 fill solid 0.9 border lw 2 fc palette cb 55.88219\n\nset object 6 polygon from \\\n2.0,2.0,0.0 to \\\n2.0,0.0,0.0 to \\\n2.0,0.0,3.0 to \\\n2.0,2.0,0.0\nset object 6 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 7 polygon from \\\n2.0,2.0,0.0 to \\\n2.0,0.0,3.0 to \\\n2.0,2.0,3.0 to \\\n2.0,2.0,0.0\nset object 7 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 8 polygon from \\\n0.0,0.0,3.0 to \\\n1.0,0.0,3.5 to \\\n1.0,2.0,3.5 to \\\n0.0,2.0,3.0 to \\\n0.0,0.0,3.0\nset object 8 fill solid 0.9 border lw 2 fc palette cb 128.1315\n\nset object 9 polygon from \\\n2.0,0.0,3.0 to \\\n2.0,2.0,3.0 to \\\n1.0,2.0,3.5 to \\\n1.0,0.0,3.5 to \\\n2.0,0.0,3.0\nset object 9 fill solid 0.9 border lw 2 fc palette cb 128.62192\n\nset object 10 polygon from \\\n0.0,0.0,0.0 to \\\n2.0,0.0,0.0 to \\\n2.0,0.0,3.0 to \\\n1.0,0.0,3.5 to \\\n0.0,0.0,3.0 to \\\n0.0,0.0,0.0\nset object 10 fill solid 0.9 border lw 2 fc palette cb 100.545204\n\nset object 11 polygon from \\\n2.0,0.0,0.0 to \\\n2.0,2.0,0.0 to \\\n2.0,2.0,3.0 to \\\n2.0,0.0,3.0 to \\\n2.0,0.0,0.0\nset object 11 fill solid 0.9 border lw 2 fc palette cb 85.58082\n\nset object 12 polygon from \\\n2.0,2.0,0.0 to \\\n0.0,2.0,0.0 to \\\n0.0,2.0,3.0 to \\\n1.0,2.0,3.5 to \\\n2.0,2.0,3.0 to \\\n2.0,2.0,0.0\nset object 12 fill solid 0.9 border lw 2 fc palette cb 55.88219\n\nset object 13 polygon from \\\n0.0,2.0,0.0 to \\\n0.0,0.0,0.0 to \\\n0.0,0.0,3.0 to \\\n0.0,2.0,0.0\nset object 13 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 14 polygon from \\\n0.0,2.0,0.0 to \\\n0.0,0.0,3.0 to \\\n0.0,2.0,3.0 to \\\n0.0,2.0,0.0\nset object 14 fill solid 0.9 border lw 2 fc palette cb 85.25754\nRun Code Online (Sandbox Code Playgroud)\n运行后排序后的数据python poly.py > poly_sorted.dat
set object 1 polygon from \\\n4.0,0.0,0.0 to \\\n4.0,2.0,0.0 to \\\n4.0,2.0,3.0 to \\\n4.0,0.0,3.0 to \\\n4.0,0.0,0.0\nset object 1 fill solid 0.9 border lw 2 fc palette cb 85.58082\n\nset object 2 polygon from \\\n4.0,2.0,0.0 to \\\n2.0,2.0,0.0 to \\\n2.0,2.0,3.0 to \\\n3.0,2.0,3.5 to \\\n4.0,2.0,3.0 to \\\n4.0,2.0,0.0\nset object 2 fill solid 0.9 border lw 2 fc palette cb 55.88219\n\nset object 3 polygon from \\\n2.0,2.0,0.0 to \\\n2.0,0.0,0.0 to \\\n2.0,0.0,3.0 to \\\n2.0,2.0,0.0\nset object 3 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 4 polygon from \\\n2.0,2.0,0.0 to \\\n2.0,0.0,3.0 to \\\n2.0,2.0,3.0 to \\\n2.0,2.0,0.0\nset object 4 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 5 polygon from \\\n2.0,0.0,0.0 to \\\n2.0,2.0,0.0 to \\\n2.0,2.0,3.0 to \\\n2.0,0.0,3.0 to \\\n2.0,0.0,0.0\nset object 5 fill solid 0.9 border lw 2 fc palette cb 85.58082\n\nset object 6 polygon from \\\n2.0,2.0,0.0 to \\\n0.0,2.0,0.0 to \\\n0.0,2.0,3.0 to \\\n1.0,2.0,3.5 to \\\n2.0,2.0,3.0 to \\\n2.0,2.0,0.0\nset object 6 fill solid 0.9 border lw 2 fc palette cb 55.88219\n\nset object 7 polygon from \\\n2.0,0.0,0.0 to \\\n4.0,0.0,0.0 to \\\n4.0,0.0,3.0 to \\\n3.0,0.0,3.5 to \\\n2.0,0.0,3.0 to \\\n2.0,0.0,0.0\nset object 7 fill solid 0.9 border lw 2 fc palette cb 100.545204\n\nset object 8 polygon from \\\n0.0,2.0,0.0 to \\\n0.0,0.0,0.0 to \\\n0.0,0.0,3.0 to \\\n0.0,2.0,0.0\nset object 8 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 9 polygon from \\\n4.0,0.0,3.0 to \\\n4.0,2.0,3.0 to \\\n3.0,2.0,3.5 to \\\n3.0,0.0,3.5 to \\\n4.0,0.0,3.0\nset object 9 fill solid 0.9 border lw 2 fc palette cb 128.62192\n\nset object 10 polygon from \\\n0.0,2.0,0.0 to \\\n0.0,0.0,3.0 to \\\n0.0,2.0,3.0 to \\\n0.0,2.0,0.0\nset object 10 fill solid 0.9 border lw 2 fc palette cb 85.25754\n\nset object 11 polygon from \\\n0.0,0.0,0.0 to \\\n2.0,0.0,0.0 to \\\n2.0,0.0,3.0 to \\\n1.0,0.0,3.5 to \\\n0.0,0.0,3.0 to \\\n0.0,0.0,0.0\nset object 11 fill solid 0.9 border lw 2 fc palette cb 100.545204\n\nset object 12 polygon from \\\n2.0,0.0,3.0 to \\\n3.0,0.0,3.5 to \\\n3.0,2.0,3.5 to \\\n2.0,2.0,3.0 to \\\n2.0,0.0,3.0\nset object 12 fill solid 0.9 border lw 2 fc palette cb 128.1315\n\nset object 13 polygon from \\\n2.0,0.0,3.0 to \\\n2.0,2.0,3.0 to \\\n1.0,2.0,3.5 to \\\n1.0,0.0,3.5 to \\\n2.0,0.0,3.0\nset object 13 fill solid 0.9 border lw 2 fc palette cb 128.62192\n\nset object 14 polygon from \\\n0.0,0.0,3.0 to \\\n1.0,0.0,3.5 to \\\n1.0,2.0,3.5 to \\\n0.0,2.0,3.0 to \\\n0.0,0.0,3.0\nset object 14 fill solid 0.9 border lw 2 fc palette cb 128.1315\nRun Code Online (Sandbox Code Playgroud)\ngnuplot 5.4 的更改
\n与版本 4.6 相比,该脚本在 gnuplot 5.4.1 中产生的输出似乎不同:
\n以下是一些解决方法:
\n黑色的建筑物似乎是由命令border lw 2部分造成的set object ...。如果我删除所有的border lw 2,颜色就会恢复。
不幸的是,现在多边形的边界仍然是黑色的。可以通过不border lw 2 完全移除零件,而是用border lc palette cb 128.62192与128.62192零件中相同的编号来替换它来改变这一点fc palette cb 128.62192。
现在,完整的set object ...行如下所示:
set object 2 fill solid 0.9 border lc palette cb 128.62192 fc palette cb 128.62192
最后,至少在我的测试中,绘图并未位于图像的中心。我通过添加解决了这个问题
\nset origin -0.2, -0.3
set size 1.2, 1.2
就在splot-命令之前。