题目:
给定4个二维坐标点
struct Point { double x,y; };
判断能否围成矩形。
考点分析:
矩形的数学判断方式
程序对判断过程的模拟
double数据比较大小
现场错误:
没有考虑到斜放的矩形
解题思路:
1、任取一点作为基准点 A
2、取距离基准点最远的点作为对角点 D(a^2+b^2不开方)
3、证明另外两点的连线 BC 被对角线 AD 平分,且两对角线相等
补充1——证明对角线相等且平分的方法:
方法1:分别计算 AD 和 BC 中点,判断重合;另计算长度相等
方法2:取 AD 中点 O,计算向量 BO、OC,判断 BO = OC 且 |BO| = |OD|
(注意double数据比较大小的方法:两数相减小于最小精度 = 两数相等)
(距离计算:平方相加后直接比较,不开方,减小浮点数误差)
补充2——其他方法及评价
方法1:
角 A、B、C 都是直角,用向量相乘等于0计算。
缺点是程序有些混乱,每个点都要计算3对边是否垂直(找到垂直即可continue)
方法2:
坐标变换,取基准点 A,排除 AB、AC、AD中最长边(含相等),取基准边 AB,用坐标变换公式把“斜矩形”转换为“水平矩形”,愉快地比较新坐标值。
缺点是坐标变换公式同样有浮点数误差的问题;且在坐标点是整数的问题中,此方法不能回避浮点数运算(补充1中的中点计算,可先进行所有点坐标乘2的预处理)