Classiclll's Blog

an old boy

first item of loc of me ー ハイパーカードでは数字のペアの文字列だった

イメージ 1

【クラスLoc : 位置あるいはベクトルの表現】
ハイパーカードの「見える」オブジェクトはプロパティーlocを必ず持っていたもんだ。
実態は「X座標値,Y座標値」が書かれた文字列なんだけど、the first item of loc of cursorでマウスカーソルのX座標を取り出せた。
なもんで、P5でもlocを使いたくて自前で用意したのがClass Loc。
 *Javaには類似のクラスがあったらしいが、Locって名前じゃなかったので、調べてもいない。

で、今回はこちらに置いたClass Locの解説
軽いクラスの割には豊富な操作が可能。覚えておいて損は無い。(はず)
 (Loc に関する質問や突っ込みはガラクタ置き場のゲストブックかここのゲストブックへ)

【メソッド追加】
  Karakuriで新たに必要となったメソッドとリクエストがあったメソッドを追加。【*付き】(6月24日)
【泥縄的メソッド追加】
  解説ミス、解説漏れと新規追加分が発生。なので、記事自体を修正(5月1日)
【自分で間違えてちゃしょうがない!】
  回転系のメソッドは当該オブジェクトを操作する。なので、記事自体を修正(4月30日)



クラス Locは位置(x, y, z)を表す非常に軽いクラス。
だけど、位置あるいはベクトルに関する演算は豊富。
【位置の作り方】(新しい位置を作る)
 Loc pos = new Loc(10, 20, 30);で、座標(10, 20, 30)を持った位置posを作れる。
 Loc loc = new Loc(pos);で、位置posと同じ座標を持った位置locを作れる。
 Loc pol = new Loc(経度,緯度);で、単位球面上の経度、緯度(ラジアン)にあたる位置polを作れる。
【位置の操作】(位置そのものに対する操作)
 loc.move(30, 20, 10);で、位置locを座標(30, 20, 10)に移せる。
  *自分自身を返すので、連続操作が可能(以下同様)
    例)loc.shift(pos).scale(0.5);  位置posだけズラして0.5倍する。
 loc.movePolar(半径、経度、緯度);で、位置locを指定球面上の経度、緯度(ラジアン)の位置に移せる。
 loc.shift(3, 2, 1);で、位置locを各座標(3, 2, 1)だけズラした位置に移せる。
 loc.shift(dlt);で、位置locを位置ベクトルdltだけズラした位置に移せる。
 loc.shiftPolar(半径、経度、緯度);で、位置locを指定球面上の経度、緯度(ラジアン)だけズラした位置に移せる。
 loc.scale(0.5);で、位置locの各座標を0.5倍する。
 loc.scale(mul);で、位置locの各座標に位置mulのそれぞれ対応する座標を掛け合わせる。
* loc.shiftI(dlt);で、位置locを位置ベクトルdltだけdltと逆方向にズラした位置に移せる。
* loc.scaleI(div);で、位置locの各座標をdivのそれぞれ対応する座標で割った位置に移せる。
 loc.rotate(軸、角度);で、位置ベクトルlocを軸(ベクトル)周りに角度だけ回転させる。。
 loc.rotate(Z軸角, Y軸角, X軸角);で、loc.rotateZ(Z軸角).rotateY(Y軸角).rotateX(X軸角)と同じ結果が得られる。
 loc.rotateZ(角度);で、位置ベクトルlocをZ軸中心に角度(ラジアン)だけ回転させる。
 loc.rotateY(角度);で、位置ベクトルlocをY軸中心に角度(ラジアン)だけ回転させる。
 loc.rotateX(角度);で、位置ベクトルlocをX軸中心に角度(ラジアン)だけ回転させる。
