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

wingardium 2014-04-05 10:57:13
如题。
每个点的坐标值都是double型(四则运算可以认为不损失精度)。要求:不能使用开平方运算。
...全文
886 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 这个算不算;
Tc2.0 编俄罗斯方块游戏 很多编程爱好者都编过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后, 问我是怎么做的。我一直想把这个程序的整个过程一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新了一遍,尽量使程序的结构比较清晰好懂一些。同时了下面的这份东西。   俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时了些专门针对这些方法的示例程序。这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。   下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。 关于俄罗斯方块程序的一些问题: ****************************************************** Tc2.0中怎么样设置图形显示? Tc2.0中常用图形函数的用法? 怎样获取鍵盘输入? 怎样控制方块的移动? 怎样控制时间间隔(用于游戏中控制形状的下落)? 游戏中的各种形状及整个游戏空间怎么用数据表示? 游戏中怎么判断左右及向下移动的可能性? 游戏中怎么判断某一形状旋转的可能性? 按向下方向键时加速某一形状下落速度的处理? 怎么判断某一形状已经到底? 怎么判断某一已经被填满? 怎么消去已经被填满的一行? 怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行) 怎样修改游戏板的状态? 怎样统计分数? 怎样处理升级后的加速问题? 怎样判断游戏结束? 关于计分板设计的问题。 关于“下一个”形状取法的问题。 剩下的问题。 ****************************************************** 游戏中的各种形状及整个游戏空间怎么用数据表示? 以后我提到的形状都是指下面七种形之一及它们旋转后的变形体。 □□□□ □□□□ □□□□ □□□□ □■□□ □■■□ □□□□ □□□□ □■□□ □■□□ □■□□ □■■□ □■■□ □■□□ ■■■□ ■■□□ □□□□ □■□□ □□□□ □□□□ □■□□ □□□□ ■■□□ □■□□ □■■□ □■■□ □■□□ □■■□ 我定义了一个结构来表示形状。 struct shape { int xy[8]; int color; int next; } -1 0 1 2 -3□□□□ -2□□□□ -1□□□□ 0□■□□   所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4 个数对来表示。坐标x从左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺 序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape中的xy就是用来表示这4个数对的。为了简化程序,用一维数组xy[8]来表示。xy[0]、xy[1]表示第一个数对,xy[2]、xy[3]表示第二个数对,依次类推。   shape中的color表示形状的颜色,不同的形状有不同的颜色。七种形状及它们旋转后的变形体一共有19种形状,用一个全局数组表示。假定旋转的方向是逆时针方向(顺时针方向道理一样)。shape中的next就表示当前形状逆时针旋转后的下一个形状的序号。例如:第一种形状及其旋 转变形的形状用结构表示如下。 □□□□ □□□□ □□□□ □□□□ □■□□ □□□□ □■■□ □□□□ □■□□ □□■□ □□■□ ■■■□ □■■□ ■■■□ □□■□ ■□□□ struct shape shapes[19]= { /*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/ { 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */ {-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */ { 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */ {-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */ …… }

62,614

社区成员

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

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