簡體   English   中英

C點形成矩形

[英]C points forming rectangle

我有這段代碼來找出4 x,y坐標是否使矩形完美地工作,但是,我需要使它只有在以正確的順序輸入點時才起作用,即:Point#1 :0 0點#2:20 0點#3:20 50點#4:0 50會說“是一個矩形”, :點#1:0 0點#2:20 0點#3:0 50點# 4:20 50會說“不是矩形”(因為點arent的順序正確)

這就是我所擁有的:

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

我完全不確定如何將其限制為僅以正確的順序工作... :(謝謝

注意:此方法僅適用於與軸對齊的矩形。

考慮相鄰點之間的增量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));
}

檢查每對連續的分段以確保它們垂直:(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)) );
}

但是,如果使用非常大或非整數的坐標,則可能需要調整上述示例以允許舍入誤差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM