【曲線-29】螺旋(弦巻線)を描いてみよう

螺旋 (helix)はしばしば渦巻き (spiral)と混用されて使用されています。
2次元曲線は渦巻き線、3次元曲線は螺旋なのですが、2次元曲線でも螺旋と言ったりしています。 例えば対数螺旋やフェルマー螺旋など
ここでは平面の螺旋と区別するために弦巻線と呼びます。

曲線を立体的に見せるため図形を回転させています。角度や段数、サイズ、線幅などを変えると様々な図形が描けます。

弦巻線の式
x=r*cos(th)
y=r*sin(th)
z=c*th


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 720 720
%%HiResBoundingBox: 0 0 720 720
%%CropBox: 0 0 720 720
%%Title:弦巻き曲線
%%Creator:Studio Fruit Jam / Toyokazu Nishi
%%Copyright:Studio Fruit Jam / Toyokazu Nishi
%%CreationDate:2018年11月4日 日曜日7:22:14

% Helixの式
% x=r*cos(th)
% y=r*sin(th)
% z=c*th

% ================ 座標変換 ================
360 360 translate
1 dup scale
% ================ 背景 =================
0 0 0 setrgbcolor
-360 360 720 -720 rectfill
% ================ 定義 ================
1 1 1 setrgbcolor
1 setlinewidth  % 線幅を1ポイントにする
/xa 30 def              % 弦巻きのX軸角度 a:angle
/ya 0 def               % 弦巻きのY軸角度
/za 30 def              % 弦巻きのZ軸角度
/r 100 def              % 弦巻きのサイズ
/k 10 def               % 段数
/L 600 def              % 弦巻きの長さ
/c L k div 360 div def  % 1段の高さ
% 原点で回転させるための繰り返し範囲
/Kmin 360 k 2 div mul neg def   % 段数最低値
/Kmax 360 k 2 div mul def       % 段数最高値
/sw 0 def

% ================ プロシージャ================
% 図形の回転
/rotation {
        /x1 x def
        /y1 y xa cos mul z xa sin mul sub def
        /z1 y xa sin mul z xa cos mul add def
       
        /x2 x1 ya cos mul z1 ya sin mul add def
        /y2 y1 def
        /z2 z1 ya cos mul x1 ya sin mul sub def
       
        /x3 x2 za cos mul y2 za sin mul sub def
        /y3 x2 za sin mul y2 za cos mul add def
        /z3 z2 def
} def
% ================ メイン================
newpath % パスの初期化

Kmin 1 Kmax {
        /th exch def
        % Helixの式
        /x r th cos mul def
        /y c th mul def % y軸に螺旋を伸ばすためyとzの式を交換
        /z r th sin mul def
        rotation        % 回転
        sw 0 eq {x3 y3 moveto /sw 1 def }
        {x3 y3 lineto } ifelse 
} for
stroke
応用として中心部から弦巻線に向かって線を伸ばしたものを描きます。アクセントとして赤い円を付けました。 中心部、弦巻線のそれぞれの座標を計算し回転させて繋げています。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 720 720
%%HiResBoundingBox: 0 0 720 720
%%CropBox: 0 0 720 720
%%Title:弦巻き曲線
%%Creator:Studio Fruit Jam / Toyokazu Nishi
%%Copyright:Studio Fruit Jam / Toyokazu Nishi
%%CreationDate:2018年11月5日 月曜日午前11:05:33

% Helixの式
% x=r*cos(th)
% y=r*sin(th)
% z=c*th

% ================ 座標変換 ================
360 360 translate
1 dup scale
% ================ 背景 =================
0 0 0 setrgbcolor
-360 360 720 -720 rectfill
% ================ 定義 ================
1 1 1 setrgbcolor
1 setlinewidth  % 線幅を1ポイントにする
/xa 30 def              % 弦巻きのX軸角度 a:angle
/ya 0 def               % 弦巻きのY軸角度
/za 30 def              % 弦巻きのZ軸角度
/r 100 def              % 弦巻きの径サイズ
/k 6 def                % 段数
/L 600 def              % 弦巻きの長さ
/c L k div 360 div def  % 1段の高さ
% 原点で回転させるための繰り返し範囲
/Kmin 360 k 2 div mul neg def   % 段数最低値
/Kmax 360 k 2 div mul def       % 段数最高値
/sw 0 def
% ================ プロシージャ================
% 図形の回転
/rotation {
        /x1 x def
        /y1 y xa cos mul z xa sin mul sub def
        /z1 y xa sin mul z xa cos mul add def
       
        /x2 x1 ya cos mul z1 ya sin mul add def
        /y2 y1 def
        /z2 z1 ya cos mul x1 ya sin mul sub def
       
        /x3 x2 za cos mul y2 za sin mul sub def
        /y3 x2 za sin mul y2 za cos mul add def
        /z3 z2 def
} def

% ================ メイン================
newpath % パスの初期化

Kmin 10 Kmax {
        /th exch def
        % 中心部の計算
        /x th cos def
        /y c th mul def
        /z th sin def
        rotation
        1 1 1 setrgbcolor
        x3 y3 50 sub moveto % 中心を-y軸方向に50ずらす
       
        % 螺旋の計算
        /x r th cos mul def
        /y c th mul def
        /z r th sin mul def
        rotation
        x3 y3 lineto stroke % 白い線の描画
       
        1 0 0 setrgbcolor
        x3 y3 3 0 360 arc fill % 赤い円の描画
} for