###前提・実現したいこと
対角線交差判定プログラム
一筆書きで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()の実引数の与える順番が分かりません。
回答4件
あなたの回答
tips
プレビュー