[英]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。 在第一種情況下,您具有:
在第二種情況下,您有:
突出顯示的行顯示了如果點不正常時要查找的內容...檢查兩個都不為零的相鄰點之間的增量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.