• ベストアンサー

線と点の当り判定

noname#35109の回答

noname#35109
noname#35109
回答No.1

(ax,ay) と (bx,by) とを結ぶ一次方程式を導き出して, その一次関数の直線上に点(cx,cy)があるかないかを判定すれば良いと思いますよ。    Y  □■□□□□□□□□□□□□□□□□  □■□□□□□□□□□★□□□□□□  □■□□□□□□□□■□□□□□□□  □■□□□□□□□■□□□□□□□□  □■□□□□□□■□□□□□□□□□  □■□□□□□■□□□□□□□□□□  □■□□□□■□□□□□□□□□□□  □■□□□●□□□□□□□□□□□□  □■□□□□□□□□□□□□□□□□  ■■■■■■■■■■■■■■■■■■ X  □■□□□□□□□□□□□□□□□□  仮に ● を (ax,ay)   ★ を (bx,by) とします。  一次方程式を Y=AX + B として,  傾き A は (by-ay)/(bx-ax)  したがって,  Y=(by-ay)X/(bx-ax)+B  (ax,ay) を通る直線であることから切片 B は  ay=(by-ay)ax/(bx - ax)+B  B=ay-(by-ay)ax/(bx - ax)  よって,  Y=(by-ay)X/(bx-ax)+ay-(by-ay)ax/(bx-ax)  Y=(by-ay)(X-ax)/(bx-ax)+ay ---実際のFlash-------------------- インスタンス名 「a」 の MC(ムービークリップ) と インスタンス名 「b」 の MC があって, インスタンス名「c」の MC をドラッグして動かすとします。  if (c._y == (b._y-a._y)*(c._x-a._x)/(b._x-a._x)+a._y) これが true になれば,直線 (ax,ay) (bx,by) 上に「c」があることになります。 しかし,これは理想上のはなしで, 実際に直線にピッタリ重なるということは普通はありません。 余分にプラスマイナスの範囲を少し取って,次のようにすれば,実験ができます。 ステージ上にインスタンス名「a」と「b」と「c」という 小さめのムービークリップを任意の位置に作成します。 そして, 「c」に次のようなスクリプトを書きます。 /////////////////////////////////////////////////////////////////////////// on (press) { // ドラッグ開始 this.startDrag(); } on (release, releaseOutside) { // ドラッグ終了 this.stopDrag(); } onClipEvent (mouseMove) { if (_root.c._y+2 >= (_root.b._y-_root.a._y)*(_root.c._x-_root.a._x)/(_root.b._x-_root.a._x)+_root.a._y && _root.c._y-2 <= (_root.b._y-_root.a._y)*(_root.c._x-_root.a._x)/(_root.b._x-_root.a._x)+_root.a._y) { trace("ヒット"); } } /////////////////////////////////////////////////////////////////////////// 「修正」→「ムービープレビュー」で, ムービークリップ「c」をドラッグしてみると, 直線「a」-「b」上に「c」を移動させたとき, 「ヒット」がトレースされます。 if文内の _root.c._y+2 と _root.c._y-2  の ±2 が,余分の範囲です。 ※私は数学が苦手なので,   さらに何かを求められても回答できない自信があります。

kingfruits
質問者

お礼

ありがとうございます。 中学高で習った事で解けるのですね。 非常に判りやすい解説でした。 ベクトルの考え方でも解けるのでしょうか・・・

kingfruits
質問者

補足

試してみましたが、解答して頂いた方法ですと、(ax,ay)と(bx,by)の延長線上に(cx,cy)が存在しても「当り」と判定してしまいます・・・ (ax,ay)と(bx,by)を“結ぶ”線上に点(cx,cy)があるかの判定をしたい場合はどうしたらよいでしょう?

