- ベストアンサー
指定した座標の色を得るためには
Java初心者で、いろいろ調べてみたのですが、わからなかったので質問します。 現在、物体にボールが当たったときの衝突モデルを作っているのですが、その当たる場合の衝突判定ができないで困っています。 物体の形状は円と矩形を組み合わせた少し複雑な形状で、すべて黒色で表しています。 また、その物体は回転もさせるようにしているので、「ボールの座標が黒色の部分に位置しているか」で当たり判定ができないかと考えています。 もしそういうメソッドがあるのであれば、そのクラスと簡単な例を教えてもらえないでしょうか?よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
補足ありがとうございます。 それでは「線分」と「円」の衝突ということになりますね。 http://www.dango-itimi.com/blog/archives/2006/000858.html をJavaに適当に置き換えたものですがこんな感じはいかがでしょう。 public class HitJudge { public boolean isHit(Circle c, Line l) { // 線分の始点から線分に沿ったベクトル Vect2D v1 = l.src.getVectTo(l.dst); // 線分の始点から円中心へのベクトル Vect2D v2 = l.src.getVectTo(c.core); // 内積 double n1 = v1.dotProduct(v2); if (n1<0) return l.src.distance(c.core) < c.r ? true : false; // double n2 = v1.dotProduct(v1); if (n1>n2) return l.dst.distance(c.core) < c.r ? true : false; System.out.println( c.r); return v2.dotProduct(v2)-(n1/n2)*n1 < c.r*c.r ? true : false; } public static void main(String[] str) { Circle c = new Circle(new Point(0,0), 2); Line l = new Line(new Point(1,-1), new Point(1,1)); HitJudge judge = new HitJudge(); System.out.println(judge.isHit(c,l)); } } class Line { public Point src; public Point dst; public Line(Point s, Point d) {src=s; dst=d;} } class Circle { public Point core; public int r; public Circle(Point core, int r) {this.core=core;this.r=r;} } class Point { public int x,y; public Point(int x, int y) {this.x=x; this.y=y;} public double distance(Point p) { return Math.sqrt(Math.pow(x-p.x,2) + Math.pow(y-p.y, 2)); } public Vect2D getVectTo(Point p) {return new Vect2D(p.x-x, p.y-y);} } class Vect2D extends Point { public Vect2D(int x, int y) {super(x, y);} public double dotProduct(Vect2D v) {return x*v.x + y*v.y;} } 物体の円の部分も衝突判定に入れるのであれば、 1.これに物体の円部分の衝突判定もあわせて行う 2.プレートと円をいっそのこと直方体としてあつかう などがあげられるでしょうか。 円の衝突判定は非常に簡単なので1の方がやりやすいかもしれませんね。
その他の回答 (1)
- asock
- ベストアンサー率70% (7/10)
質問者様の仰るとおりボールのいる位置に物体があるか否かで判定する方法でも衝突判定が出来ますが、ボールの速度が速い場合にすり抜ける現象が起こる可能性があります。 例えば現在 t=i秒 の時に ==○ ■ という位置にあり、tをインクリメントした t=i+1秒のときに ■ ==○ と間をすり抜ける現象が起こり得ます。 これは時間を離散的に扱ってしまうとどうしても生じてしまう問題です。 恐らくボールは円(もしくは球?)として扱っていると思いますから半径とかは既知ですよね。 衝突に関することは以下のURLに詳しくまとめられているので目を通しておく価値はあります。恐らく「移動している球の衝突」や「2つの球を当てて跳ね返らせる」あたりが参考になるでしょう。 http://www.h6.dion.ne.jp/~game296o/COL_main.html ただしソースはCであり、容易にJavaに書き換えられると思います。 直接の回答ではないですが一応参考にしてみて下さい。
お礼
まずは回答の件でお礼します。ありがとうございます。 asockさんのおっしゃったとおり、ボールの速度が速い場合にすり抜けるという現象は考えていました。 しかし、私の最初の説明不足で申し訳ないのですが、ボールの速度はさほど速くありません。補足の方でもう少し詳細に説明を加えます。 ですが、参考URLはとてもありがたく思っています。 さらに詳しく見てみたいと思います。どうもありがとうございました。
補足
説明があいまいで申し訳ございません。 このプログラムの大きな流れとしては、最初に目的地を指定します。 そして、物体を動かしてボールと衝突させることを繰り返しながら、目的地にボールを移動させることを目的としています。 少しわかりにくいかもしれませんが、物体の形状は下に示すとおりで、円の先にプレートを置いてそこにボールを衝突させようと考えています。 ○| ←物体の形状(プレートと物体は重なっている) それで、物体はまぁ一応ロボットという設定で考えていますので、プレートのある方向を前方向として前進と回転動作を行うようにしています。 衝突する位置は物体を動かしてプレート上で当てるようにしたいと思います。 また、大きさですが、ボールの直径を8とすると、物体の直径(?)は30にしています。 基本的にボールを物体に衝突させる訳ではなく、物体の方を移動させてボールにぶつけるという形なので、ボールの速度はさほど早くはありません。 このような形で衝突判定をしようと思っているのですが、最初の質問に限らず、他に優れた方法があるならば回答をよろしくお願いします。