Algorithm 三角形内晶格点的计数

Algorithm 三角形内晶格点的计数,algorithm,collision-detection,counting,Algorithm,Collision Detection,Counting,我有一个大三角形的点,我们称之为a,b,c。(a=(x,y)等等) 现在我想计算这个三角形包围的区域内的积分点数,所以我首先看了皮克定理。我考虑的第二种方法是生成一个以三角形的最大值、最小值为边界的点列表,然后检查每个点是否位于三角形内 我用重心坐标法来做这个。但我的三角形相当大,我的程序基本上是一个跨越点的蛮力。如何改进此算法 我的代码可以在这里找到:这个问题可以而且应该使用。阅读这篇文章,全面了解它是如何工作的,它将适用于任何你能想到的多边形。所以,“Pick说”如果你想计算一个多边形的面积

我有一个大三角形的点,我们称之为a,b,c。(a=(x,y)等等)

现在我想计算这个三角形包围的区域内的积分点数,所以我首先看了皮克定理。我考虑的第二种方法是生成一个以三角形的最大值、最小值为边界的点列表,然后检查每个点是否位于三角形内

我用重心坐标法来做这个。但我的三角形相当大,我的程序基本上是一个跨越点的蛮力。如何改进此算法


我的代码可以在这里找到:

这个问题可以而且应该使用。阅读这篇文章,全面了解它是如何工作的,它将适用于任何你能想到的多边形。所以,“Pick说”如果你想计算一个多边形的面积,你可以使用公式
area=noOfInsidePoints+noOfBoundaryPoints/2-1
。要计算任何多边形的面积,可以使用以下代码,其中
pc
是表示多边形顶点的结构数组

float computeArea()
{
    float area = 0;
    for(int i=1;i<=n;++i) // n is the total number of vertices
        area += (pc[i].x*pc[i+1].y - pc[i+1].x*pc[i].y );
    if(area < 0)
        area *= (-1);
}
最终时间复杂度:O(N)
最终内存复杂性:O(N)

皮克定理有什么问题?
int getBoundaryPoints()
{
    long left=0, right=0;
    int noPoints = 0;
    for(int i=1;i<=n;++i)
    {
        st = abst( pc[i].x - pc[i+1].x );
        right = abs( pc[i].y - pc[i+1].y );
        if(right == 0)
            right = left;
        if(left == 0)
            left = right;
        noPoints += gcd(left, right) +1;
    }
}
noPointsInside = (computeArea() - (getBoundaryPoints() - n)) / 2 + 1;