[Processing]点と点の距離を求める関数dist(), mag()

Written by uechoco 2 月 28

プログラミングベースのCGとかゲームとかを作るときに良く使う数式が、点と点、円と円、点と円、マウス座標と画面の中心、自機と敵機などの二点間の距離を求める数式です。数学的な求め方で言えば、二点間のx座標とy座標の差分をそれぞれ二乗したものを足し合わせて平方根を取ると、三平方の定理によって二点間の距離が求まるんですが、processingではそんなまどろっこしいことを覚える必要はありません。デザインを作るための言語ですので、デザインを作るのに関係のないことを必死に覚えなくて済むように設計されています。

dist()関数。「距離」という意味の「distance(ディスタンス)」という英語の略ですね。この関数がまどろっこしい数式を内包しているので、二点間の引数を与えてやれば距離が求まります。たとえば、

dist(10, 10, 110, 110);

と書くと、座標1(10, 10)と座標2(110, 110)の間の距離が返ってきます。この場合は141.42136が返ってきます。別の例だと、

dist(10, 10, mouseX, mouseY);

と書くと、座標1(10, 10)と現在のマウス座標の間の距離が返ってきます。特殊な場合として、

dist(0, 0, mouseX, mouseY);

などの片方の座標が(0, 0)の場合、省略記法として

mag(mouseX, mouseY);

というようにmag()関数を使うことができます。

というわけで、サンプルを作ってみました。マウスの座標にあわせて、原点(0, 0)からと円(cx, cy)からの距離をリアルタイムに求めて表示しています。

Processing:
  1. int cx, cy; // 円の中心
  2.  
  3. PFont font;
  4.  
  5.  
  6.   size(200, 200);
  7.   colorMode(RGB, 100);
  8.   background(100);
  9.  
  10.   cx = 120;
  11.   cy = 60;
  12.  
  13.   font = loadFont("Tahoma-12.vlw");
  14.   textFont(font, 12);
  15.   textAlign(LEFT, TOP);
  16.   println(dist(0, 0, 100, 100));
  17. }
  18.  
  19.   // 背景を塗りつぶし
  20.   noStroke();
  21.   fill(100);
  22.   rect(0, 0, width, height);
  23.  
  24.   // 円を描画
  25.   stroke(40);
  26.   fill(80);
  27.   ellipse(120, 60, 30, 30);
  28.  
  29.   // 原点(0, 0)からの距離を求めて表示
  30.   stroke(60, 0, 0);
  31.   line(0, 0, mouseX, mouseY);
  32.  
  33.   fill(60, 0, 0);
  34.   float fromZero = mag(mouseX, mouseY);
  35.   // float fromZero = dist(0, 0, mouseX, mouseY); // 同じ
  36.   text("from (0, 0): "+fromZero, 0, 5);
  37.  
  38.   // 円の中心からの距離を求めて表示
  39.   stroke(0, 60, 0);
  40.   line(cx, cy, mouseX, mouseY);
  41.  
  42.   fill(0, 60, 0);
  43.   float fromCircle = dist(cx, cy, mouseX, mouseY);
  44.   text("from ("+cx+", "+cy+"): "+fromCircle, 0, 30);
  45. }

processing_functionDistmag.jpg

No Responses to “[Processing]点と点の距離を求める関数dist(), mag()”

コメントはまだありません。

Comments RSS rss うえちょこ@ぼろぐ TrackBack Identifier URI rss うえちょこ@ぼろぐ

コメントをどうぞ