二维直角坐标系,输入四个点的坐标(x1, y1), (x2, y2), (x3, y3), (x4, y4)。写一算法,判断这四个点是不是能够围成一个矩形

wingardium 2014-04-05 10:57:13
如题。
每个点的坐标值都是double型(四则运算可以认为不损失精度)。要求:不能使用开平方运算。
...全文
883 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kenzson 2014-04-11
  • 打赏
  • 举报
回复
应该是对角的直角,相邻的不能判断
shuhaohao 2014-04-10
  • 打赏
  • 举报
回复
对边的坐标差相等,斜边坐标差的平方和相等
wingardium 2014-04-10
  • 打赏
  • 举报
回复
引用 13 楼 u012872817 的回复:
打错个数字。。。
	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 + y3)
			|| (isRightangle(x1, y1, x3, y3, x4, y4) && x1 + x2 == x3 + x4 && y1 + y2 == y3 + 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;
	}
这个是正解了。
wwzhzh 2014-04-10
  • 打赏
  • 举报
回复
打错个数字。。。
	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 + y3)
			|| (isRightangle(x1, y1, x3, y3, x4, y4) && x1 + x2 == x3 + x4 && y1 + y2 == y3 + 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;
	}
wwzhzh 2014-04-10
  • 打赏
  • 举报
回复
上面的只判断了对角直角,用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)
			|| (isRightangle(x1, y1, x3, y3, x4, y4) && x1 + x2 == x3 + x4 && y1 + y2 == y3 + 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;
	}
wwzhzh 2014-04-10
  • 打赏
  • 举报
回复
考虑有重复点的话那么就这样变下

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;
	}
Inhibitory 2014-04-10
  • 打赏
  • 举报
回复
把他们放在一个数组里array[0] = {p1, p2, p3, p4} 排序,先y后x,那么array[0].y == array[1].y,...,如果不满足则不能。
wingardium 2014-04-10
  • 打赏
  • 举报
回复
引用 6 楼 u012872817 的回复:
	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;
	}
对于输入System.out.println(isRectangle(7,0,161,47,7,0,161,0)),输出是true。但是应该输出false吧?
wingardium 2014-04-10
  • 打赏
  • 举报
回复
引用 7 楼 awajwgluiawa 的回复:
我的思路是首先判断是否三三个点不在一条直线上,然后在比对是否有两对直角即可
题目可没有说四点坐标不能有重复哦。 如果我的输入是:(7, 0), (161, 47), (7, 0), (161, 0), 显然这四点不能围成一个矩形,但满足你的判断条件。
Kenzson 2014-04-10
  • 打赏
  • 举报
回复
我的思路是首先判断是否三三个点不在一条直线上,然后在比对是否有两对直角即可
wwzhzh 2014-04-10
  • 打赏
  • 举报
回复
	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;
	}
kosora曹 2014-04-09
  • 打赏
  • 举报
回复
1、开N次方用二分法,正切可以用四则、开方运算的级数推导,然后余弦就可以用万能公式推导出来了。 2、用字典序法(或回溯法)算出4个点的全排列,接下来根据"两个平行,对角线相等"判断是否是矩形。
jshzhgr 2014-04-06
  • 打赏
  • 举报
回复
先看边,如果坐标y不同,就判断两条边是否相等,然后再看角是否为直角?可否?
wingardium 2014-04-05
  • 打赏
  • 举报
回复
引用 1 楼 u012724379 的回复:
余弦定理:a平方=b平方+c平方—2*b*c*cosA 这个算不算;
你要是能自己写个求cosA的算法而不用库函数,就算你解决问题了。
-江沐风- 2014-04-05
  • 打赏
  • 举报
回复
余弦定理:a平方=b平方+c平方—2*b*c*cosA 这个算不算;

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