見出し画像

高校数学10分プログラミング(数学B編 2.空間のベクトル)8日目「球面の方程式を考える」

マガジンリスト > 数学B編 2.空間のベクトル > 8日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学B編 2.空間のベクトル)の8日目です。

本日の課題は、球面の方程式を用いて球面を描くプログラムを作成することです。


球面の方程式

中心が$${\mathrm{C}(a,b,c)}$$、半径が$${r}$$の球面の方程式は

$$
(x-a)^2+(y-b)^2+(z-c)^2=r^2
$$

一般形

$$
x^2+y^2+z^2+kx+ly+mz+n=0 (\mathrm{ただし、} k^2+l^2+m^2-4n>0)
$$


課題

次のような球面の方程式を求めて、その球面を空間上に描くプログラムを作成してください。

(1) 中心が原点、半径が$${2}$$の球面
(2) 中心が$${\mathrm{C}(1,2,3)}$$、半径が$${3}$$の球面
(3) 中心が$${\mathrm{C}(1,3,-1)}$$で、点$${\mathrm{A}(5,-1,1)}$$を通る球面
(4) 2点$${\mathrm{A}(-1,2,3),\mathrm{B}(3,6,-1)}$$を直径の両端とする球面


ヒント

プログラミング言語 Processing では、球面を描くための関数 sphere が用意されています。

void sphere(r)

r:球面の半径 float 型

今回は、この sphere 関数を利用して、右手座標系上に中心を$${\vec{c}=(x_c,y_c,z_c)}$$、半径を$${r}$$とする球面を描く関数 sphere_rhs を pde ファイル「tools_rhs.pde」に準備していますので、これを利用します。


プログラム

今回の課題の球面の方程式を用いて球面を描くプログラムをスケッチ「drawSpheres」として準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。

展開または解凍して得られるスケッチ「drawSpheres」の中のpdeファイル「drawSpheres.pde」をダブルクリックしてスケッチ「drawSpheres」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawSpheres」タブを選択すると、そのテキストエリアに以下のソースコードが書かれています。

// 球面を描く

float range; // 座標系での表示範囲-range≦x,y.z≦range
float res; // 座標系のサイズをキャンバスのサイズに変換するパラメータ
float angle = 0.0;

PVector c1,c2,c3,c4; // 問題の球面の中心位置を表わすベクトル
float r1,r2,r3,r4;// 問題の球面の半径
PVector a3; // 問題(3)の点Aを表わすベクトル
PVector a4, b4; // 問題(4)の点A,Bを表わすベクトル

void setup(){
  size(400, 400, P3D);
  noFill();
  ortho();
  range = 10.0; 
  res = width / 2.0 / range;

  // (1)中心が原点、半径が2の球面
  c1 = new PVector(0.0,0.0,0.0);
  r1 = 2.0;

  // (2)中心がC(1,2,3)、半径が3の球面
  c2 = new PVector(1.0,2.0,3.0);
  r2 = 3.0;

  // (3)中心がC(1,3,-1)で、点A(5,-1,1)を通る球面
  a3 = new PVector(5.0,-1.0,1.0);
  c3 = new PVector(1.0,3.0,-1.0);
  r3 = 

  // (4)2点A(-1,2,3)、B(3,6,-1)を直径の両端とする球面
  a4 = new PVector(-1.0,2.0,3.0);
  b4 = new PVector(3.0,6.0,-1.0);
  c4 = 
  r4 = 
  
  println("r3=", r3);
  println("c4=", c4);
  println("r4=", r4);
  
}

void draw(){
  background(204); // 背景をグレーにする
  // 視点を設定する
  camera(200.0, -200.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0);
  // マウスボタンが押されたときの処理
  if(mousePressed){ 
    if( mouseButton == LEFT ){ // 左ボタンがおされたときはz軸時計周りに回転
      angle = angle + 1.0;
    } else if( mouseButton == RIGHT ){ // 右ボタンがおされたときはz軸反時計周りに回転
      angle = angle -1.0;
    } else {
    }
  }
  // z軸周りに回転
  rotateZ(radians(angle));

  // 座標軸の設定
  fill(255,0,0);
  stroke(255,0,0);
  arrow3D(0.0,0.0,0.0,range * res,0.0,0.0); // x軸(赤色)
  fill(0,255,0);
  stroke(0,255,0);
  arrow3D(0.0,0.0,0.0,0.0,range * res,0.0); // y軸(緑色)
  fill(0,0,255);
  stroke(0,0,255);
  arrow3D(0.0,0.0,0.0,0.0,0.0,range * res); // z軸(青色)

  noFill();
  stroke(0,0,0);
  // 以下に、図形を描いていく

  // (1)中心が原点、半径が2の球面 (黄色)
  strokeWeight(5);
  stroke(255,255,0);
  point_rhs(c1.copy().mult(res));
  strokeWeight(1);
  stroke(255,255,0,20);
  noFill();
  sphere_rhs(c1.copy().mult(res), r1*res);
  
  // (2)中心がC(1,2,3)、半径が3の球面(水色)
  strokeWeight(5);
  stroke(0,255,255);
  point_rhs(c2.copy().mult(res));
  strokeWeight(1);
  stroke(0,255,255,20);
  noFill();
  sphere_rhs(c2.copy().mult(res), r2*res);
  
  // (3)中心がC(1,3,-1)で、点A(5,-1,1)を通る球面(桃色)
  strokeWeight(5);
  stroke(255,0,255);
  point_rhs(c3.copy().mult(res));
  point_rhs(a3.copy().mult(res));
  strokeWeight(1);
  stroke(255,0,255,20);
  noFill();
  sphere_rhs(c3.copy().mult(res), r3*res);
  
  // (4)2点A(-1,2,3)、B(3,6,-1)を直径の両端とする球面(白色)
  strokeWeight(5);
  stroke(255,255,255);
  point_rhs(a4.copy().mult(res));
  point_rhs(b4.copy().mult(res));
  strokeWeight(1);
  stroke(255,255,255,50);
  noFill();
  sphere_rhs(c4.copy().mult(res), r4*res);

}

ソースコード1 球面の方程式を用いて球面を描くプログラム(未完成)

このソースコード1の setup 関数内の課題(3)の球面の半径 r3 、課題(4)の球面の中心 c4 と半径 r4 を与える部分

  // (3)中心がC(1,3,-1)で、点A(5,-1,1)を通る球面
  a3 = new PVector(5.0,-1.0,1.0);
  c3 = new PVector(1.0,3.0,-1.0);
  r3 = 

  // (4)2点A(-1,2,3)、B(3,6,-1)を直径の両端とする球面
  a4 = new PVector(-1.0,2.0,3.0);
  b4 = new PVector(3.0,6.0,-1.0);
  c4 = 
  r4 = 

は未完成です。それぞれの課題の球面の方程式を求めた上で、各値を記述してプログラムを完成させてください。


それでは、よろしくお願いします。

MK's papa

いいなと思ったら応援しよう!