首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除图形中相交曲线上的小故障?

如何消除图形中相交曲线上的小故障?
EN

Stack Overflow用户
提问于 2021-09-03 19:28:41
回答 1查看 75关注 0票数 0

这是一个同样多的问题,因为这是一封感谢信,感谢他,他帮助我创造了我想要的数字,在侏儒图。

我试着获得他们曾分享过几次的一个情节的最好看的图像。

这是我的剧本

代码语言:javascript
复制
reset session
set output 'Wavy_curve.svg'

samps = 2500
set samples samps, samps
set isosamples samps, samps

f(x,y) = sin(1.3*x)*cos(0.9*y)+cos(.8*x)*sin(1.9*y)+cos(y*.2*x)
set table $Data01
    splot f(x,y)
unset table

g(x,y) = y
set table $Data02
    splot g(x,y)
unset table

h(x,y) = 0.5*x
set table $Data03
    splot h(x,y)
unset table

Zmin = -3
Zmax= 3

set xrange[-5:5]
set yrange[-5:5]
set zrange[Zmin:Zmax]
set hidden3d
set angle degree

Frac(z) = (z-Zmin)/(Zmax-Zmin)
# MyPalette01
Red01(z) = 65536 * ( Frac(z) > 0.75 ? 255 : int(255*abs(2*Frac(z)-0.5)))
Green01(z) = int(255*sin(180*Frac(z)))*256
Blue01(z) = int(255*cos(90*Frac(z)))
MyPalette01(z) =  Red01(z) + Green01(z) + Blue01(z) 

# MyPalette02
Red02(z)   = 65536 * int(255*Frac(z))
Green02(z) = 256 * (Frac(z) > 0.333 ? 255 : int(255*Frac(z)*3))
Blue02(z)  = (Frac(z) > 0.5 ? 255 : int(255*Frac(z)*2))
MyPalette02(z) =  Red02(z) + Green02(z) + Blue02(z) 

# MyPalette03
Red03(z)   = 65536 * (Frac(z) > 0.5 ? 255 : int(255*Frac(z)*2))
Green03(z) = 256 * (Frac(z) > 0.333 ? 255 : int(255*Frac(z)*3))  
Blue03(z)  = int(255*Frac(z)) 
MyPalette03(z) =  Red03(z) + Green03(z) + Blue03(z) 

set pm3d
set pm3d depthorder
set pm3d lighting primary 0.5 specular 0.2
set pm3d ftriangles
set style fill transparent solid 0.8 noborder 

unset colorbox

set view 44,316
splot $Data01 u 1:2:3:(MyPalette01($3)) w l lc rgb var notitle, \
      $Data02 u 1:2:3:(MyPalette02($3)) w l lc rgb var notitle, \
      $Data03 u 1:2:3:(MyPalette03($3)) w l lc rgb var notitle
### end of code 

和结果

我可怜的笔记本电脑花了16个小时才呈现出来,但我对结果很满意。我好像有几个小毛病。这种情况通常发生在这些半透明的情节中。左下角有一个较暗的圆圈。几乎看不出来,只是背景比较暗。我想我还需要更多的样本,但过了一段时间,它会变得异常缓慢。我只用了2500来得到尖锐的交叉口,1000是足够好的一个单一的表面。当我使用0.2作为透明度时,我还得到了看起来像是缺失的纹理,通过将它增加到0.8,它得到了解决。

我使用svg终端作为qt终端,为这些情节提供丑陋的线条,这需要增加透明度,但最终仍然是云纹图案。wxt在没有行的情况下处理得更好,但是它不能提供完全的透明度,它似乎只能显示一个交点。有什么方法可以降低计算成本来获得这样的结果吗?

编辑:在伊森的回答下,我用svg终端在30秒内得到了这个结果。新的问题是Inkscape真的很难打开文件,该文件最终是300 it,以便将其导出为png,而png只有1.4MB。是否有另一个终端能提供像svg这样好的结果,但它可以直接输出为png?svg终端能直接输出为png吗?我将尝试在不打开inkscape gui的情况下从命令行进行文件转换,但考虑到文件大小很大,它仍然不理想。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-12 18:12:08

我不知道你对你的阴谋有什么限制或要求,但我怀疑你正在使它变得比必要的更难获得一个顺利的结果。

这里是一个平滑的版本,大约相同的情节,在我的不是特别强大的桌面上执行不到2秒。我已经将三个不同的调色板区域堆叠到一个调色板中,这样script命令就可以直接使用调色板,而不是像示例脚本那样将它分割成离散的示例。

通过直接使用调色板,您还可以通过添加set pm3d interpolation N,N来增加平滑度,尽管我认为这里不需要它。

如果这种方法不能解决某些需求,可以随意修改这个问题。

代码语言:javascript
复制
set term pngcairo size 700,500
set output 'Waves.png'

samps = 250

set samples samps, samps
set isosamples samps, samps

f(x,y) = sin(1.3*x)*cos(0.9*y)+cos(.8*x)*sin(1.9*y)+cos(y*.2*x)
g(x,y) = y
h(x,y) = 0.5*x

Zmin = -3
Zmax= 3

set xrange[-5:5]
set yrange[-5:5]
set zrange[Zmin:Zmax]

set pm3d depthorder
set pm3d lighting primary 0.5 specular 0.2

set style fill transparent solid 0.8 noborder 

unset colorbox
unset key

set view 44,316

set palette defined (-3 "0x0000df", 0 "0xddff40", 3 "0xdf0000", \
                      3 "gray40", 9 "0x8fffff", \
                      9 "gray40", 15 "0xffff8f")
set cbrange [-3:15]

splot '++' u 1:2:(f(x,y)) with pm3d, \
      '++' u 1:2:(g(x,y)):(6+g(x,y)) with pm3d, \
      '++' u 1:2:(h(x,y)):(12+h(x,y)) with pm3d

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69049783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档