2014-11-02 61 views
1

我有这段代码来找出是否4 x,y坐标使矩形工作得很好,但是,我需要使它只有当点输入正确顺序,即: 点#1:点#2:点#3:点#4:会说: “是矩形” : 点#1:点#2:点#3:点#4:会说:“是不是矩形”(因为点的正确顺序的arent)C点形成矩形

这是我有:

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); 
    } 

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

+0

“按照正确的顺序”,你的意思是从左下角开始,或者逆时针从任何顶点开始? – 2014-11-02 18:56:46

回答

1

检查每对连续节段,以确保它们垂直:(X1,Y1) - >(X2, (x3,y3)→(x4,y4)等垂直于(x2,y2)→(x3,y3),(x2,y2)→(x3,y3)以(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))); 
} 

上面的例子可能需要进行调整,以允许如果使用非常大的或非整数坐标舍入误差,虽然。

+0

如果点的顺序相反,这种方法会起作用吗? – 2014-11-02 20:28:33

+0

@WeatherVane是的,只要点按照给定的顺序形成一个矩形,无论顺时针还是逆时针都没关系,如果这就是你的意思。 – Dmitri 2014-11-02 20:31:44

+0

这是OP想要的,还是他只是想要逆时针方向? – 2014-11-02 20:35:53

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)); 
} 
+0

好吧我明白你的意思了,试试看,它似乎解决了这个问题,但接着出现了一个不同的问题:0 -4, 4 0, 0 4, -4 0停止工作 – 2014-11-02 19:40:30

+0

啊......我的方法只适用于与我所假设的轴对齐的矩形。 – uesp 2014-11-02 20:11:48