C点形成矩形

时间:2014-11-02 18:05:44

标签: c

我有这段代码可以找出4 x,y坐标是否构成一个效果非常好的矩形,但是,我需要这样做才能使它只在以正确的顺序输入点时起作用,即: 第1点: 0 0 第2点: 20 0 第3点: 20 50 第4点: 0 50 会说“是一个矩形”但是: 第1点: 0 0 第2点: 20 0 第3点: 0 50 第4点: 20 50 会说“不是一个矩形”(因为这些点不是正确的顺序)

这就是我所拥有的:

 static bool IsRectangle(float x1, float y1, float x2, float y2,
                       float x3, float y3, float x4, float y4)
    {
    x2 -= x1; x3 -= x1; x4 -= x1; y2 -= y1; y3 -= y1; y4 -= y1;
    return
    (x2 + x3 == x4 && y2 + y3 == y4 && x2 * x3 == -y2 * y3) ||
    (x2 + x4 == x3 && y2 + y4 == y3 && x2 * x4 == -y2 * y4) ||
    (x3 + x4 == x2 && y3 + y4 == y2 && x3 * x4 == -y3 * y4);
    }

我完全不确定如何限制它只能以正确的顺序工作...... :( 谢谢

2 个答案:

答案 0 :(得分:1)

注意:此方法仅适用于与轴对齐的矩形。

考虑相邻点之间的ΔX/ Y.在第一种情况下,你有:

  • (20,0)
  • (0,50)
  • ( - 20,0)

在第二种情况下你有:

  • (20,0)
  • ( - 20,50)< ===
  • (20,0)

突出显示的行显示了如果点无序则要查找的内容...检查相邻点之间的增量X / Y,两者都不为零。

在代码方面,以下内容应该有效(未经测试):

static bool IsRectangle(float x1, float y1, float x2, float y2,
                   float x3, float y3, float x4, float y4)
{
    int dx1 = x2 - x1;
    int dx2 = x3 - x2;
    int dx3 = x4 - x3;
    int dy1 = y2 - y1;
    int dy2 = y3 - y2;
    int dy3 = y4 - y3;

    x2 -= x1; x3 -= x1; x4 -= x1; y2 -= y1; y3 -= y1; y4 -= y1;

    return
        (dx1 == 0 || dy1 == 0) && (dx2 == 0 || dy2 == 0) && (dx3 == 0 || dy3 == 0) &&
        ((x2 + x3 == x4 && y2 + y3 == y4 && x2 * x3 == -y2 * y3) ||
        (x2 + x4 == x3 && y2 + y4 == y3 && x2 * x4 == -y2 * y4) ||
        (x3 + x4 == x2 && y3 + y4 == y2 && x3 * x4 == -y3 * y4));
}

答案 1 :(得分:1)

检查每对连续的段以确保它们是垂直的:(x1,y1) - > (x2,y2)垂直于(x2,y2) - > (x3,y3),(x2,y2) - > (x3,y3)垂直于(x3,y3) - > (x4,y4)等,以(x4,y4) - >结束; (X1,Y1)。如果是这样,你有一个矩形。

因此,对于每个段,您需要减去端点以获得段的向量...然后对于这些向量的每个(连续)对,检查X组件的乘积和Y的乘积之和组件为零,表示它们是正交的。

例如:

static bool IsRectangle(float x1, float y1, float x2, float y2, 
                        float x3, float y3, float x4, float y4)
{
  return !( ((x2-x1)*(x3-x2) + (y2-y1)*(y3-y2)) ||
            ((x3-x2)*(x4-x3) + (y3-y2)*(y4-y3)) ||
            ((x4-x3)*(x1-x4) + (y4-y3)*(y1-y4)) ||
            ((x1-x4)*(x2-x1) + (y1-y4)*(y2-y1)) );
}

如果使用非常大或非整数的坐标,可能需要调整上面的示例以允许舍入错误。