渐近线:如何创建具有中间颜色步骤的径向阴影或“椭圆”阴影?

渐近线:如何创建具有中间颜色步骤的径向阴影或“椭圆”阴影?

在 Asymptote 中,我可以使用函数创建径向渐变阴影,radialshade该函数定义一个渐变,从中心为 cA、半径为 rA 的圆上的颜色 A 平滑地变为中心为 cB、半径为 rB 的圆上的颜色 B。但我发现自己需要沿途指定中间颜色阴影才能获得我想要的外观,例如,得到一个圆,其中心有一个小的白红色区域,外部有一个较大的深红色区域,中间有一个纯红色区域。我尝试通过以下方式组合两个径向阴影来实现这一点:

size(0,100);

path g=scale(2)*unitcircle;
pair A=(0.35,0.35), B=(0.6,0.6), C=(0,0);

radialshade(scale(1.1)*unitcircle,white,C,0,red,C,0.8);
radialshade(scale(1.0)*unitcircle^^g,red+evenodd,C,1,black,C,2);

输出结果如下:

这还不错,但我觉得这不是最优雅的做法。此外,我觉得过渡区域(一个径向阴影与另一个径向阴影相交的地方)并不像我希望的那样平滑。我想实现的另一件事是“椭圆”等效,radialshade但我还没有找到解决方案。

我真的很喜欢 TikZ 的这种行为。在这里,我可以声明一个径向阴影,这样我就可以给出中间颜色以及它们的径向位置。此外,径向阴影还可以适应它们所使用的形状,以便以椭圆形的方式对椭圆进行着色。此外,还有一些很好的方法来扭曲阴影,即通过指定一个不同的中心,{0, 0}在某些情况下非常方便(但当然,radialshade也可以使用来实现这种效果)。示例:

\documentclass{standalone}

\usepackage[svgnames]{xcolor}
\usepackage{tikz}

\pgfdeclareradialshading{normal}{\pgfqpoint{0bp}{0bp}}{%
  color(0bp)=(white);
  color(10bp)=(red!90!black);
  color(20bp)=(black!75!red);
  color(30bp)=(black);
  color(100bp)=(black)}

\pgfdeclareradialshading{distorted}{\pgfqpoint{10bp}{10bp}}{%
  color(0bp)=(white);
  color(10bp)=(red!90!black);
  color(20bp)=(black!75!red);
  color(30bp)=(black)}

\begin{document}

\begin{tikzpicture}
  \shade [shading=normal] (-1, 3.5) circle (1.5cm);
  \shade [shading=distorted] (3, 3.5) circle (1.5cm);
  \shade [shading=normal] (-3, 0) ellipse (2 and 1.5);
  \shade [shading=distorted] (2.00, 0.0) ellipse (2 and 1.5);
  \shade [shading=normal] (5.00, -1.5) rectangle (7, 1.5);
\end{tikzpicture}

\end{document}

在此处输入图片描述

实现 TikZ 示例的外观的最佳方法是什么?

答案1

这个怎么样?

在此处输入图片描述

settings.outformat="pdf";
size(5cm);
import graph;

pen[] pens = new pen[] {white, 0.9*red + 0.1*black, 0.75*black + 0.25*red, black};
path outerpath = ellipse((0,0), 2, 1.5);
path innerpath = (1,0.8);

path midpath(path p1, path p2, real t) {
  pair f(real s) {
    return (1-t)*relpoint(p1, s) + t*relpoint(p2, s);
  }
  path p = graph(f, 0, 1, operator ..) -- cycle;
  return p;
}

int lastpath = pens.length - 1;
path[] paths = new path[lastpath + 1];
for (int i = 0; i <= lastpath; ++i) {
  paths[i] = midpath(innerpath, outerpath, i/lastpath);
}

draw(paths, pens);

相关内容