提前判断 3/4 个点是否能够组成矩形

2014-05-26 21:26:40 +08:00
 zeusrunjia
point有两个属性为x,y (整数).
用户可以随机选取1到4个point, 如果期望用户选的四个point最终能够组成一个矩形,并且当用户选了几个point的时候 能够提前告诉他不可能是矩形
比如:
1. 1~2个point,无法预期用户选择, 此时无法判断.
2. 3个point 本质上 如果连线没有直角, 可以提前判断不会组成矩形.
3. 4个point 判断是否组成矩形.

(point的x,y大小在合理的范围内, 比如0~100)

有什么优雅的写法判断2和3过程呢
```
bool check(vector<point> selects){

}
```
3749 次点击
所在节点    程序员
8 条回复
zeusrunjia
2014-05-26 21:30:50 +08:00
我的想法是:
1.两个for 找出对角两个点
2.用对角的两个点算出其他两个点, 看下算出的这两个点是否有一个落在selects中.

不过写出来也略麻烦, 应该有更简单的办法, 用各种库都不介意的.
muyeyang
2014-05-26 21:47:45 +08:00
严格的矩形和近似的矩形处理起来会不一样。
近似的话,检查连续三个点的夹角是否接近90度。参考余弦定理。
严格90度的话,直接勾股定理就行了。
最多测试两次就够。
khowarizmi
2014-05-26 22:12:12 +08:00
ls +1
zeusrunjia
2014-05-26 22:42:25 +08:00
@muyeyang 一样的, 因为连续三个点 这个定义也要写代码. 并不会减少代码量(工作量)
akfish
2014-05-26 22:51:49 +08:00
矩形这么简单的情况,brute force就行。
l除了楼上说的,我只补充一句:两个垂直向量的点积为0。
shoumu
2014-05-26 23:56:27 +08:00
我的思路:

四个点:
> 对角线相等的平行四边形是矩形
将点分成两个组,如果长度不等,则不是矩形。如果相等,构成两个向量,看是否平行,平行的话,交换一个点,看长度是否相等。不平行的话,交换一个点,看是否相等平行。

三个点:
按楼上@akflsh 说的
> 两个垂直向量的点积为0。
也就是三个向量,两两计算点积
nilai
2014-05-27 09:29:22 +08:00
楼做是做百度地图的.
zeusrunjia
2014-05-27 18:03:09 +08:00
@nilai 才不是呢!

貌似大家都忽略两个前提, 1.整数 2.优雅或者取巧的方案.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX