UE4 C++ 判斷點(diǎn)是否在面內(nèi)

網(wǎng)上的拿來修改的,因?yàn)閡e里FVector2D點(diǎn)積是返回的向量記錄下

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];//多邊形兩個頂點(diǎn)
        FVector2D Point2 = PList[next];

        if (OnSegment(Point1,Point2,Point))//如果在線上就表示在范圍內(nèi)
        {
            return true;
        }

        //前一個判斷min(P1.y,P2.y)<P.y<=max(P1.y,P2.y)
        //這個判斷代碼我覺得寫的很精妙 我網(wǎng)上看的 應(yīng)該是大神模版
        //后一個判斷被測點(diǎn) 在 射線與邊交點(diǎn) 的左邊
        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)
{
    //前一個判斷點(diǎn)Q在直線PAPB直線上、后一個判斷在PAPB的范圍內(nèi)
    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

上圖判斷點(diǎn)是否在spline圍起來的面內(nèi)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容