質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

4579閲覧

交差判定プログラムを実現したいです。

gyro16

総合スコア89

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/12/20 06:43

編集2016/12/20 08:16

###前提・実現したいこと
対角線交差判定プログラム

一筆書きで4点を順番に実数で与え、四辺形ABCDができるとき、
対角線ACとBDが交差する時
”YES"を返し、交差しない時に"NO"を返すプログラムを実現したいです。

点A(x[0],y[0]),点B(x[1],y[1]),点C(x[2],y[2]),点D(x[3],y[3]) です。

上記では対角線ACとBDが交差するか、をしたいのです。
■■
もっと簡単に-線分交差判定-
http://www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/Intersection.htm
●●
ここではABとCDが交差するには、
tc=(x1-x2)(y3-y1)+(y1-y2)(x1-x3)
td=(x1-x2)(y4-y1)+(y1-y2)(x1-x4)

tc*td<0

ta=(x3-x4)(y1-y3)+(y3-y4)(x3-x1)
tb=(x3-x4)(y2-y3)+(y3-y4)(x3-x2)

ta*tb<0

上記のものとあわせて、2つの条件判定すれば、2つの線分の交差判定を行うことができます。

この2つの条件が成り立つとあります。
●●

ABとCDが交差するとき 2条件が成立する

tc=(x1-x2)(y3-y1)+(y1-y2)(x1-x3)
td=(x1-x2)(y4-y1)+(y1-y2)(x1-x4)

tc*td<0 条件A

ta=(x3-x4)(y1-y3)+(y3-y4)(x3-x1)
tb=(x3-x4)(y2-y3)+(y3-y4)(x3-x2)

ta*tb<0 条件B

これを
ACとBDが交差するとき に置き換える

■■

下記は交差判定をしようとして誤回答しています。
下記ソースは模索中です。

メソッドisIntersect()に与える引数は対角線ACとBDなので、

与える引数はisIntersect(x[

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

import java.util.*; public class A{ private static final Scanner scan = new Scanner(System.in) .useDelimiter("[,\\s]+"); public static void main(String[] args){ while(scan.hasNext()){ double[] x = new double[4]; double[] y = new double[4]; for(int i = 0; i < 4; i++){ x[i] = scan.nextDouble(); y[i] = scan.nextDouble(); } boolean flag = isIntersect(x[0], y[0], x[2], y[2], x[1], y[1], x[3], y[3]) && isIntersect(x[1], y[1], x[3], y[3], x[0], y[0], x[2], y[2]); System.out.printf("%s\n", flag? "Yes" : "NO"); } } public static boolean isIntersect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4){ //点A(x1,y1)と点B(x2,y2)を結ぶ直線と点C(x3,y3)と点D(x4,y4)を結ぶ線分が交差するかどうか判定 double tc = (x1-x2)*(y3-y1)+(y1-y2)*(x1-x3); double td = (x1-x2)*(y4-y1)+(y1-y2)*(x1-x4); return tc * td < 0; } }

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
メソッドisIntersect()はこう与えられるはず、です。

これを対角線ACとBDに与えて、2条件 && してtrue なら、交差しています。

public boolean isIntersect(double x1, double y1, double x2, double y2,
double x3, double y3, double x4, double y4){
boolean result = false;
double ta=(x1-x2)(y3-y1)+(y1-y2)(x1-x3);
double tb=(x1-x2)(y4-y1)+(y1-y2)(x1-x4);
if(ta*tb < 0){
result = true;
}
return result;
}

**たぶん、メソッドisIntersect()はこれでいいはず。

この先のメソッドisIntersect() && isIntersect() と2条件判定でやるはずなので、

あとはその引数の与える順番が分かりません**

現在はメソッドisIntersect()の実引数の与える順番が分かりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2016/12/20 07:37

isIntersect呼出にコメントを記載ください(線分ACと線分BDが交差など)また、誤判定する例(座標値)を示してください。
ozwk

2016/12/20 08:20

何に対して誤判定しますか?「0 0 1 0 1 1 0 1」はYesですがこれは意図通りですか?
guest

回答4

0

食わせてる元々の図形は、A,B,C,D の順に座標が並んでいるのでしょうか。

計算式自体はおかしなところはなさそうです。あえて言うなら double なので桁落ちする可能性が絶無とは言えませんが、とりあえずは問題ないはずです。

投稿2016/12/20 06:58

編集2016/12/20 07:07
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2016/12/20 08:27

もしかして、「四角形が凸か凹か」を判定したいのでしょうか? 任意の n 点を持つ多角形が凸か凹かを判定するなら、 http://gihyo.jp/dev/serial/01/geometry/0006 が参考になるかと思います。
guest

0

ベストアンサー

出力の所で、"Yes"(esが小文字)になっているのは問題ないのでしょうか?
プログラム自体に問題は見受けられないので、自動判定で通らないのが問題なのかなあと思ったのですが。

投稿2016/12/20 09:02

編集2016/12/20 09:06
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyro16

2016/12/20 10:23

お騒がせしました。ロジックではなくタイプ違いでした。 ありがとうございました。
guest

0

javaで作るならLine2D (Java Platform SE 8 )あたりを使ってもいいかも。

投稿2016/12/20 08:14

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

isIntersectの中身は確認していません。

isIntersect関数を2回呼び出していますが、意味的には同じではありませんか?
(線分ACと線分BDが交差するか)

↑の記載、引用元を見て誤解していたことに気づきました。
isIntersect関数、線分同士の交差判定だと勝手に思ってましたが直線と線分の交差判定しているのですね。であれば2回判定する処理で問題ないはずです。

また、A(0,10), B(0,0), C(10,0), D(5,5)のような凹な形(四辺形とみなしてよい?)だと交差しませんが、結果はNOでよいですか?

投稿2016/12/20 07:42

編集2016/12/20 10:08
can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyro16

2016/12/20 07:56

それを判定するため対角線の交差判定をしています。
tacsheaven

2016/12/20 08:19

それ、三角形になりますね(w 凹四角形の場合はそもそも対角線が四角形内に存在しなくなるので、交差しないのは正解かとは思いますが。
can110

2016/12/20 09:36

失礼!D(3,3)などです。 いずれにせよ凹な多角形の判定ならtacsheavn様のあげた情報を参考にしたほうがいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問