• ベストアンサー

指定した座標の色を得るためには

Java初心者で、いろいろ調べてみたのですが、わからなかったので質問します。 現在、物体にボールが当たったときの衝突モデルを作っているのですが、その当たる場合の衝突判定ができないで困っています。 物体の形状は円と矩形を組み合わせた少し複雑な形状で、すべて黒色で表しています。 また、その物体は回転もさせるようにしているので、「ボールの座標が黒色の部分に位置しているか」で当たり判定ができないかと考えています。 もしそういうメソッドがあるのであれば、そのクラスと簡単な例を教えてもらえないでしょうか?よろしくお願いします。

  • QRIO
  • お礼率83% (5/6)
  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • asock
  • ベストアンサー率70% (7/10)
回答No.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の方がやりやすいかもしれませんね。

参考URL:
http://www.dango-itimi.com/blog/archives/2006/000858.html

その他の回答 (1)

  • asock
  • ベストアンサー率70% (7/10)
回答No.1

質問者様の仰るとおりボールのいる位置に物体があるか否かで判定する方法でも衝突判定が出来ますが、ボールの速度が速い場合にすり抜ける現象が起こる可能性があります。 例えば現在 t=i秒 の時に  ==○ ■ という位置にあり、tをインクリメントした t=i+1秒のときに     ■ ==○ と間をすり抜ける現象が起こり得ます。 これは時間を離散的に扱ってしまうとどうしても生じてしまう問題です。 恐らくボールは円(もしくは球?)として扱っていると思いますから半径とかは既知ですよね。 衝突に関することは以下のURLに詳しくまとめられているので目を通しておく価値はあります。恐らく「移動している球の衝突」や「2つの球を当てて跳ね返らせる」あたりが参考になるでしょう。 http://www.h6.dion.ne.jp/~game296o/COL_main.html ただしソースはCであり、容易にJavaに書き換えられると思います。 直接の回答ではないですが一応参考にしてみて下さい。

参考URL:
http://www.h6.dion.ne.jp/~game296o/COL_main.html
QRIO
質問者

お礼

まずは回答の件でお礼します。ありがとうございます。 asockさんのおっしゃったとおり、ボールの速度が速い場合にすり抜けるという現象は考えていました。 しかし、私の最初の説明不足で申し訳ないのですが、ボールの速度はさほど速くありません。補足の方でもう少し詳細に説明を加えます。 ですが、参考URLはとてもありがたく思っています。 さらに詳しく見てみたいと思います。どうもありがとうございました。

QRIO
質問者

補足

説明があいまいで申し訳ございません。 このプログラムの大きな流れとしては、最初に目的地を指定します。 そして、物体を動かしてボールと衝突させることを繰り返しながら、目的地にボールを移動させることを目的としています。 少しわかりにくいかもしれませんが、物体の形状は下に示すとおりで、円の先にプレートを置いてそこにボールを衝突させようと考えています。 ○| ←物体の形状(プレートと物体は重なっている) それで、物体はまぁ一応ロボットという設定で考えていますので、プレートのある方向を前方向として前進と回転動作を行うようにしています。 衝突する位置は物体を動かしてプレート上で当てるようにしたいと思います。 また、大きさですが、ボールの直径を8とすると、物体の直径(?)は30にしています。 基本的にボールを物体に衝突させる訳ではなく、物体の方を移動させてボールにぶつけるという形なので、ボールの速度はさほど早くはありません。 このような形で衝突判定をしようと思っているのですが、最初の質問に限らず、他に優れた方法があるならば回答をよろしくお願いします。

