見出し画像

高校数学をプログラミングで解く(数学III編)「2-9 極座標」

割引あり

マガジンリスト > 数学Ⅲ編 2.式と曲線 > 2-9 極座標


はじめに

今回は、数学IIIで学ぶ「極座標」について、平面上の点の座標を直交座標から極座標に変換するプログラム、および極座標から直交座標に変換するプログラムを作成します。

極座標と直交座標の関係

まず、極座標と直交座標の関係について解説します。

点$${\mathrm{P}}$$の極座標$${(r, \theta)}$$と直交座標$${(x,y)}$$の間には、次の関係がある。

① $${x=r \cos \theta, \ \ y = r \sin \theta}$$

② $${r= \sqrt{x^2+y^2}, \ \ \theta = \tan^{-1} (y/x) }$$

    特に、$${r \neq 0}$$のとき

$$
\cos \theta = \frac{x}{r}, \ \ \sin \theta = \frac{y}{r}
$$

なお、極座標の$${r}$$を動径、$${\theta}$$を偏角と呼びます。

図1 直交座標と極座標との関係

直交座標から極座標への変換

それでは、次の問題1を例にして、直交座標から極座標への変換を行うプログラムを作成していきます。

問題1
直交座標が次のような点の極座標$${(r, \theta)}$$を求めよ。ただし、$${0 \leq \theta < 2 \pi}$$とする。

$$
\mathrm{(1)} \ (4,4), \ \ \ \ \ \ \mathrm{(2)} \ (-2,-2 \sqrt{3}), \ \ \ \ \ \ \mathrm{(3)} \ (3,-\sqrt{3})
$$

アルゴリズム設計

今回は、直交座標から極座標に変換する関数を準備した上で、問題1の結果をコンソールに出力するプログラムを作成していきます。
直交座標から極座標に変換する関数は、上記極座標と直交座標の関係②を利用することで比較的簡単に準備することができますが、2点ほどポイントがあります。
1つ目は直交座標から極座標に変換する関数の返り値が極座標$${(r,\theta)}$$と、2つの変数になることです。そこで今回は、PVectorクラスを利用することにします。つまり、PVectorクラスの x 成分を動径$${r}$$に、PVectorクラスの y 成分を偏角$${\theta}$$にそれぞれ対応させることで極座標$${(r,\theta)}$$を1つの変数として扱うようにします。
2つ目は極座標の偏角$${\theta}$$を計算するためにProcessingで用意されている関数 atan2 を利用しますが、atan2 関数の返り値が$${-\pi}$$から$${\pi}$$までになっていることです。今回求めたい結果は$${0 \leq \theta < 2 \pi}$$です。そこで、atan2 関数で求めた偏角が負の値を持つ場合は$${2 \pi}$$を加えることで、偏角$${\theta}$$が$${-\pi < \theta < 0}$$の範囲ではなく、$${\pi < \theta < 2 \pi}$$の範囲になるように調整します。

プログラム

それでは、直交座標から極座標に変換するプログラムを作成します。

// 直交座標から極座標への変換を行うプログラム
void setup(){

  PVector polor; // 極座標(r,theta)を格納する変数
  float x, y; // 直交座標(x,y)
  
  // (1)
  x = 4.0;
  y = 4.0;
  polor = rect2polor(x,y);
  println("(1)(", polor.x, ",", degrees(polor.y), ")");

  // (2)
  x = -2.0;
  y = -2.0*sqrt(3.0);
  polor = rect2polor(x,y);
  println("(2)(", polor.x, ",", degrees(polor.y), ")");

  // (3)
  x = 3.0;
  y = -sqrt(3.0);
  polor = rect2polor(x,y);
  println("(3)(", polor.x, ",", degrees(polor.y), ")");

}

// 直交座標から極座標に変換する関数
PVector rect2polor(
  float x, // x座標
  float y  // y座標
){
  // 動径成分
  float r = sqrt(x*x+y*y);
  // 偏角成分
  float theta = atan2(y,x);
  if(theta < 0.0){
    theta = theta + 2.0 * PI;
  }
  PVector polor = new PVector(r, theta);
  return polor;
}

ソースコード1 直交座標から極座標に変換するプログラム

なお、ソースコード1では、関数 degrees を用いて偏角$${\theta}$$を弧度法(ラジアン)から度数法(°)に変換したあと、コンソールに出力するようにしています。

ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「trans_rect2polor」としています)、テキストエディタ部分に書いて実行します。

図2 スケッチ「trans_rect2polor」の実行結果

図2のように、問題1の結果がコンソールに出力されます。