関連するQ&A

  • 斜線A・BにLの距離P点に斜線に直角の線C・Dを描く方程式を教えてくだ

    斜線A・BにLの距離P点に斜線に直角の線C・Dを描く方程式を教えてください。 点A(Ax,Ay),点B(Bx,By)を結ぶ線上に、点Aから距離Lの位置、点P(Px,Py)に斜線に直角の線を描く方程式を教えてください。 Ax=5000:Ay=4000 Bx=25000:By=22000 A点からP点まで距離 L=20000として Px=19865.883:Py=17379.295 CD線の長さをL2=3000として Cx= Cy= Dx= Dy= を求めたいのですが

  • 三角形OABの面積を求めるプログラム

    三角形OABの面積を求めるプログラムを作りました(課題ですがw)。が、うまく動かないんです。 どこが間違っているか教えてください。(VC++6.0) /*三角形OABの面積を求めるプログラム*/ #include <stdio.h> #include <math.h> void main(){ float ax,ay,bx,by,s; printf("点Aの座標を入力してください。\n"); scanf("%f%f",&ax,&ay); printf("点Bの座標を入力してください。\n"); scanf("%f%f",&bx,&by); s=(1/2)*abs(ax*by-ay*bx); printf("三角形OABの面積は%fです。\n",s); } ◇点A(ax,ay) 、点B(bx,by) 面積の公式s=(1/2)*|ax*by-bx*ay| と与えられています。 また、警告の意味もわからないんで、できればお願いします。

  • 三角関数の問題です。

    質問をさせていただきます。 二次元平面上に△ABCがあり、頂点の座標はそれぞれ (Ax,Ay)、(Bx,By)、(Cx,Cy)となっています。 また辺ACと辺BCの長さは等しく、二等辺三角形となっています。 (∠ACBの角度×1/4)の正接の値をTとした場合、 Cx、Cyの値をそれぞれ求めたいのですが、 どのようにすればよいでしょうか。 (ちなみに全ての辺は、X軸やY軸に必ず平行というわけではありません) Cx=~、Cy=~ といった形でご回答頂けると幸いです。 よろしくお願いいたします。

  • 行列 連立一次方程式

    a,b,c,d,が0でない実数であるとき、次の連立一次方程式を解け ax-by-az+bu=1 bx+ay-bz-au=0 cx-dy+cz-du=0 dx+cy+dz+cu=0 行列を使った解き方でお願いします。

  • 空間上の二点を結ぶ直線上に任意の点が存在するかどうかの関数

    Cの初心者です。 空間上に存在する2点間を結ぶ直線上に任意の点が存在するかどうかの 関数を作りたいのですがどのような公式を用いて評価すればいいのか分かりません。 どなたかご教示ください。 引数    始点 A(x,y,z)    終点 B(x,y,z)    直線上に存在するであろう任意の点       C(x,y,z)  関数のイメージ    boolean isOnLine (Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz); 配列でもよいです。 返り値    True、 False  ( 0 or 1 ) よろしくお願いします。

  • 3次元で回転させた座標値の計算方法

    点(Ax、Ay、Az)を3次元空間にある、点(Bx、By、Bz)から、点(Cx、Cy、Cz)に向かう直線を軸に任意の角度で回転させたときの、点(A’x、A’y、A’z)の座標値の計算方法を教えてください。ただし自分の数学レベルは中学生並でベクトルが少しだけ理解できるていどです。よろしくお願いします。

  • 斜線A・BにLの距離P点に斜線に直角の線を描く方程式を教えてください。

    斜線A・BにLの距離P点に斜線に直角の線を描く方程式を教えてください。 点A(Ax,Ay),点B(Bx,By)を結ぶ線上に、点Aから距離Lの位置、点P(Px,Py)に斜線に直角の線を描く方程式を教えてください。

  • 内積を用いた移動する線分と円の衝突判定について

    内積を用いた移動する線分と円の衝突判定について 作成しているプログラムはピンボールのフリッパーとボールとの衝突判定です。14歳からはじめるリアルに動くゲーム物理プログラミング教室C言語編と言う本を参考にプログラミングしています。左フリッパーが315度~360度、1度~45度の範囲を1度づつ移動する度に衝突判定をする関数を作成し、衝突した場合に関数から抜け、戻り値としてボールの情報を持つ構造体の中の反射スピードと反射座標を返すものです。 ここからが質問なのですが、ボールは全くフリッパーの衝突と関係の無い所で反射してしまいます。移動しない線分の両端の座標を与えた衝突判定(壁)では正しく判定するのですが、角度を与えて移動する線分(フリッパー)では上手くいきません。お分かりになる方いらっしゃいましたら、宜しくお願い致します。 関数に渡す引数はその時のボールの座標・速度などの構造体と左フリッパーの角度です。 以下ソースコード //左フリッパーの軸と成る座標 float hx_l = (cx_l*ZOOM); //フリッパーのx座標 float hy_l = (cy_l*ZOOM+HORIZ); //フリッパーのy座標 //ベクトル a の成分を求める float ax=xy.posx-hx_l; //線分始点からボール中心へのベクトル float ay=xy.posy-hy_l; //線分始点からボール中心へのベクトル //ベクトル b の成分を求める float bx=((cx_l+cos(ToRadian(angler_l))*clubr)*ZOOM)-hx_l; //線分始点から終点へのベクトル float by=((cy_l-sin(ToRadian(angler_l))*clubr)*ZOOM+HORIZ)-hy_l;//線分始点から終点へのベクトル float inpro=ax*bx+ay*by; //ベクトル a,b の内積を求める float bl=bx*bx+by*by; //ベクトル b の長さの二乗(線分始点から終点へのベクトル if(inpro>-ZERO1 && inpro<(bl+ZERO1)){ //フリッパーとの衝突判定 //ベクトル a の線分がボールの半径より小さければ交差している if((ax*ax+ay*ay)-pow(inpro/sqrt(bl),2) < pow(xy.radius,2)){ 以下判定後の処理‥‥ ベクトルbのbx,byを求める式でangler_lが引数として渡されるフリッパーの角度に成ります。ToRadian()は関数で角度をラジアンに変更します。

  • 斜線ABに平行に、Lの距離離れた斜線CDの座標を求める方程式を教えてく

    斜線ABに平行に、Lの距離離れた斜線CDの座標を求める方程式を教えてください。 斜線A(Ax,Ay),B(Bx.By)を平行にLの距離離れたC(Cx,Cy),D(Dx,Dy)の座標を求める方程式を教えてください。

  • 座標の和に関する証明

    原点をo(0,0)とし、a(ax,ay),b(bx,by)という点を取ります。 このとき、cという点を四角形oacbが平行四辺形になるように取ると、cは、c(ax+bx,ay+by)という、座標を取りますが、cが必ず、このような座標を取ることは、どの様に証明したら良いのでしょうか? どなたか解答お願いします。