Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
形成矩形的C点_C - Fatal编程技术网

形成矩形的C点

形成矩形的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,

我有一段代码,用于确定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,
                       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)) );
    }