(1)( 5.656854 , 45.0 )
(2)( 4.0 , 240.0 )
(3)( 3.4641016 , 330.0 )

これらの結果が正しいことは解析的な計算で確認しておいてください。

極座標から直交座標への変換

今度は、問題2を例にして、極座標から直交座標への変換を行うプログラムを作成していきます。

問題2
極座標が次のような点の直交座標$${(x, y)}$$を求めよ。

$$
\mathrm{(1)} \ \left(3,\frac{\pi}{4} \right), \ \ \ \ \ \ \mathrm{(2)} \ \left( 2,\frac{2}{3} \pi \right), \ \ \ \ \ \ \mathrm{(3)} \ \left( 2,\frac{4}{3}\pi \right)
$$

アルゴリズム設計

こちらも、極座標から直交座標に変換する関数を準備した上で、問題2の結果をコンソールに出力するプログラムを作成していきます。
極座標から直交座標に変換する関数は、上記極座標と直交座標の関係①を利用することで簡単に準備することができますが、極座標から直交座標に変換する関数の返り値が直交座標$${(x,y)}$$と2つの成分になりますので、こちらでも返り値にはPVectorクラスを利用することにします。

プログラム

それでは、極座標から直交座標に変換するプログラムを作成します。

// 極座標から直交座標への変換を行うプログラム
void setup(){

  PVector rec; // 直交座標(x,y)を格納する変数
  float r, theta; // 極座標(r,theta)
  
  // (1)
  r = 3.0;
  theta = PI/4.0;
  rec = polor2rect(r,theta);
  println("(1)(", rec.x, ",", rec.y, ")");

  // (2)
  r = 2.0;
  theta = 2.0/3.0*PI;
  rec = polor2rect(r,theta);
  println("(2)(", rec.x, ",", rec.y, ")");

  // (3)
  r = 2.0;
  theta = 4.0/3.0*PI;
  rec = polor2rect(r,theta);
  println("(3)(", rec.x, ",", rec.y, ")");

}

// 極座標から直交座標に変換する関数
PVector polor2rect(
  float r, // 動径
  float theta  // 偏角
){
  // x成分
  float x = r * cos( theta );
  // y成分
  float y = r * sin( theta );

  PVector rec = new PVector(x,y);
  return rec;
}

ソースコード2 極座標から直交座標に変換するプログラム

ソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「trans_polor2rect」としています)、テキストエディタ部分に書いて実行します。

図3 スケッチ「trans_polor2rect」の実行結果

図3のように、問題2の結果がコンソールに出力されます。

(1)( 2.1213202 , 2.1213202 )
(2)( -1.0000001 , 1.7320508 )
(3)( -0.9999998 , -1.7320509 )

これらの結果が丸め誤差の範囲で正しいことは解析的な計算で確認しておいてください。

まとめ

今回は、数学IIIで学ぶ「極座標」について、平面上の点の座標を直交座標から極座標に変換するプログラム、および極座標から直交座標に変換するプログラムを作成しました。
今回作成した座標変換のプログラムは、極座標と直交座標の関係の節で説明した変換式を利用することで比較的簡単にその関数を準備することができました。工夫した点としては、関数の返り値が2つの(float型の)変数をもつためPVectorクラスを利用したこと、偏角$${\theta}$$を求めるために atan2 関数で求めた結果が$${0 \leq \theta < 2 \pi}$$の範囲に入るように調整したことなどです。
一般に、プログラミングを行う際には様々な工夫が必要になってきますので、今回のような簡単な例で経験を積んで今後に活かせるようにしましょう。


読んだ感想などをお寄せください

本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。感想、質問をいただいた方には本記事の演習問題の解答をプレゼントします。(お問合せフォームの本文に、本記事のタイトルを入れてください。)


参考文献

改訂版 教科書傍用 スタンダード・オリジナル 数学III(数研出版、ISBN9784410209567)


演習問題

極が$${\mathrm{O}}$$の極座標に関して、2点

$$
\mathrm{A} \left( 2, \frac{\pi}{6} \right), \ \ \mathrm{B} \left( 4, \frac{5}{6} \pi \right)
$$

があるとき、線分$${\mathrm{AB}}$$の長さと$${\triangle \mathrm{OAB}}$$の面積を求めて、それらの結果をコンソールに出力するプログラムを作成してください。なお、点$${\mathrm{A,B}}$$の直交座標への変換は行わないようにしてください。


演習問題の解答例

ここから先は

375字 / 1画像 / 1ファイル

この記事が気に入ったらサポートをしてみませんか?