在 中asymptote
,我想绘制如下图所示的任意路径,但使用多种颜色。在示例中,黑色显示的路径也用两条平行的红线绘制。我想做同样的事情,但内径用绿色,外径用红色。我需要它也适用于任意路径。
在下图中,我使用该makepen
函数创建了两支笔。在本例中,笔尖垂直偏移。但是,我想要一种解决方案,让红色和绿色曲线之间的距离无论路径斜率如何都是恒定的(如上图所示)。
unitsize(1inch);
path path1 = arc((0,0), 0.6, 0, 180);
path path2 = (-0.5,0){E}..{S}(0.5,0);
pen pen1 = makepen(shift(-0.5,-2)*unitsquare)+green;
pen pen2 = makepen(shift(-0.5,+1)*unitsquare)+red;
draw(path1, pen1);
draw(path1, pen2);
draw(path1, black);
draw(path2, pen1);
draw(path2, pen2);
draw(path2, black);
您是否知道如何保持任意路径的红线和绿线之间的距离恒定?
仅供参考——第一张图像是asymptote
通过绘制一条粗红线,然后在其上绘制一条细白线而生成的。
答案1
感谢@CharlesStaats 提供的精彩示例代码链接!这是对graph
软件包的一个很好的使用。根据我的需求调整您的示例可得到以下结果。希望我没有因为回答自己的问题而违反礼仪。
我仍然对使用定义的替代简单解决方案感兴趣pen
。
unitsize(1inch);
import graph;
path pathA = (0,0){E}..{S}(1.0,0);
real offset = 0.05;
pair offsetPoint(real t) { return point(pathA, t) + offset*(rotate(90)*dir(pathA,t)); }
path pathB = graph(offsetPoint, 0, length(pathA), operator ..);
offset = -0.05;
path pathC = graph(offsetPoint, 0, length(pathA), operator ..);
draw(pathA);
draw(pathB, red);
draw(pathC, green);
答案2
在 James 的解决方案的基础上,我使用高阶函数修改了代码,使得路径在偏移函数中不是硬编码的。
unitsize(1inch);
import graph;
path pathA = (0,0){E}..{S}(1.0,0);
typedef pair offsetFunction(real);
offsetFunction offsetPoint(path original_path, real d) {return new pair(real t) {return point(original_path, t) + d*(rotate(90)*dir(original_path,t));};};
path pathB = graph(offsetPoint(pathA, 0.05), 0, length(pathA), operator ..);
path pathC = graph(offsetPoint(pathA, -0.05), 0, length(pathA), operator ..);
draw(pathA);
draw(pathB, red);
draw(pathC, green);