鱼C论坛

 找回密码
 立即注册
查看: 2499|回复: 6

判别图形

[复制链接]
发表于 2015-4-15 17:36:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么通过程序判断这两个图形的形状。这两个图形的各个节点都是组成一个列表[1,2,3,4],但是它们的图形不一样,我最后需要得到正方形。用什么方法编程比较好,求帮助,谢谢。

图1

图1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-15 17:39:23 | 显示全部楼层
利用数学的角度,是可以通过垂直的两个向量相乘等于0来判断,比如对于正方形而言向量1,4乘以向量3,4等于零,对于异常的正方形而言,向量1,4乘以向量3,4不等于0,可以通过这样的方式来做,但是怎么用python实现我还没有思路,想听听大家的想法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-15 18:14:15 | 显示全部楼层
设四个点的坐标为A(x1, y1), B(x2, y2),C (x3, y3),D (x4, y4)
根据几何知识,AB = (x2-x1, y2-y1),同理BC = (x3-x2, y3-y2)
CD = (x4-x3, y4-y3)
DA = (x1-x4, y1-y4)
数学条件:1、AB垂直于BC,BC垂直于CD,CD垂直于DA,有这三条可保证ABCD为矩形,
                 2、邻边相等即可让ABCD为正方形
python代码
  1. # 设已经有了a,b,c,d四个点的坐标
  2. import math
  3. # 先得到四个向量的坐标
  4. ab = (b[0]-a[0], b[1]-a[1])
  5. bc = (c[0]-b[0], c[1]-b[1])
  6. cd = (d[0]-c[0], d[1]-c[1])
  7. da = (a[0]-d[0], a[1]-d[1])
  8. is_rectangle = (ab[0]*bc[1]-ab[1]*bc[0]) == 0 \
  9.         and (bc[0]*cd[1]-cd[1]*bc[0]) == 0 \
  10.         and (cd[0]*da[1]-da[1]*cd[0]) == 0
  11. is_square = is_rectangle and math.sqrt(ab[0]**2+ab[1]**2) == math.sqrt(bc[0]**2+bc[1]**2)
复制代码
is_square变量是存储的就是判断结果 ,如果为正方形则为True,否则为False
纯手打,上面的代码没有运行过,但是大概意思应该表达 到了,楼主自己测试下哈







小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 19:50:26 | 显示全部楼层
lightninng 发表于 2015-4-15 18:14
设四个点的坐标为A(x1, y1), B(x2, y2),C (x3, y3),D (x4, y4)
根据几何知识,AB = (x2-x1, y2-y1),同理BC ...

运行的结果是正确的。我之前也是这么编的,但是没有你想的全面。谢谢了。我还有一个疑问,当出现不是正方形的情况的时候,可不可以通过程序将这中异常情况的点进行互换,使得其变成正方形呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-15 20:02:54 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-15 20:21 编辑
xiangjibang 发表于 2015-4-15 19:50
运行的结果是正确的。我之前也是这么编的,但是没有你想的全面。谢谢了。我还有一个疑问,当出现不是正方 ...

你提的这个问题就比较复杂了,因为涉及到,可能abcd在合适的位置上可以组成四边形,但是这个四边形不是正方形,甚至不是矩形的情况 ~我几何知识真记的不多了,感觉你的这个问题,更多的是几何的问题,你先从几何上做出求解方法,然后用python实现就好了~
1、从几何层面上想(几何忘的差不多了,应该有更简单的方法)
如果ab和cd的交点在这两条线段上,则交换bc;如果ad和bc的交点在这两条线段上,则交换cd;交换的方式过的话可以记录下来,等下输出;然后再判断abcd是否为正方形,如果成功,则四点可以组成正方形,输出交换方式;如果失败,则四点不可能组成正方形
2、暴力破解法
找到所有abcd四点的所有排列方式,然后去判断每一种排列可否组成正方形即可,然后将组成正方形的排列和原点对比,判断出交换方式


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-4-15 20:15:15 | 显示全部楼层
lightninng 发表于 2015-4-15 20:02
你提的这个问题就比较复杂了,因为涉及到,可能abcd在合适的位置上可以组成四边形,但是这个四边形不是正 ...

我现在需要做的,不会出现矩形的情况,只会出现我发的图片中的两种情况。
对于异常的情况,只需要将对边中的两个点的坐标对换一下就好了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-15 20:24:59 | 显示全部楼层
xiangjibang 发表于 2015-4-15 20:15
我现在需要做的,不会出现矩形的情况,只会出现我发的图片中的两种情况。
对于异常的情况,只需要将对边 ...

如果四点确实是能组成正方形的话,应该有两种情况 ,
第一种,1和2在对角,将你的图2中的2,4对换的情况
第二种,1和4在对角,你图2 中的情况
1、计算1,2长度,和1,4 长度,
2、如果1,2的长度比较长,交换2,3
3、如果1,4长度比较长,交换3,4
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-31 04:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表