• 締切済み

正三角形内かどうかの判定について

点Aが点Bに触れると, 点A は点Bを取得するというゲームの一部についてです. 座標(x,y)にある点Aが, 点Bを重点とする正三角形の中にあると, 上記のような反応をおこすプログラミングをしたいのですが,(あたり反応と言うらしい?) 正三角形の枠の判定の仕方がわかりません. 何か良いアルゴリズムがあれば教えていただけないでしょうか.

みんなの回答

  • driverII
  • ベストアンサー率27% (248/913)
回答No.4

#3にも誤記が・・・(^^; 3つの頂点の点Aが作る三つの三角形の面積の和が 正三角形と等しい ではなく 3つの頂点のうち2つと点Aが作る三つの三角形の面積の和が正三角形と等しい ですね。 試しにくんでみたら、下記のようになりました ----------------------------------------------- package JavaTest; import JavaTest.Point; class MyJava { public static void main(String ar[]) { Point pInput = new Point(11,1); Point pJu = new Point(0,0); Point pCho = new Point(0,10); String str; boolean fIn = Mathplus.IsIn(pInput,pJu,pCho); if(fIn) { str = "正三角形内"; } else { str = "正三角形外"; } System.out.println(str); } } class Mathplus { public static double degrees(double dR) { return 180 * dR / Math.PI; } public static double radians(double dD) { return Math.PI * dD / 180; } public static double mod(double dA, double dB) { double dR = Math.floor(dA / dB); return dA - dR * dB; } public static boolean IsIn(Point pInput, Point pJu, Point pCho) { double d = pJu.Distance(pCho); double dTheta = Mathplus.mod( 360+90-Mathplus.degrees(Math.atan2(pCho.y,pCho.x)),360); Point pCho2 = new Point( Math.sin(Mathplus.radians(dTheta+120))*(d), Math.cos(Mathplus.radians(dTheta+120))*(d)); Point pCho3 = new Point( Math.sin(Mathplus.radians(dTheta+240))*(d), Math.cos(Mathplus.radians(dTheta+240))*(d)); double dSum = pInput.Distance(pCho,pCho2) + pInput.Distance(pCho2,pCho3) + pInput.Distance(pCho3,pCho); Point pM = new Point((pCho2.x+pCho3.x)/2,(pCho2.y+pCho3.y)/2); double dTakasa = pCho.Distance(pM); return Math.abs(dTakasa - dSum) < 0.00000001; } } ----------------------------------------------- package JavaTest; /** * Pointクラス */ public class Point { public double x,y; public Point() { x = 0; y = 0; } public Point(double px,double py) { x = px; y = py; } public double Distance(Point p1) { double r = Math.sqrt( ((p1.x-this.x)*(p1.x-this.x)+ (p1.y-this.y)*(p1.y-this.y))); return r; } public double Distance(Point p1,Point p2) { Point pT = new Point(0,0); double vec_x, vec_y, alpha,len; vec_x = p2.x-p1.x; vec_y = p2.y-p1.y; alpha = ( vec_x * this.x + vec_y * this.y -vec_x * p1.x - vec_y * p1.y) / (vec_x * vec_x + vec_y * vec_y); if (alpha < 0.0) { len = Distance(p1); } else if (alpha > 1.0) { len = Distance(p2); } else { pT.x = p1.x + vec_x * alpha; pT.y = p1.y + vec_y * alpha; len = Distance(pT); } return len; } } -----------------------------------------------

全文を見る
すると、全ての回答が全文表示されます。
  • driverII
  • ベストアンサー率27% (248/913)
回答No.3

#2の修正です。 3つの頂点と点Aとの距離の和が一定 ではなく 3つの頂点の点Aが作る三つの三角形の面積の和が 正三角形と等しい = 3辺から点Aとの距離の和が正三角形の高さに等しい ですね・・・

全文を見る
すると、全ての回答が全文表示されます。
  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

#2では、1つの頂点と重点から、他の2つの頂点を求めるところまで書きます。 重点B(X1,Y1)と1つの頂点(X2,Y2)(C)からは、 1.重点と頂点(C)の距離(D) 2.頂点(C)と重点を結んだ線分のY軸との角度θ 3.他の二つの頂点(E,F)の座標(X3,Y3)(X4,Y4) が求められます。 --------------------------------------------- 1.重点と頂点(C)の距離(D)は =Math.Sqrt((X2-X1)^2+(Y2-Y1)^2) です。 --------------------------------------------- 2.頂点(C)と重点を結んだ線分のY軸との角度θ 5を3で割った余りを2というのを   mod(5,3)=2と表し、 ラジアン値を度に変換するのをdegrees() 逆をradians()と表すとします。 (これらはExcelの関数にもあります。) このとき θ=mod(360+90-degrees(Math.Atan2(X2,Y2)),360) --------------------------------------------- 3.他の二つの頂点(E,F)の座標(X3,Y3)(X4,Y4) X3=Math.sin(radians(θ+120))*(D) Y3=Math.cos(radians(θ+120))*(D) X3=Math.sin(radians(θ+240))*(D) Y3=Math.cos(radians(θ+240))*(D) --------------------------------------------- 以上で全ての頂点の座標が求まりました。 正三角形の中に点A(X,Y)があれば、 3つの頂点と点Aとの距離の和が一定になる筈です。 一定になる距離の和も計算で求められると思いますが、 一旦ここでやめておきます。 (望んでおられる判定方法と違うかもしれないので) もし補足が必要なら書いておいてください。

