微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

二维直角坐标系,输入四个点的坐标(x1, y1), (x2

时间:2014-04-10 17:47  浏览:努力统计中...
如题。 每个点的坐标值都是double型(四则运算可以认为不损失精度)。要求:不能使用开平方运算。 余弦定理:a平方=b平方+c平方—2*b*c*cosA 这个算不算; 你要是能自己写个求cosA的算法而
如题。
每个点的坐标值都是double型(四则运算可以认为不损失精度)。要求:不能使用开平方运算。

余弦定理:a平方=b平方+c平方—2*b*c*cosA
这个算不算;



你要是能自己写个求cosA的算法而不用库函数,就算你解决问题了。

先看边,如果坐标y不同,就判断两条边是否相等,然后再看角是否为直角?可否?

1、开N次方用二分法,正切可以用四则、开方运算的级数推导,然后余弦就可以用万能公式推导出来了。
2、用字典序法(或回溯法)算出4个点的全排列,接下来根据"两个平行,对角线相等"判断是否是矩形。

对边的坐标差相等,斜边坐标差的平方和相等

	public static void main(String[] args) {
System.out.println(isRectangle(3,1,2,-1,0,0,1,2));
}

public static boolean isRectangle(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
return (isRightangle(x1, y1, x2, y2, x4, y4) && isRightangle(x3, y3, x2, y2, x4, y4))
||(isRightangle(x1, y1, x2, y2, x3, y3) && isRightangle(x4, y4, x2, y2, x3, y3))
||(isRightangle(x1, y1, x3, y3, x4, y4) && isRightangle(x2, y2, x3, y3, x4, y4));
}

public static boolean isRightangle(double x1, double y1, double x2, double y2, double x3, double y3) {
return (x2 - x1) * (x3 - x1) + (y2 - y1) * (y3 - y1) == 0.0;
}


我的思路是首先判断是否三三个点不在一条直线上,然后在比对是否有两对直角即可



题目可没有说四点坐标不能有重复哦。
如果我的输入是:(7, 0), (161, 47), (7, 0), (161, 0), 显然这四点不能围成一个矩形,但满足你的判断条件。



对于输入System.out.println(isRectangle(7,0,161,47,7,0,161,0)),输出是true。但是应该输出false吧?

把他们放在一个数组里array[0] = {p1, p2, p3, p4} 排序,先y后x,那么array[0].y == array[1].y,...,如果不满足则不能。

考虑有重复点的话那么就这样变下


public static void main(String[] args) {
System.out.println(isRectangle(1,1,23,-18,11,-23,13,6));
}

public static boolean isRectangle(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
return (isRightangle(x1, y1, x2, y2, x4, y4) && isRightangle(x3, y3, x2, y2, x4, y4))
|| (isRightangle(x1, y1, x2, y2, x3, y3) && isRightangle(x4, y4, x2, y2, x3, y3))
|| (isRightangle(x1, y1, x3, y3, x4, y4) && isRightangle(x2, y2, x3, y3, x4, y4));
}

public static boolean isRightangle(double x1, double y1, double x2, double y2, double x3, double y3) {
return !(((x1 == x2) && (y1 == y2)) || ((x1 == x3) && (y1 == y3)))
&& (x2 - x1) * (x3 - x1) + (y2 - y1) * (y3 - y1) == 0.0;
}


上面的只判断了对角直角,用3个直角才行,或者换个思路,用平行+直角判断。
	public static void main(String[] args) {
System.out.println(isRectangle(1, 1, 23, -18, 13, 6, 11, -23));
}

public static boolean isRectangle(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
return (isRightangle(x1, y1, x2, y2, x4, y4) && x1 + x3 == x2 + x4 && y1 + y3 == y2 + y4)
|| (isRightangle(x1, y1, x2, y2, x3, y3) && x1 + x4 == x2 + x3 && y1 + y4 == y2 + y2)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------