形成矩形的C点
我有一段代码,用于确定4x,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 会说“不是矩形”(因为点的顺序不正确) 这就是我所拥有的:形成矩形的C点,c,C,我有一段代码,用于确定4x,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,
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)检查每对连续段,以确保它们垂直:(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)) ); }
但是,如果使用非常大或非整数坐标,则可能需要调整上述示例,以允许舍入误差。,你的意思是像你的例子中那样从左下角开始,还是从任何顶点逆时针开始?好吧,我明白你的意思,并尝试了一下,它似乎解决了问题,但后来一个不同的点:0-4,40,04,-40停止工作啊…我的方法只适用于与轴对齐的矩形,这是我的假设。@WeatherVane是的..如你所知由于点按给定的顺序形成一个矩形,如果这是你的意思的话,顺时针还是逆时针都无关紧要。这是OP想要的,还是他只是想要,比如说,逆时针?@WeatherVane OP没有指定顺时针或逆时针……错误的顺序他给出的例子中,对角是连续给出的,两者都不是。这是事实,但他给出的例子是逆时针的。这个问题措辞不当,说明了垂直线和水平线的特殊情况,这不是OP的意图,但可以从他使用的点积推断出来。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)) ); }