全文を見る
すると、全ての回答が全文表示されます。
  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

まぁ、ある点が正三角形にあるか否かを判定する関数なりなんなりを作って、それを呼んであたり判定(反応?)をするんですね。 正三角形で、点B(X1,Y1)の座標がわかっていても、 少なくとも1つの頂点の座標がわからないとどんな(大きさ、向きの)正三角形がわからないと思います。 例えば、必ず△、つまり上が正三角形で、大きさが一定という場合以外は・・・ で、重点と1つの頂点がわかれば、あとの2つの頂点はもとめられますので、あとは判定できそうですね。 今、時間がないのでここまで。 明日までに回答がつかなければ、明日の夜、再度書きます。ごめんなさい。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 多角形の内部かどうか判定する方法

    2次元座標系にあるn個の点を順に接続して多角形を作ります。 n個の点は(x1,y1)-(x2,y2)-…-(xn,yn)とします。 (xn,yn)と(x1,y1)を最後につないで閉じた多角形とします。 このとき点(a,b)が多角形の内部にあるかどうかを判定するにはどのようにしたら良いでしょうか? 辺同士が交わるような点の配置は無いとします。 よろしくお願いします。

  • 正方形の一次変換

    注:以下の説明で行列は2×2の正方行列で(左上,右上,左下,右下)の順 xy座標平面において、y≧0の部分にあり、頂点の一つが原点にある正方形の内で一次変換         (x`,y`)=(7,√3,√3,5)(x,y) ・・・・・(1) によって長方形になるものを求めよ。 という問題で、正方形の1頂点の座標を(a,b)とおいて他2頂点の座標を定め、移された点を(1)で求めた後、 ・辺同士が直交する ・対辺の長さが等しい など求めてみましたが、式が一つになってしまい、(a,b)が求まりません。 どなたか、解答のアプローチなどご存知の方、教えていただきたいです。

  • 高校の数学2の正三角形の問題

    2点A(1,1)、B(2,4)に対し、 △ABCが正三角形になるような点Cの座標を教えてください。 辺AC=辺AB・辺BC=辺ABの方程式を解くと、 x+3y=9となり、点になりません。 よろしくお願いします。

  • 三角形の面積の答え 正しいかご判定をおねがいします。

    xy平面上に2点a(-2,1)、b(-1,2)があるとき、点a,bと結んでできる三角形の面積を求めなさい。 という問題をやって見たんです。 m = (2-1)/(-1+2) = 1 点a、の座標を代入 -2 = 1 * 1 + n n = 2 + 1 n = 3 点a,bを通る直線の方程式 y = x + 3 y切片は 3 x切片を求める -3x = 1 x = -3 x切片は -3 原点とx切片とy切片の3点をそれぞれ直線で結んだ三角形を S 原点と点bとx切片の3点をそれぞれ直線で結んだ三角形を S1 原点と点aとy切片の3点をそれぞれ直線で結んだ三角形を S2 原点と2点a(-2,1)、b(-1,2) の3点直線で結んだ三角形を S0 S = 3 * 3 * 1/2 = 9 * 1/2 = 9/2 S1 = 3 * 1 * 1/2 = 3 * 1/2 = 3/2 S2 = 3 * 1 * 1/2 = 3 * 1/2 = 3/2 S - S1 - S2 = S0 だから、 2/9 - 3/2 - 3/2 = 3/2 ※面積の計算のため「 - 」は省略してます。 >xy平面上に2点a(-2,1)、b(-1,2)があるとき、点a,bと結んでできる三角形の面積は、  答え 3/2 以上と出ましたが…付属の回答では 答え 2/3 とあります。 でも、他人にこの答えはおかしいと言われました。 私の答えが正しいか、解答が正しいか、 皆さんのご判定をお願いします。

  • 3次元の物体、例えば正四面体の頂点のデータを取得したとします。正四面体

    3次元の物体、例えば正四面体の頂点のデータを取得したとします。正四面体は1つの面は三角形ですので3つの点の(x,y,z)座標が得られていることになります。で、それが4面なので4セットあることになります。さて、質問ですが、その面に対する物体の”外向き”単位法線ベクトルを計算することを考えます。法線ベクトルは割りと簡単に計算できますが、外向きか、内向きかを判別するアルゴリズムにはどのようなものがあるでしょうか。その1つの面(3つの点)だけだったら物体の全体像がわからないのでその他の点(残り1つですが)を使うことになると思いますが。どのようになるでしょうか。 また、正n面体の物体ではどうなるのでしょうか。正でなくn面体ならどうなるかという問題があります。 面構成する頂点の座標が与えられているというのが基本の前提条件です。よろしくお願いします。

  • 座標平面上に1辺の長さが2の正三角形ABCがある。

    以下の問題の(2)の解説で2つ疑問があります。 1)解いた時に、△A'B'C'が重心(原点)を中心に動くことに気付きませんでした。気付く方は、どうして or どのような考察をして気付くのでしょうか? 2)△ABCと△A'B'C'が重ならない部分 (例えば、線分ABと線分A'C'の交点をD,線分ABと線分C'B'の交点をEとした場合、△C'DE)が直角3角形になることに、どのようにして気付くのでしょうか? 問題)座標平面上に1辺の長さが2の正三角形ABCがある。 ただし、△ABCの重心は原点の位置にあり、辺BCはx軸と平行である。 また、頂点Aはy軸上にあってy座標は正であり、頂点Cのx座標は正である。 直線y=xに関して3点A,B,Cと対称な点を、それぞれA',B',C'とする。 (1)C'の座標を求めよ。 (2)△ABCと△PQRが重なる部分の面積を求めよ。 解答)△ABCと△A'B'C'は、合同な3角形であり、△ABCを原点の周りに30度回転すると△C'B'A'と一致する。ゆえに、△ABCと△A'B'C'が重なる部分から,はみ出した6個の直角3角形は、すべて合同である。(以下省略)

  • 角度を求めるプログラム

    x,y座標上の2点を結んでできる線の度数での角度(45度、270度といった) を得たいのですがそういうプログラムまたは関数などはあるのでしょうか? 例えばA(0,1)とB(1,2)だと、B-Aでx=1,y=1になりy/x=1という数字が出てきます。 この1が45度になるようなアルゴリズムが知りたいです。

    • ベストアンサー
    • PHP
  • 図形と方程式

    座標平面上に1辺の長さ2の正三角形ABCがある。ただし、⊿ABCの重心は原点の位置にあり、辺BCはx軸と平行である。また頂点Aはy軸上にあって、y座標は正であり、頂点Cのx座標は正である。直線y=xに関して3点A、B、Cと対称な点をそれぞれA’、B’、C’とする。 (1)C’の座標を求めよ。 (2)さらに、⊿ABCと、⊿A’B’C’が重なる部分の面積を求めよ。 (1)はCのx、y座標を入れ替えたものだと分かるのですが、(2)の求め方がさっぱり 分かりません。どうぞよろしくご教授ください。お願いします。

  • 閉曲線の向きの判定法

    閉曲線の向きの判定法 平面上に交差していない1本の閉曲線があります。 この閉曲線上の座標点配列がちょうど1周分与えられている  (x0,y0),(x1,y1),(x2,y2), ... (xn,yn) とき、この座標配列の向きが時計回りになっているか 反時計回りになっているかを判定する方法を教えてください。

  • 座標平面上の正六角形

    次の問題について質問があります. xy平面上に正六角形ABCDEFがあり,点Aを原点(0, 0)に固定する.正六角形の形を保ちながら,直線 x+y=1 上を点Bが動く. (1) 点Cの軌跡が直線になることを示し,その直線と x+y=1 の交点Pの座標を求めよ. (2) 点D, E, Fはすべて(1)の点Pを通過することを示せ. この問題の(1)は解けました.私の解き方は,次のようになっています. 【1】B(t, 1-t)とおく.ただし,tは実数とする. 【2】C(X, Y)をtを用いて表すことを考える.Bを中心にAを120°回転させた先がCであるので, X=(3-√3)t/2 + √3/2 Y=-(3+√3)t/2 + 3/2 となる(計算略). 【3】X, Yからtを消去すると, Y=-(2+√3)X+3+√3 よって,点Cの軌跡は直線y=-(2+√3)x+3+√3 …(答) この直線とx+y=1の交点Pは,P((1+√3)/2, (1-√3)/2) …(答) さて,今回質問したいのは(2)でして,上記のように強引にD, E, Fの軌跡を求めて交点を計算してもできそうですが,より簡単に求める方法はありませんか? 正六角形の対称性を利用できないかな,とも思ったのですが,その後が続きませんでした... どなたか分かる方,よろしくお願い致します.

PX-045A 用紙を引き込まない
このQ&Aのポイント
  • PX-045Aは紙を引き込まず、紙づまりエラーが出る問題が発生しています。
  • EPSON社製品であるPX-045Aでは、用紙の引き込みができず、紙づまりエラーが表示されるというトラブルが発生しています。
  • PX-045Aの紙引き込み機能に問題があり、紙が引き込まれずに紙づまりエラーが表示される問題が発生しています。
回答を見る