【円弧-20】緯線による球の表現

シェアする

球の方程式を使って、緯線で球を表現します。参考書籍ではz軸がマイナスの時、陰線処理をしています。
陰線処理は簡易なものなので、線と線が開いたり離れたりします。
マイナスの値は図形の回転角度や緯線と緯線の間隔によって違ってくるので、見た目合わせが必要です。
またそのままでは円の周りがデコボコして綺麗ではないので、円で輪郭線を描いて陰線処理部分を目立たなくしています。

参考:数式によるパソコン・グラッフィクスのテクニック/著者:依田 谹(ヨダ コダマ)/昭和61年8月1日初版発行/発行所:一橋出版株式会社
※一橋出版株式会社は2009年に倒産


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
74
75
76
77
78
79
80
81
82
%!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:2014年11月30日日曜日11:35:39
%%ModificationDate:2018年10月4日 木曜日21:24:04

% 数式によるパソコン・グラッフィクスのテクニック
% 著者:依田 谹(ヨダ コダマ)
% 昭和61年8月1日初版発行
% 発行所:一橋出版株式会社
% 球の方程式
% x=r*sin(th)*sin(th2)
% y=r*cos(th2)
% z=r*cos(th)*sin(th2)

% ================ 座標変換 ================
360 360 translate
1 dup scale
% ================ 背景 =================
0 0 0 setrgbcolor
-360 360 720 -720 rectfill
% ================ 定義 ================
1 1 1 setrgbcolor
1 setlinewidth
/p 180 def % 円の角度
/n 20 def % 緯度(横)・経度(縦) の数
/k p n div def % th2の角度
/xa -45 def % 球のX軸角度 a:angle
/ya -45 def % 球のY軸角度
/za 0 def % 球のZ軸角度
/r 300 def % 球のサイズ
% ================================================
%  プロシージャ
% ================================================
% 図形の回転
/rotation {
% x軸角度
  /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
% y軸角度
  /x2 x1 ya cos mul z1 ya sin mul add def
  /y2 y1 def
  /z2 x1 neg ya sin mul z1 ya cos mul add def
% Z軸角度
  /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
% 描画
/line {
  /px x3 def
  /py y3 neg def
  sw 1 eq { px py lineto }{ px py moveto } ifelse
  /sw 1 def
} def

% ================================================
%  メイン
% ================================================
newpath % パスの初期化
0 0 r 0 360 arc % 輪郭線

% ================ 球の関数 % % 緯度(横)
0 k p { % 緯線の角度
 /th2 exch def
 /sw 0 def % 余計な線を出さない
 0 1 2 p mul { % 緯線の円
  /th exch def
  /x r th sin mul th2 sin mul def
  /y r th2 cos mul def
  /z r th cos mul th2 sin mul def
  rotation % 図形の回転
  % 陰線処理 z3の負の値は回転角度によって変える
  z3 -10 lt { /sw 0 def } { line } ifelse
 } for
} for
stroke

PostScriptはベクターグラフィックスなのでこの場合は陰線処理は必要ありません。
オブジェクトとして描画していくので後ろにある図形は前にある図形で隠されていくからです。
下記が陰線処理を除いた変更例です。メインのみ掲載しています。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% ================================================
%  メイン
% ================================================
newpath % パスの初期化
%0 0 r 0 360 arc % 輪郭線

% ================ 球の関数 % % 緯度(横)
0 2 p { % 緯線の角度
 /th2 exch def
 /sw 0 def % 余計な線を出さない
 0 1 2 p mul { % 緯線の円
  /th exch def
  /x r th sin mul th2 sin mul def
  /y r th2 cos mul def
  /z r th cos mul th2 sin mul def
  rotation % 図形の回転
  % 陰線処理 z3の負の値は回転角度によって変える
  line % 新規追加
  %z3 -20 lt { /sw 0 def } { line } ifelse これを削除
  } for
 gsave 0.47 0.49 0.6 setrgbcolor fill % 新規追加 塗り色
 grestore 1 0 1 setrgbcolor stroke % 新規追加 線の色
} for
% stroke