8章 三角比の計算

∠Cが直角の直角三角形ABCにおいて、直角をはさむ2辺の長さを図のようにa,bとし、残りの1辺をcとするとき、各辺間の関係を
![]()
と書き、それぞれ∠Aのタンジェント(正接)、コサイン(余弦)、サイン(正弦)と読む。正弦、余弦、正接をまとめて三角比と呼んでいる。(高校数学の教科書より抜粋)
いくつかの簡単な具体例を示しておこう。

左の直角三角形1は、正三角形を辺ACの位置で半分に切ってできる。∠Bはもとの正三角形の頂点そのものなので60°、∠Aは頂点の角度が半分になっているので、30°である。aの長さはcの長さの半分であるから、cの長さを2とするなら、aの長さは1である。bの長さをもとめると(ピタゴラスの定理)、
![]()
であることにより、
![]()
となる。この結果を用いて、

右の直角三角形2は、正方形を対角線上で半分に切ったものに等しい。正方形の各頂点の内角はそれぞれ90°であるから、∠A,∠Bの値はその半分の45°となる。a, bの長さをそれぞれ1とするなら、cの長さは、
![]()
となる。この結果を用いて、三角形2の三角比をもとめると、

となる。
さてここで、左の直角三角形で辺c,aの値の組を何通りか与えてみよう。
cの値 aの値
2
1
10
5
120
60
この例では、aの値は常にcの値の半分であることから推測出来るように、三角形の各頂点の角度と、cの値が与えられているなら、aの値は三角比を使ってもとめることができる。つまり、cの値にsinAの値
![]()
をかければよい。この他の辺どうしの組合せでも同様のことが確認できる。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
円は、ある1つの点から一定の距離にある点の集まりである。直交座標系(軸をx、yとする)を用いて表現すると、距離(半径)を
として、
![]()
となるが、コンピュータ上での作図の場合には極座標系を用いると都合がよい。極座標系では、原点からの距離と、基準となる軸からの角度で点の位置を表現する。つまり、距離を
、角度を
(シータと読む)とすると、
![]()
これを図示すると以下のようになる。

前述の三角比の知識を用いて、角度が0から90度まで変化する場合に、半径1の円の座標をもとめてみる。
|
角 度 |
x |
y |
|
0 |
1 |
0 |
|
30 |
|
|
|
45 |
|
|
|
60 |
|
|
|
90 |
0 |
1 |
得られたxとyの値を図示すると次のようになる。

実際の円の作図では、角度の値を一定量ずつ増加させながら、極座標の式を用いてもとめた座標の位置を順に線分でつないでいくことになる。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
円の作図プログラム)
(先頭部分省略)
procedure TForm1.Button1Click(Sender: TObject);
var
pi, th, incr, r, x, y: real;
i, n_div, xc, yc: integer;
begin
pi := 3.1415; //(円周率)
r := 100; //(円の半径)
n_div := 100; //(円周の分割数)
incr := 2 * pi / n_div;
xc := 200; yc := 200; //(作図中心)
th := 0; //(角度)
for i:= 1 to n_div+1 do begin
x := r * cos(th); //(x座標の計算)
y := r * sin(th); //(y座標の計算)
if i = 1 then Canvas.MoveTo( xc+round(x), yc - round(y) )
else Canvas.LineTo( xc+round(x), yc - round(y) );
th := th + incr; //(角度の増分値を加算)
end;
end;
end.
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
補足説明1: ラジアンの計算
三角関数の値を計算するためには、角度を度からラジアンに変換する必要がある。180度が?(パイ)ラジアンに相当する。いくつかの代表的な例を以下に記す。
度とラジアンの関係(数値例):
度 ラジアン
0 0
30 π/6
45 π/4
60 π/3
90 π/2
180
π
270
3π/2
360 2π
補足説明2: 作図上の注意
以下の図は、分割数(n_div)を10とした場合である。上記のプログラムで、
(1) iの値が1のときに、MoveTo命令を使う理由
(2) for 文の終端のiの値が n_div + 1 までである理由
を考えてみよう。まず、(1)の場合には、このときの角度が0であることと、現在のペン(実際のものではなく、画面上の仮想的なもの)の位置が通常は画面の(0,0)の位置にあるので、最初からLineTo命令を使ってしまうと、(0,0)の位置から、円の描き始めの位置まで余分な線分が描かれてしまうからである。(2)の場合については、図から明らかであろう。

基本的な考え方を理解すれば、上記のプログラムを少し変更するだけで、以下のように、点線で円を描いたり、円周上に「ギザギザ」を付けたりすることは容易である。

( 注) これら2つの例では、円周の分割数は100である。 )
点線で円を描く場合のプログラムは以下のようになる。奇数番目から偶数番目に点に移るときにLineTo命令で線を描いていることがわかる。
procedure TForm1.Button1Click(Sender: TObject);
var
pi, th, incr, r, x, y: real;
i, n_div, xc, yc: integer;
begin
pi := 3.1415;
r := 100;
n_div := 100;
incr := 2 * pi / n_div;
xc := 200; yc := 200;
th := 0;
for i:= 1 to n_div+1 do begin
x := r * cos(th);
y := r * sin(th);
if i mod 2 <> 0 then Canvas.MoveTo( xc+round(x), yc - round(y) )
else Canvas.LineTo( xc+round(x), yc - round(y) );
th := th + incr;
end;
end;
end.
円周にギザギザをつける場合には、2つの半径を準備しておいて、奇数番目の点と偶数番目の点とで交互に半径の値を入れ替ればよい。(各自で試してみよう)
→解答へ
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
円を描くプログラムで、円周上の各点と円の中心とを結ぶと下図左のように、三角形が中心の周りに回転したような図形が得られ、さらに偶数番目の三角形のみを選択してを描くと下図右のようになる。
この場合、最初に描かれる三角形の辺の作図順は、中心→点2→点3→中心 の順に点の間を線でつないでいったものになっている。

