見出し画像

高校数学10分プログラミング(数学B編 2.空間のベクトル)6日目「空間の位置ベクトルを考える1」解説

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

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

課題の線分の内分点や外分点の位置ベクトルを計算して空間に描くプログラムを作成することができたでしょうか。


解答例

今回の課題の線分の内分点や外分点の位置ベクトルを計算して空間に描くプログラムの例を示します。

// 四面体を描く、各位置ベクトルを描く

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

PVector a, b, c, d; // 四面体の各頂点を表す位置ベクトル
PVector p; // 辺BCを1:2に内分する点の位置ベクトル
PVector q; // 線分DPを3:2に外分する点の位置ベクトル
PVector r; // 線分AQの中点の位置ベクトル

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

  // 四面体の頂点を表わす4つの空間ベクトル
  a = new PVector(-1.0, 1.0, 4.0);
  b = new PVector(3.0, 1.0, -1.0);
  c = new PVector(-2.0, 2.0, -2.0);
  d = new PVector(-1.0, -3.0, 0.0);
  
  // 辺BCを1:2に内分する点の位置ベクトル
  float m = 1.0;
  float n = 2.0;
  p = b.copy().mult(n).add( c.copy().mult(m) ).mult(1.0/(m+n));

  // 線分DPを3:2に外分する点の位置ベクトル
  m = 3.0;
  n = 2.0;
  q = d.copy().mult(-n).add( p.copy().mult(m) ).mult(1.0/(m-n));

  // 線分AQの中点の位置ベクトル
  m = 1.0;
  n = 1.0;
  r = a.copy().mult(n).add( q.copy().mult(m) ).mult(1.0/(m+n));

  println("点Pの位置ベクトル:", p);
  println("点Qの位置ベクトル:", q);
  println("点Rの位置ベクトル:", r);

}

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);
  // 以下に、図形を描いていく
  
  // 空間ベクトルa,b,c,dを描く
  fill(0,0,0);
  stroke(0,0,0);
  arrow3D(0.0,0.0,0.0, a.x*res,a.y*res,a.z*res);
  fill(0,0,0);
  stroke(0,0,0);
  arrow3D(0.0,0.0,0.0, b.x*res,b.y*res,b.z*res);
  fill(0,0,0);
  stroke(0,0,0);
  arrow3D(0.0,0.0,0.0, c.x*res,c.y*res,c.z*res);
  fill(0,0,0);
  stroke(0,0,0);
  arrow3D(0.0,0.0,0.0, d.x*res,d.y*res,d.z*res);

  // 四面体ABCDを描く
  //fill(128,128,128);
  noFill();
  stroke(128,128,128);
  triangle_rhs(a.copy().mult(res),b.copy().mult(res),c.copy().mult(res));
  triangle_rhs(a.copy().mult(res),c.copy().mult(res),d.copy().mult(res));
  triangle_rhs(a.copy().mult(res),d.copy().mult(res),b.copy().mult(res));
  triangle_rhs(b.copy().mult(res),c.copy().mult(res),d.copy().mult(res));

  // 空間ベクトルpを描く(黄色)
  fill(255,255,0);
  stroke(255,255,0);
  arrow3D(0.0,0.0,0.0, p.x*res,p.y*res,p.z*res);
  // 空間ベクトルqを描く(水色)
  fill(0,255,255);
  stroke(0,255,255);
  arrow3D(0.0,0.0,0.0, q.x*res,q.y*res,q.z*res);
  // 空間ベクトルrを描く(桃色)
  fill(255,0,255);
  stroke(255,0,255);
  arrow3D(0.0,0.0,0.0, r.x*res,r.y*res,r.z*res);

}

ソースコード2 線分の内分点や外分点の位置ベクトルを計算して空間に描くプログラム(完成版)

ソースコード2を、スケッチ「drawPositionVector3D」のテキストエディタ部分に書いて実行すると、コンソールに

点Pの位置ベクトル: [ 1.3333334, 1.3333334, -1.3333334 ]
点Qの位置ベクトル: [ 6.0, 10.0, -4.0 ]
点Rの位置ベクトル: [ 2.5, 5.5, 0.0 ]

と出力されます(図1)。

図1 スケッチ「drawPositionVector3D」の実行結果

また、図2のように、実行ウィンドウのキャンバスに空間の座標系を表す3つの空間ベクトル(赤色:$${x}$$軸、緑色:$${y}$$軸、青色:$${z}$$軸)を基準にして、空間の4つの位置ベクトル$${\vec{a},\vec{b},\vec{c},\vec{d}}$$とそれらの4点を頂点とする四面体を黒色、線分$${\mathrm{BC}}$$を$${1:2}$$に内分する点の位置ベクトルを黄色、線分$${\mathrm{DP}}$$を$${3:2}$$に外分する点の位置ベクトルを水色、線分$${\mathrm{AQ}}$$の中点の位置ベクトルを桃色として表示しています。

図2 内分点や外分点の位置ベクトル

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


本日は以上です。
明日も、空間の位置ベクトルについて考えていきます。

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


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

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


MK’s papa


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