見出し画像

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

マガジンリスト > 数学B編 2.空間のベクトル > 9日目 解説

本日の課題、おつかれさまでした。

課題の平面の方程式を用いて平面を描くプログラムを作成することができたでしょうか。


解答例

今回の課題の平面の方程式を用いて平面を描くプログラムの例を示します。

// 平面を描く

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

PVector a1; // 平面が通る点Aの座標
PVector n; // 平面の法線ベクトル

void setup(){
  size(400, 400, P3D);
  noFill();
  ortho();
  range = 10.0; 
  res = width / 2.0 / range;
  
  // 課題の点Aの座標と法線ベクトルn
  a1 = new PVector(1.0, 1.0, 1.0);
  n = new PVector(1.0, 2.0, 1.0);
    
}

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));

  // 座標軸の設定
  strokeWeight(1);
  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);
  // 以下に、図形を描いていく

  float a,b,c,d; // 平面の方程式の一般形の係数
  float alpha, beta, gamma; // 一般形をz= αx+βy+γの形にした時の係数

  // 平面上の点を表す座標
  PVector plane_point = new PVector(0.0,0.0,0.0);
  // 平面を点群で表わすときの各軸方向に並べる点の数
  int plot_num = 100;
  // 図形を描く範囲
  float m_range = -range/2.0;
  float p_range = range/2.0;

  // 課題の平面(黄色)
  // 平面のパラメータ
  a = n.x;
  b = n.y;
  c = n.z;
  d = -n.x*a1.x-n.y*a1.y-n.z*a1.z;
  alpha = -a/c;
  beta = -b/c;
  gamma = -d/c;

  // 点Aをプロットする
  strokeWeight(5);
  stroke(255,255,0);
  fill(255,255,0);
  point_rhs(a1.copy().mult(res));

  // 法線ベクトルを描く
  strokeWeight(1);
  arrow3D(a1.x*res,a1.y*res,a1.z*res,(n.x+a1.x)*res,(n.y+a1.y)*res,(n.z+a1.z)*res); 
  
  // 平面を描画
  stroke(255,255,0);
  for(int i=0; i<plot_num; i++){
    for(int j=0; j<plot_num; j++){
      plane_point.x = m_range + i*(p_range-m_range)/plot_num;
      plane_point.y = m_range + j*(p_range-m_range)/plot_num;
      plane_point.z = alpha * plane_point.x + beta * plane_point.y + gamma;
      point_rhs(plane_point.copy().mult(res)); 
    }
  }

}

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

ソースコード2を、スケッチ「drawPlane」のテキストエディタ部分に書いて実行すると、図1のように、実行ウィンドウのキャンバスに空間の座標系を表す3つの空間ベクトル(赤色:$${x}$$軸、緑色:$${y}$$軸、青色:$${z}$$軸)を基準にして、課題の点$${\mathrm{A}}$$の位置と法線ベクトル$${\vec{n}}$$(点$${\mathrm{A}}$$を始点として描画)、そして課題の平面を、それぞれ黄色で表示します。

図1 平面の方程式を用いた平面の描画

なお、実行ウィンドウのキャンバス内をクリックすると$${z}$$軸回りに図形が回転するので、いろいろな角度から図形を眺めてみてください。


本日は以上です。
明日は、直線の方程式について考えていきます。

明日もよろしくお願いします。


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

本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。(お問合せフォームの本文に、本記事のタイトルを入れてください。)


MK’s papa


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