(注:円周を10等分)
以下のプログラムは右の図を描くためのものである。
プログラミング:
procedure TForm1.Button1Click(Sender: TObject);
var
pi, th, incr, r, x1, y1, x2, y2 : real;
i, n_div, xc, yc: integer;
begin
pi := 3.1415; //(円周率)
r := 100; //(半径)
n_div := 10; //(円周の分割数)
incr := 2 * pi / n_div; //(角度の増分)
xc := 200; yc := 200; //(作図中心)
th := 0;
x1 := r * cos(th);
y1 := r * sin(th);
for i:= 1 to n_div+1 do begin
th := th + incr;
x2 := r * cos(th);
y2 := r * sin(th);
if i mod 2 = 0 then begin
Canvas.MoveTo( xc, yc );
Canvas.LineTo( xc+round(x1), yc - round(y1) );
Canvas.LineTo( xc+round(x2), yc - round(y2) );
Canvas.LineTo( xc, yc );
end;
x1 := x2;
y1 := y2;
end;
end;
end.
注) 三角形の内部の塗りつぶしを行ないたい場合には、作図の部分を次のように書き換えればよい。
Canvas.Brush.Color := clGreen;
Canvas.Polygon( [ Point(xc,yc),
Point(xc+round(x1), yc - round(y1) ),
Point(xc+round(x2), yc - round(y2) ) ] );
(注:塗りつぶし色を緑にしている。)
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
8−4 円を描くプログラムの応用(2)
放射状に描かれた四角形: これは、前述の三角形の頂点部分を切り取った例である。

分割数:20 分割数:
procedure TForm1.Button1Click(Sender: TObject);
var pi, th, incr, r1, r2, x1, y1, x2, y2, x3, y3, x4, y4: real;
i, n_div, xc, yc: integer;
begin
pi := 3.1415;
r1 := 120;
r2 := 70;
n_div := 20;
incr := 2 * pi / n_div;
xc := 200; yc := 200;
th := 0;
x1 := r1 * cos(th);
y1 := r1 * sin(th);
x3 := r2 * cos(th);
y3 := r2 * sin(th);
for i:= 1 to n_div do begin
th := th + incr;
x2 := r1 * cos(th);
y2 := r1 * sin(th);
x4 := r2 * cos(th);
y4 := r2 * sin(th);
if i mod 2 = 0 then begin
Canvas.MoveTo( xc+round(x1), yc - round(y1) );
Canvas.LineTo( xc+round(x2), yc - round(y2) );
Canvas.LineTo( xc+round(x4), yc - round(y4) );
Canvas.LineTo( xc+round(x3), yc - round(y3) );
Canvas.LineTo( xc+round(x1), yc - round(y1) );
end;
x1 := x2;
y1 := y2;
x3 := x4;
y3 := y4;
end;
end;
end.
注) 四角形の内部の塗りつぶしを行ないたい場合には、作図の部分を次のように書き換えればよい。
Canvas.Brush.Color := clRed;
Canvas.Polygon( [ Point( xc+round(x1), yc
- round(y1) ),
Point( xc+round(x2), yc - round(y2) ),
Point( xc+round(x4), yc - round(y4) ),
Point( xc+round(x3), yc - round(y3) ) ] );
(注:塗りつぶし色を赤にしている。)
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
補足説明:
上記の例において、半径と座標の対応は次の通りである。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
上述の円の場合と同様な方法で楕円を描くことができる。楕円の式は、楕円の曲線上の点の座標を
、長径を
、短径を
とすると、極座標系において次式で与えられる。
![]()
これを変形して直交座標系で表すと、
![]()
参考) 上式の変形過程

楕円の特別な場合として、
とすると、
![]()
これを変形して、

となり、円の式を得る(下図参照)。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
楕円作図例1: 長径が200、短径が100の楕円を描く。円周は100等分する。(図は省略)
procedure TForm1.Button1Click(Sender: TObject);
const pi = 3.1415;
var
x, y, a, b, incr, th, angle: real;
i, n, xc, yc, xi, yi : integer;
begin
n := 100;
a := 200;
b := 100;
xc := 300;
yc := 200;
angle := 0;
incr := 360 / n;
Canvas.MoveTo(xc+round(a),yc);
for i := 1 to n do
begin
angle := angle + incr;
th := pi * angle / 180;
x := a * cos(th);
y := b * sin(th);
xi := round(xc + x);
yi := round(yc - y);
Canvas.LineTo(xi,yi);
end;
end;
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
楕円作図例2: 楕円の長径の値を変えながら作図
楕円の長径、短径の初期値をそれぞれ、
として、
になるまで
の値を徐々に減少させながら作図を行う。楕円の特別な場合として円が描けることを確認する。
作図結果:

プログラム
procedure TForm1.Button1Click(Sender: TObject);
const pi = 3.1415;
var
x, y, a, b, incr, th, angle: real;
i, n, xc, yc, xi, yi : integer;
begin
n := 200;
a := 200;
b := 100;
xc := 300;
yc := 200;
incr := 360 / n;
while ( a >= 100 ) do
begin
angle := 0;
Canvas.MoveTo(xc+round(a),yc);
for i := 1 to n do
begin
angle := angle + incr;
th := pi * angle / 180;
x := a * cos(th);
y := b * sin(th);
xi := round(xc + x);
yi := round(yc - y);
Canvas.LineTo(xi,yi);
end;
a := a - 20;
end;
end;