找出4点形成四边形

时间:2012-03-01 08:45:31

标签: algorithm geometry

有人可以给我看一个编写函数的算法,如果4个点组成四边形,则返回true,否则为false?这些积分没有任何订单。

我试图检查4个点的所有排列,看看是否有3个点形成一条直线。如果有3个点形成一条直线而不是四边形。但后来我意识到没有办法告诉订单。然后我挣扎了几个小时的思考和谷歌搜索没有结果:(

我已经阅读了这些问题:

  1. find if 4 points on a plane form a rectangle?
  2. Determining ordering of vertices to form a quadrilateral
  3. 但仍然找不到解决方案。在1的情况下,它不能检测另一种四边形,而在2中它假设这些点已经是四边形。有没有其他方法可以确定4个点是否形成了四边形?

    先谢谢。

    编辑澄清:

    我将四边形定义为简单的四边形,基本上所有形状都显示在此图片中: Quadirateral

    除了"四边形"和"复杂"标题。

    关于"检查共线三联体的问题"我尝试用这样的方法检查垂直,水平和对角线:

    def is_linear_line(pt1, pt2, pt3):
        return (pt1[x] == pt2[x] == pt3[x] ||
                pt1[y] == pt2[y] == pt3[y] ||
                slope(pt1, pt2) == slope(pt2, pt3))
    

    并且意识到矩形和正方形将计为直线,因为点的斜率将是相同的。希望这能解决问题。

5 个答案:

答案 0 :(得分:1)

除非您使用比您现在执行的操作贵得多的操作,否则无法在同一操作中确定顶点顺序和四边形的存在。

答案 1 :(得分:1)

检查共线三元组(就像你一样)将排除四个点形成三角形或直线的情况。

也要排除复杂的四边形(带有交叉边):

如果AB和CD(如果有的话)的交点位于A点和B点之间,那么由点A,B,C和D形成的四边形是复杂的,并且这同样适用于BC和DA。

答案 2 :(得分:1)

这用于检查四边形是否凸出。不是如果它是一个简单的四边形。

我在objective-c https://github.com/hfossli/AGGeometryKit/

中确实喜欢这样
extern BOOL AGQuadIsConvex(AGQuad q)
{
    BOOL isConvex = AGLineIntersection(AGLineMake(q.bl, q.tr), AGLineMake(q.br, q.tl), NULL);
    return isConvex;
}

BOOL AGLineIntersection(AGLine l1, AGLine l2, AGPoint *out_pointOfIntersection)
{
    // http://stackoverflow.com/a/565282/202451

    AGPoint p = l1.start;
    AGPoint q = l2.start;
    AGPoint r = AGPointSubtract(l1.end, l1.start);
    AGPoint s = AGPointSubtract(l2.end, l2.start);

    double s_r_crossProduct = AGPointCrossProduct(r, s);
    double t = AGPointCrossProduct(AGPointSubtract(q, p), s) / s_r_crossProduct;
    double u = AGPointCrossProduct(AGPointSubtract(q, p), r) / s_r_crossProduct;

    if(t < 0 || t > 1.0 || u < 0 || u > 1.0)
    {
        if(out_pointOfIntersection != NULL)
        {
            *out_pointOfIntersection = AGPointZero;
        }
        return NO;
    }
    else
    {
        if(out_pointOfIntersection != NULL)
        {
            AGPoint i = AGPointAdd(p, AGPointMultiply(r, t));
            *out_pointOfIntersection = i;
        }
        return YES;
    }
}

答案 3 :(得分:0)

你还有比4分更多的投入吗?因为如果你的测试成功4分,他们总能形成3个不同的四边形,有时是不同的家庭。例如,取一个正方形,添加2个对角线并移除侧面。

因此,只有4分作为输入,你不能比你现在做的更好。

答案 4 :(得分:0)

让A,B,C和D为四点。您必须假设边缘是A-B,B-C,C-D和D-A。如果你不能做出这个假设,这四个点将永远形成一个四边形。

if (A-B intersects C-D) return false
if (B-C intersects A-D) return false
return true