【位置の情報】(位置、あるいは別の位置との間の情報、すべて数値)
 loc.norm();で、位置locの長さ(原点からの距離)を得られる。
  *数値を返すので、連続演算が可能(以下同様)
    例)loc.norm()*25+3;  長さの25倍に3を加えた数値(以下同様)
 loc.longitude();で、位置locの経度(原点中心)を得られる。(ラジアン)
 loc.latitude();で、位置locの緯度(原点中心)を得られる。(ラジアン)
 loc.dist(10, 20, 30);で、位置locから座標(10, 20, 30)までの距離を得られる。
 loc.dist(pos);で、位置locから位置posまでのユークリッド(差の自乗和の平方根)距離を得られる。
 loc.dist1(pos);で、位置locから位置posまでのマンハッタン距離(差の絶対値の和)を得られる。
 loc.dist2(pos);で、位置locから位置posまでの距離の自乗(平方根をとる前の値)を得られる。
 loc.innerP(pos);で、位置(ベクトル)locと位置(ベクトル)posの内積を得られる。
 loc.cosine(pos);で、位置(ベクトル)locと位置(ベクトル)posの余弦(コサイン)を得られる。
 loc.angle(pos);で、位置(ベクトル)locと位置(ベクトル)posのなす角度(ラジアン)を得られる。
 loc.dot(pos);で、位置(ベクトル)locと位置(ベクトル)posのドット積(すなわち内積)を得られる。
 loc.isSameGrid(pos);で、位置(ベクトル)locと位置(ベクトル)posが同じ整数格子点にあるか判定できる。
 loc.isEqualTo(pos);で、位置(ベクトル)locと位置(ベクトル)posが同じ整数格子点にあるか判定できる。
 loc.isNearTo(pos, 0.000001);で、locとposの間の(ユークリッド)距離が0.000001(=1e-6)未満であるか判定できる。
 loc.isNear1To(pos, 1e-6);で、locとposの間の(マンハッタン)距離が1e-6(=0.000001)未満であるか判定できる。
【位置(ベクトル)の演算】(演算の結果、新しい位置が得られる)
 loc.add(3, 2, 1);で、位置ベクトルlocと位置ベクトル(3, 2, 1)を「足した」合成ベクトルを得られる。
  *新しい位置を返すので、連続演算が可能(以下同様)
    例)loc.add(pos).mul(5);  ベクトルlocとベクトルposの「和」を5倍した新しいベクトル。
 loc.add(pos);で、位置ベクトルlocと位置ベクトルposを「足した」合成ベクトルを得られる。
 loc.sub(3, 2, 1);で、位置ベクトルlocと位置ベクトル(3, 2, 1)を「引いた」合成ベクトルを得られる。
 loc.sub(pos);で、位置ベクトルlocから位置ベクトルposを「引いた」合成ベクトルを得られる。
 loc.inv();で、位置ベクトルlocと反対方向を持つ新しい位置ベクトルを得られる。 
 loc.mul(5);で、位置ベクトルlocの5倍の長さの位置ベクトルを得られる。
 loc.div(5);で、位置ベクトルlocの5分の一の長さの位置ベクトルを得られる。
* loc.mul(fct);で、位置ベクトルlocとfctの要素ごとの掛け算からなる新しい位置ベクトルを得られる。
* loc.div(fct);で、位置ベクトルlocとfctの要素ごとの割り算からなる新しい位置ベクトルを得られる。
* loc.turn(軸、角度);で、位置ベクトルlocを軸(ベクトル)周りに角度だけ回転した位置にある新しいベクトルを得られる。
* loc. turn(Z軸角, Y軸角, X軸角);で、loc.rotateZ(Z軸角).rotateY(Y軸角).rotateX(X軸角)と同じ結果が得られる。
* loc. turn Z(角度);で、位置ベクトルlocをZ軸中心に角度(ラジアン)だけ回転した位置にある新しいベクトルを得られる。
* loc. turn Y(角度);で、位置ベクトルlocをY軸中心に角度(ラジアン)だけ回転した位置にある新しいベクトルを得られる。
* loc. turn X(角度);で、位置ベクトルlocをX軸中心に角度(ラジアン)だけ回転した位置にある新しいベクトルを得られる。
* loc. projectin(dirX,dirY,dirZ);で、locを三組のベクトルへ射影した位置にある新しいベクトルを得られる。(垂直射影)
 loc.outerP(pos);で、位置ベクトルlocと位置ベクトルposの外積(右手方向に垂直なベクトル)を得られる。
 loc.unit();で、位置ベクトルlocと同じ方向を向いた単位ベクトル(長さ1)を得られる。
 loc.dir(pos);で、位置ベクトルlocから位置ベクトルposへの単位方向ベクトル(長さ1)を得られる。
 loc.ortho(pos);で、位置ベクトルlocから位置ベクトルposへの垂線ベクトルを得られる。
 loc.cross(pos);で、位置ベクトルlocと位置ベクトルposのクロス積(すなわち外積)を得られる。
【ユーティリティ】
 loc.draw(半径, 色);で、locの位置に指定された球を描く。
 if (loc.isMouseWithin(5)) { };未実装
 if (loc.isDragged(5)) { };未実装
なお、日本語サポートサイトからたどれるP5インフォメーション→言語が参考になる。
(解説してあるのは一昔前の版だから注意が必要だけど、loop()→draw()の読み替えだけで大抵OK)
山本徹(thoru)さんがFunProce55ingを始められました。(わくわく)
例題集は習作集と区別するためにこちらに置いた。