我对用于创建隐式定义曲面的 Asymptote 模块“Smoothcontour3”有疑问。一般来说,该模块对我来说效果很好,但在绘制透明曲面时我遇到了一个小问题。当隐式定义的曲面是透明的时,曲面上的网格线会变得非常明显(比我希望的要明显得多)。
我在下面附上了我的 Asymptote 代码。这本质上是 Charles Staats 的 Asymptote 教程中隐式定义曲面的示例(教程第 97 页第 4.6.1 节)。当我通过设置禁用透明度时opac = 1
,一切看起来都很漂亮。如果我通过设置启用透明度opac = 0.75
,图像仍然看起来不错,但现在表面上的网格线非常明显。我可以通过设置删除网格线overlapedges=false
,但这样我就错过了该overlapedges
功能的诱人优势。
有人能就这个问题提供一些建议吗?是否有可能在保留透明度和启用功能的同时摆脱网格线overlapedges
?任何帮助都将不胜感激。
settings.outformat="png";
settings.render=8;
import smoothcontour3;
size(5cm, 0);
currentprojection=perspective((18,20,10));
real tuberadius = 0.69;
real opac = 0.75;
// Convert to cylindrical coordinates to draw
// a circle revolved about the z axis.
real toruscontour(real x, real y, real z) {
real r = sqrt(x^2 + y^2);
return (r-2)^2 + z^2 - tuberadius^2;
}
// Take the union of the two tangent tori (by taking
// the product of the functions defining them). Then
// add (or subtract) a bit of noise to smooth things
// out.
real f(real x, real y, real z) {
real f1 = toruscontour(x - 2 - tuberadius, y, z);
real f2 = toruscontour(x + 2 + tuberadius, y, z);
return f1 * f2 - 0.1;
}
// The smoothed function extends a bit farther than the union of
// the two tori, so include a bit of extra space in the box.
triple max = (2*(2+tuberadius), 2+tuberadius, tuberadius) + (0.1, 0.1, 0.1);
// Draw the implicit surface.
surface s = implicitsurface(f, -max, max, overlapedges=true, nx=20, nz=5);
draw(s, surfacepen=palegreen + opacity(opac));
为了说明我的问题,我附上了上述代码生成的图形。第一幅图像没有透明度,第二幅图像启用了透明度(opac = 0.75
)。如图所示,透明表面上的网格线非常明显(不透明表面上则没有)。
答案1
是否可以去除网格线,同时仍然启用透明度和重叠边缘?
不是,不是。该overlapedges
选项通过稍微放大所有面片来实现。渲染器将所有面片视为不同的表面。当渲染器看到两层透明表面而不是一层时,结果会更暗。因此重叠的边缘会转换为更暗的区域,即网格线。
我能想到的唯一修复方法是,如果 Asymptote 能够让渲染器将面片组合在一起,使之“彼此不透明”,这样只有一个面片会对任何一个像素产生影响。不幸的是,Asymptote 没有这种能力 —— 至少据我所知没有。
您可以尝试overlapedges
通过修改您的副本来进行缩放,smoothcontour3.asy
如以下提交所示:https://github.com/vectorgraphics/asymptote/commit/ff41f2060c00278a13512dd66ca7424d697342c5
但我猜你最终会得到两全其美的结果而不是令人满意的解决方案。