gpt4 book ai didi

3d - Gnuplot:尊重 Gnuplot 3d 多边形的深度顺序

转载 作者:行者123 更新时间:2023-12-04 13:31:43 28 4
gpt4 key购买 nike

我有一个完整城市的 3D 模型,想展示一个
这些建筑物的等距 View 。我为此使用 gnuplot 多边形,
因为我不认为我可以将 pm3d 用于具有坐标的多边形
不在一个明确定义的网格上。多边形以颜色显示
对应于他们获得的平均太阳辐照度。一世
还将地面多边形显示为线框,主要用于设置 xrange,
yrange 和 zrange 自动。

远看还可以,但是放大后会发现
某些多边形的深度顺序是错误的。

这是导入 SketchUp 的 CityGML 模型:
enter image description here

这就是 Gnuplot 的结果:
enter image description here

你知道我如何以正确的顺序显示这些多边形吗?

类似 this会很棒,但它似乎只适用于 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

感谢您的关注!

最佳答案

我找不到一个选项来说服 gnuplot 它应该自动设置多边形对象的深度顺序。我发现的唯一方法是以正确的顺序定义对象。然后 gnuplot 将它们中的每一个绘制在前一个的顶部,从而得到预期的结果。

删除 front 后以多边形为例说明符,这种方法改变了原始图片:

enter image description here

到这个(删除 front 后):

enter image description here

到这个(排序后):

enter image description here

我认为第三张图片是你想要的。

我使用了一个 python 脚本来对多边形进行排序,它基本上是:

  • 从文件“poly_raw.dat”中读取所有多边形。该文件必须以 set object x polygon from 开头线。
  • 像 gnuplot 和 set view theta, phi ,它围绕 x 和 z 轴旋转多边形(暂时,仅用于排序)。
  • 它根据新的 y 轴对多边形进行排序。这应该是与屏幕正交的轴。
  • 它更新 gnuplot 对象 ID,即 xset object x polygon .
  • 它打印排序的多边形数据,包括 set object线。

  • 请注意,此方法仅适用于静态图片。如果您想以交互方式旋转图片,它不起作用。

    另请注意,如果该方法不适用于您的完整数据文件,则我可能弄乱了旋转矩阵或
    轴分配:)

    我附上了 python 脚本、绘图文件和数据文件“plot_raw.dat”和“plot_sorted.dat”以供引用。
    # poly.py
    from math import cos, sin, pi
    from re import sub, match, findall

    class Polygon:

    def __init__(self):

    self.firstLine = ""
    self.points = []
    self.lastLine = ""


    def __str__(self):

    pointStrings = [",".join(map(str,point)) for point in self.points]

    s = ""
    s += self.firstLine
    s += " to \\\n".join(pointStrings)
    s += "\n"
    s += self.lastLine

    return s


    def readObjectFromFile(self, f, firstObjectLine):
    self.firstLine = firstObjectLine
    line = f.readline()
    while not match("set",line):
    coordinates = findall("[\d.]+", line)
    coordinates = tuple(float(x) for x in coordinates)
    self.points.append(coordinates)
    line = f.readline()
    self.lastLine = line

    return self


    def meanAfterRotation(self, theta, phi):
    cx = 0.0
    cy = 0.0
    cz = 0.0

    theta = theta*pi/180.0
    phi = phi*pi/180.0

    for point in self.points:
    x,y,z = point
    x,y,z = (x, y*cos(theta) - z*sin(theta), y*sin(theta) + z*cos(theta))
    x,y,z = (x*cos(phi) - y*sin(phi), x*sin(phi) + y*cos(phi), z)
    cx, cy, cz = (cx + x, cy + y, cz + z)

    n = len(self.points)

    return (cx/n, cy/n, cz/n)


    def setPosition(self, posIndex):

    self.firstLine = sub("(\d+)", str(posIndex), self.firstLine, 1)
    self.lastLine = sub("(\d+)", str(posIndex), self.lastLine, 1)




    polygons = []
    with open("poly_raw.dat") as f:

    line = f.readline()
    while line:

    if line.strip() != "":
    polygons.append(Polygon().readObjectFromFile(f,line))

    line = f.readline()

    polygons.sort(key = lambda x: x.meanAfterRotation(60,30)[1], reverse = True)
    pos = 1
    for p in polygons:
    p.setPosition(pos)
    pos += 1

    for p in polygons:
    print(p)

    gnuplot 脚本:
    # poly.plt, gnuplot 4.6
    # Does not work when interactively rotating the picture.

    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

    #load "poly_raw.dat"
    load "poly_sorted.dat"

    set terminal png
    #set output "raw.png"
    set output "sorted.png"
    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

    去除 front 后未排序的多边形数据说明符:
    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

    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

    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

    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

    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

    运行后排序后的数据 python poly.py > poly_sorted.dat
    set object 1 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 1 fill solid 0.9 border lw 2 fc palette cb 85.58082

    set object 2 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 2 fill solid 0.9 border lw 2 fc palette cb 55.88219

    set object 3 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 3 fill solid 0.9 border lw 2 fc palette cb 85.25754

    set object 4 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 4 fill solid 0.9 border lw 2 fc palette cb 85.25754

    set object 5 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 5 fill solid 0.9 border lw 2 fc palette cb 85.58082

    set object 6 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 6 fill solid 0.9 border lw 2 fc palette cb 55.88219

    set object 7 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 7 fill solid 0.9 border lw 2 fc palette cb 100.545204

    set object 8 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 8 fill solid 0.9 border lw 2 fc palette cb 85.25754

    set object 9 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 9 fill solid 0.9 border lw 2 fc palette cb 128.62192

    set object 10 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 10 fill solid 0.9 border lw 2 fc palette cb 85.25754

    set object 11 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 11 fill solid 0.9 border lw 2 fc palette cb 100.545204

    set object 12 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 12 fill solid 0.9 border lw 2 fc palette cb 128.1315

    set object 13 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 13 fill solid 0.9 border lw 2 fc palette cb 128.62192

    set object 14 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 14 fill solid 0.9 border lw 2 fc palette cb 128.1315

    关于3d - Gnuplot:尊重 Gnuplot 3d 多边形的深度顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40508404/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com