多边形平面裁剪算法无法正常工作

问题描述 投票:0回答:0

我正在尝试为由 3 个向量位置组成的多边形实现裁剪算法。这个多边形被 3d 空间中的一个平面裁剪。

我遇到的问题是,在裁剪过程中,裁剪位置的缓冲区有时没有完全填满。函数完成后,裁剪多边形的位置少于 3 个并且可能为零个位置。

void
SplitPolygon(const polygon& Poly, vec4 SplitPlane, std::vector<polygon>& FrontPolygons, std::vector<polygon> BackPolygons)
{
    uint32_t NumFront = 0, NumBack = 0;
    std::vector<vec3> FrontVerts;
    std::vector<vec3> BackVerts;

    vec4 TempA = Poly.V[2].Pos;
    vec3 A = TempA.xyz;
    uint32_t ASide = ClassifyPointToPlane(A, SplitPlane);
    for(int VertIdx = 0;
        VertIdx < 3;
        ++VertIdx)
    {
        vec4 TempB = Poly.V[VertIdx].Pos;
        vec3 B = TempB.xyz;
        uint32_t BSide = ClassifyPointToPlane(B, SplitPlane);
        if(BSide == POINT_IN_FRONT_OF_PLANE)
        {
            if(ASide == POINT_BEHIND_PLANE)
            {
                vec3 IntersectionP = EdgePlaneIntersection(B, A, SplitPlane);
                //assert(ClassifyPointToPlane(IntersectionP, SplitPlane) == POINT_ON_PLANE);
                FrontVerts.push_back(IntersectionP);
                BackVerts.push_back(IntersectionP);
            }
            else if(ASide == POINT_ON_PLANE || ASide == POINT_IN_FRONT_OF_PLANE)
            {
                FrontVerts.push_back(A);
            }
            FrontVerts.push_back(B);
        }
        else if(BSide == POINT_BEHIND_PLANE)
        {
            if(ASide == POINT_IN_FRONT_OF_PLANE)
            {
                vec3 IntersectionP = EdgePlaneIntersection(A, B, SplitPlane);
                //assert(ClassifyPointToPlane(IntersectionP, SplitPlane) == POINT_ON_PLANE);
                FrontVerts.push_back(IntersectionP);
                BackVerts.push_back(IntersectionP);
            }
            else if(ASide == POINT_ON_PLANE)
            {
                BackVerts.push_back(A);
            }
            else
            {
                BackVerts.push_back(A);
            }
            BackVerts.push_back(B);
        }
        else
        {
            FrontVerts.push_back(B);
            if(ASide == POINT_BEHIND_PLANE)
            {
                BackVerts.push_back(B);
            }
            else if(ASide == POINT_ON_PLANE || ASide == POINT_IN_FRONT_OF_PLANE)
            {
                FrontVerts.push_back(A);
            }
            A = B;
            ASide = BSide;
        }
    }

    // NOTE: Filling out polygon data
    static uint32_t QuadIndices[6] = {0, 1, 2, 3, 2, 0};

    uint32_t FrontSize = FrontVerts.size() == 3 ? 1 : 2;
    uint32_t BackSize = BackVerts.size() == 3 ? 1 : 2;
    polygon NewPolygon = {};
    for(uint32_t i = 0;
        i < FrontSize;
        ++i)
    {
        for(uint32_t j = 0;
            j < (FrontVerts.size() & 3);
            ++j)
        {
            NewPolygon.V[j].Pos = vec4(FrontVerts[QuadIndices[i*2+j]], 1);
            NewPolygon.V[j].Norm = Poly[0].Norm;
            NewPolygon.V[j].Col = Poly[0].Col;
        }
        FrontPolygons.push_back(NewPolygon);
    }

    for(uint32_t i = 0;
        i < BackSize;
        ++i)
    {
        for(uint32_t j = 0;
            j < (BackVerts.size() & 3);
            ++j)
        {
            NewPolygon.V[j].Pos = vec4(BackVerts[QuadIndices[i*2+j]], 1);
            NewPolygon.V[j].Norm = Poly[0].Norm;
            NewPolygon.V[j].Col = Poly[0].Col;
        }
        BackPolygons.push_back(NewPolygon);
    }
}

基本上,我想要最少的完全填充的三元组位置,以便进一步的计算是正确的。谢谢

c++ graphics computational-geometry mesh
© www.soinside.com 2019 - 2024. All rights reserved.