美文网首页
UE4 C++ 判断点是否在面内

UE4 C++ 判断点是否在面内

作者: gardenlike2 | 来源:发表于2023-02-27 17:01 被阅读0次

    网上的拿来修改的,因为ue里FVector2D点积是返回的向量记录下

    bool UBFL_SpatialAnalysis::IsinPolygon(TArray<FVector2D>PList, FVector2D Point)
    {
        bool  flag = false;
        
    
        int count = PList.Num() - 1;
        for (int i = 0; i < count; i++) {
            int next = (i == (count - 1) ? 0 : (i + 1));
            FVector2D Point1 = PList[i];//多边形两个顶点
            FVector2D Point2 = PList[next];
    
            if (OnSegment(Point1,Point2,Point))//如果在线上就表示在范围内
            {
                return true;
            }
    
            //前一个判断min(P1.y,P2.y)<P.y<=max(P1.y,P2.y)
            //这个判断代码我觉得写的很精妙 我网上看的 应该是大神模版
            //后一个判断被测点 在 射线与边交点 的左边
            if ((dcmp(Point1.Y - Point.Y) > 0 != dcmp(Point2.Y - Point.Y) > 0) && dcmp(Point.X - (Point.Y - Point1.Y) * (Point1.X - Point2.X) / (Point1.Y - Point2.Y) - Point1.X) < 0)
            {
                flag = !flag;
            }
        }
        return flag;
    }
    
    bool UBFL_SpatialAnalysis::OnSegment(FVector2D PointA, FVector2D PointB, FVector2D Q)
    {
        //前一个判断点Q在直线PAPB直线上、后一个判断在PAPB的范围内
        return dcmp((PointA - Q) ^ (PointB - Q)) == 0 && dcmp((PointA - Q).X* (PointB - Q).X+ (PointA - Q).Y * (PointB - Q).Y) <= 0;
    }
    
    int32 UBFL_SpatialAnalysis::dcmp(double x)
    {
        return (x<0?-1:1);
    }
    
    
    image.png

    上图判断点是否在spline围起来的面内

    相关文章

      网友评论

          本文标题:UE4 C++ 判断点是否在面内

          本文链接:https://www.haomeiwen.com/subject/atzhldtx.html