如何用Postscript的for循环与ifelse条件绘制渐变嵌套圆环?
如何用PostScript的for循环与ifelse条件绘制目标图形?
我想先绘制一个大红色圆形,接着绘制更小的白色圆形、再更小的红色圆形……同时可见的红色要逐渐加深,所以需要用变量存储逐渐变化的颜色值。
我目前编写的完整代码:
50 50 translate /coordinate_system {0.5 0.3 0 0 setcmykcolor gsave 2 setlinewidth 500 0 moveto 0 0 lineto 0 500 lineto stroke grestore gsave 0.3 setlinewidth 9 { 30 100 moveto 500 100 lineto stroke 0 50 translate } repeat grestore gsave 0.3 setlinewidth 10 { 100 20 moveto 100 500 lineto stroke 50 0 translate } repeat grestore gsave /tekst 3 string def /Helvetica findfont 10 scalefont setfont 100 100 500 { /y exch def 5 y 2 sub moveto y tekst cvs show } for 90 100 500 { /x exch def x 5 moveto x 10 add tekst cvs show } for grestore 0 setgray } bind def /s { mark pstack pop } def coordinate_system
绘制圆环的代码片段:
100 100 translate %100 -3 0 {{1 0 0 setrgbcolor exch 0 exch 0 360 arc stroke}{0 0 0 setrgbcolor exch 0 exch 0 360 arc stroke} ifelse} for 3 4 lt {1 0 0 setrgbcolor 0 0 50 0 360 arc stroke}{0 0 0 setrgbcolor 0 0 100 0 360 arc stroke} ifelse
目标图形:

实现方案
以下是实现交替颜色且红色逐渐加深的嵌套圆形的代码,用for循环控制半径递减,ifelse切换颜色,同时动态调整红色饱和度:
% 设置圆心位置 200 200 translate % 初始化参数:起始半径、每次递减量、循环次数 /radius 100 def /step 10 def /count 8 def % 从外层到内层循环绘制圆形 count 1 -1 { % 计算红色深度:循环索引越小(越内层),红色越浓 /red_depth exch 1 count div sub def % 判断奇偶次循环,切换填充色 dup 2 mod 0 eq { % 偶数次:白色填充 1 1 1 setrgbcolor } { % 奇数次:红色填充,深度随内层递增 red_depth 0 0 setrgbcolor } ifelse % 绘制并填充圆形 0 0 radius 0 360 arc closepath fill % 更新半径,缩小下一个圆形 /radius radius step sub def } for
关键细节:
count 1 -1:控制循环从外层(大圆形)到内层(小圆形)执行8次red_depth:通过循环索引计算红色浓度,内层循环时数值更低,红色更饱和- 用
dup 2 mod 0 eq判断循环奇偶性,实现白红交替 - 每次循环半径减少
step,保证圆形依次缩小
如果习惯用CMYK颜色模式,可把红色填充代码替换为:
% CMYK红色:品红和黄色值越高,颜色越深 0 red_depth red_depth 0 setcmykcolor
内容的提问来源于stack exchange,提问作者Gryva
相关产品推荐
相关产品推荐

