C语言矩形判断程序if条件失效:乱序坐标无法正确识别
解决按顺序连接的四点矩形判定问题
你的核心问题是原判断逻辑完全不符合矩形的几何判定规则,仅通过无意义的坐标交叉对比无法正确识别按顺序连接的四边形是否为矩形。以下是修正后的方案:
正确的判定逻辑
对于按输入顺序连接的四点 (P_1(x_1,y_1) \to P_2(x_2,y_2) \to P_3(x_3,y_3) \to P_4(x_4,y_4) \to P_1),构成矩形需要满足:
- 相邻边互相垂直(向量点积为0)
- 对边长度相等(用平方计算避免浮点误差)
- 非退化图形(边长不为0)
修正后的代码
替换原代码中注释为//the condition的部分,以下是完整的修正后代码片段:
// 计算各边的向量分量 int dx1 = x2 - x1, dy1 = y2 - y1; // P1-P2的向量 int dx2 = x3 - x2, dy2 = y3 - y2; // P2-P3的向量 int dx3 = x4 - x3, dy3 = y4 - y3; // P3-P4的向量 int dx4 = x1 - x4, dy4 = y1 - y4; // P4-P1的向量 // 计算各边长度的平方 int len1_sq = dx1*dx1 + dy1*dy1; int len2_sq = dx2*dx2 + dy2*dy2; int len3_sq = dx3*dx3 + dy3*dy3; int len4_sq = dx4*dx4 + dy4*dy4; int isRectangle = 0; // 矩形判定条件:相邻边垂直 + 对边等长 + 非退化 if (len1_sq != 0 && len2_sq != 0 && // 排除退化图形 (dx1*dx2 + dy1*dy2 == 0) && // P1P2 ⊥ P2P3 (dx2*dx3 + dy2*dy3 == 0) && // P2P3 ⊥ P3P4 (len1_sq == len3_sq) && // P1P2 与 P3P4 等长 (len2_sq == len4_sq)) { // P2P3 与 P4P1 等长 isRectangle = 1; }
逻辑说明
- 向量点积为0:两个向量垂直时,它们的点积((dx_1dx_2 + dy_1dy_2))等于0,这保证了四边形的角是直角。
- 长度平方相等:直接计算长度平方避免了
sqrt带来的浮点运算误差,同时保证对边长度一致。 - 非退化检查:排除所有点重合或边长度为0的无效情况。
用这个逻辑测试你给出的例子(0,0) (20,0) (0,50) (20,50):
- (P_1P_2)的向量是(20,0),(P_2P_3)的向量是(-20,50),点积为(20*(-20) + 0*50 = -400 \neq 0),不满足垂直条件,因此判定为非矩形,符合你的需求。
内容的提问来源于stack exchange,提问作者Nare Avetisyan
相关产品推荐
相关产品推荐