関連するQ&A

  • 回転する矩形同士の当たり判定について

    C++でゲームのSTGのようなゲームを作成しています。 ショットの当たり判定は全て矩形で行っていますが、 レーザーのような細長いショットの場合、 どうしても斜め方向の判定が必要になってきます。 単純な回転しない矩形ならば、 それぞれの矩形の頂点座標の距離を比較するだけでいいので、 4回の比較で判定することができるのですが、 回転が加わってしまうとどうしても複雑になってしまい、 どういう風にとればいいのか解らずに困っています。 例えば、以下のような場合など、 回転を考慮しない判定だと衝突と判定されます。      ┌――┐      |   |      |   |   /\└――┘ /    \ \    /   \/ 解説サイト等を拝見しましたが、 矩形の回転の加わった当たり判定まで解説しているサイトが見当たらず、 ベクトルを使えば出来るという情報は得たものの その方法が解らずに困っています。 シーンによっては多くのショットが生成されるので 付加をするならば、できる限り高速な処理で、判定をしたいのですけども、 どなたがその方法をご存じないでしょうか? よろしくお願いします。

  • 座標の変換

    座標の変換 に関して質問があります。 質問1 ある矩形をr度回転した時の矩形の座標を簡単に求める関数はありますか? 質問2 支点(x0, y0)から座標(x1, y1)をr度回転した時の座標(x2, y2)を求める場合、 何クラスの何メソッドを使うのが一番簡潔ですか? 詳しい方がいましたら教えて下さい。宜しくお願い致します。

    • ベストアンサー
    • Java
  • 多角形同士の交差の判定

    Javaで用意されている「Polygon」クラスには,「intersects」という矩形との交差判定をするメソッドがありますが,これではなく,多角形(Polygon)同士の交差判定をするメソッドってありますか? あと,初歩的なことかもしれませんが,「Polygon」クラスのx座標とy座標の配列の型は「int」型ですが,これを「double」型で定義したい場合は自作するしかないですよね?

    • ベストアンサー
    • Java
  • オブジェクト指向による座標変換とクラス構造

    オブジェクト指向的プログラミングをすると以下はどうなるのか、結構悩んでおります。 流れ: 或る物体が有る  ・位置情報算出のためのパラメータを変数にセット  ・時刻情報を入れ、上記パラメータより、或る時刻における位置が求まる   (計算に必要なパラメータを代入したら時刻情報がたぶん唯一の引数になります)  ・原点はそのままでXYZ軸に対して回転座標変換を施す  ・結果が求まる。 悩み: 初めに与えたパラメータを保持しておきたい。 座標変換を行った前と変換後の座標も保持しておきたい。 こういった場合、どういうアプローチが良いのでしょうか? 従来型のプログラミングですと構造体を引き回すことになりますが、パラメータと変換後の座標を独立して保持することになり、スマートな気がしません。 折角オブジェクト指向を使うので出来れば全て1パックにしておくのが望ましいと思うのですが、メンバ、メソッド…どうすれば良いのか分からず、こちらで質問させていただきます。 よろしくお願いします

  • this._x と this._yをドラッグした後の値に変更したい

    バージョンはFLASH8です。 attachMovieメソッドでインスタンスを作成しました。 インスタンスは複数あり、作成した後にドラッグして場所を入れ替えます。 それぞれのインスタンスを衝突判定します。赤い箱のムービークリップに衝突したら、インスタンスは箱に入り、青い箱に衝突したら元の場所に戻るようにしたいのです。 どうしても、その「元の場所」が移動した後の座標ではなく、最初にインスタンスを作成した座標になってしまうので、困っています。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • コマの運動について

    コマの衝突についての質問です。高校物理では物体Aと物体Bが衝突する場合、物体自身は直線運動しています。、しかし、コマ同士が衝突する場合、コマの回転による効果を衝突時に考慮しなければならないと思います。 そこで、例えば、「滑らかなかな床でのコマの衝突を考える。コマAとコマBの質量をそれぞれm1m2, 回転の角速度をそれぞれω1ω2、 衝突時の速度をそれぞれv1,v2とする。ただし、コマの表面の材質は同じで、コマの表面(衝突する部分)の動摩擦係数をμ'とする。また、コマの質量の違いはコマの内部の材質によるものとする。」のようなモデルを考えた場合どのように考えればよいと思いますか?定義した記号以外に必要な物理量があれば、自由に定義してもらってもかまいません。 さらに、「右回転同士での衝突と右回転と左回転の衝突の違い」についても考察していただけるとありがたいです

  • 回転数と衝突時の反動の大きさ

    例えば野球のボールなど、ある回転している物体が何かに衝突した時、回転数の違いははね返りの大きさに影響を与えるのでしょうか? また、もし影響がある場合、「まったくの無回転のボールと回転するボールの飛び方は変わるが、回転数に多少の差がある程度(バットに当たるまでに15回転する球と10回転する球の場合、など)では影響はそれほどない」というような、考慮すべき条件はあるのでしょうか? 私の個人的感覚では、回転の少ないコマ同士がぶつかった場合より回転の多いコマ同士がぶつかった場合の方が大きくはじけ飛ぶような気がしますし、ピッチングマシンで強い回転をかけたボールの方が軽く振っても飛びやすいような気がするため、このような質問をさせていただきました。

  • パラボラ面に同時にボールを落としたとき

    放物線を対称軸について回転した形状(パラボラアンテナの形状)を下におき 上からボールを同時に落とすという実験をNHKでやってました。 光や音など直進するものなら、焦点で同時にぶつかることはわかるのですが ボールのような抛物運動をする物体の場合も同じ点でぶつかるのでしょうか? 番組では焦点の辺りにベルを置いて、 ボールをぶつけるような演出だったのですが 理論的に考えても多少の差が出るように思うのですが…。

  • 簡単な力学の問題の考え方について

    テーブルの上に本が置いてあり、横向きに力をかけて動かすことを考えます。滑るかどうかは、摩擦抵抗を考えて、横向き力と比較すれば評価できます。 では、その本に回転の中心軸を取り付けて回転する方向にモーメントをかけた場合、それが回転を始めるかどうかの評価はどうすればいいでしょうか。摩擦が回転のモーメントに対しても抵抗力となるはずなので抵抗力のモーメントと回転モーメントの大小ではないかと思いますが。 横向きの運動(並進運動)のような簡単な式が作れるかどうかということですが。底面形状の複雑さなどが問題かもしれませんが、単純な矩形と考えます。よろしくお願いします。

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

    内積を用いた移動する線分と円の衝突判定について 作成しているプログラムはピンボールのフリッパーとボールとの衝突判定です。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()は関数で角度をラジアンに変更します。

専門家に質問してみよう