[英]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.