You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:31:07