こんなものを見つけた。
プログラミングの問題なのかというと全く違い、中学レベルの数学の問題。
任意の線分l0、l1が重なるとは何か。
間違っていたら笑えない
assertEqualsでやったほうがいいんだが、まあ、今回は使わなくてもいいよね。
private P o, w, h, d;
class P{
int x, y, z;
P(int x, int y, int z){
this.x = x;
this.y = y;
this.z = z;
}
}
public C(int...args){
this.o = new P(args[0], args[1], args[2]);
this.w = new P(args[0]+args[3], args[1], args[2]);
this.h = new P(args[0], args[1]+args[4], args[2]);
this.d = new P(args[0], args[1], args[2]+args[5]);
}
public boolean isCrossed(C c){
if( isIncluded(this.o.x, this.w.x, c.o.x, c.w.x) &&
isIncluded(this.o.y, this.h.y, c.o.y, c.h.y) &&
isIncluded(this.o.z, this.d.z, c.o.z, c.d.z)
) return true;
return false;
}
private static boolean isIncluded(int p0, int q0, int p1, int q1){
return (q0<=p1||q1<=p0)? false : true;
}
}
class C_test{
static C C0 = new C( 0, 0, 0, 10, 10, 10),
C1;
public static void main(String args[]){
C1 = new C(10, 10, 10, 20, 20, 20);
System.out.println("1点共有(1)=" + C0.isCrossed(C1));
// false
C1 = new C(-10,-10,-10, 0, 0, 0);
System.out.println("1点共有(2)=" + C0.isCrossed(C1));
// false
C1 = new C( 0, 10, 10, 20, 20, 20);
System.out.println("1辺共有=" + C0.isCrossed(C1));
// false
C1 = new C( 0, 0, 10, 20, 20, 20);
System.out.println("1面共有=" + C0.isCrossed(C1));
// false
C1 = new C( 5, 5, 10, 20, 20, 20);
System.out.println("1面の一部を共有=" + C0.isCrossed(C1));
// false
C1 = new C( 5, 5, 5, 20, 20, 20);
System.out.println("一部が交わる=" + C0.isCrossed(C1));
// true
C1 = new C( 0, 0, 0, 20, 20, 20);
System.out.println("原点が同じ=" + C0.isCrossed(C1));
// true
C1 = new C(-10, 0, 0, 20, 5, 1);
System.out.println("w点が同じ=" + C0.isCrossed(C1));
// true
C1 = new C( 0, 0, 0, 10, 10, 10);
System.out.println("全座標が同じ位置=" + C0.isCrossed(C1));
// true
C1 = new C( 1, 1, 1, 8, 8, 8);
System.out.println("一方がもう一方に含まれる(1)=" + C0.isCrossed(C1));
// true
System.out.println("一方がもう一方に含まれる(2)=" + C1.isCrossed(C0));
// true
C1 = new C( 0, 0, 0, 10, 10, 5);
System.out.println("一方がもう一方に含まれる(3)=" + C0.isCrossed(C1));
// true
C1 = new C(11, 11, 11, 20, 20, 20);
System.out.println("共有部分無し=" + C0.isCrossed(C1));
// false
}
}