第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

多邊形中的點(diǎn),包括 c# 中帶有邊距的邊緣情況

多邊形中的點(diǎn),包括 c# 中帶有邊距的邊緣情況

C#
慕村225694 2023-09-16 17:00:35
我正在使用 Unity3D,并且有一個(gè)多邊形(Vector2 數(shù)組)以及要檢查的點(diǎn)。在過(guò)去的幾天里,我一直在尋找包括 pnpoly 和其他算法在內(nèi)的解決方案。問(wèn)題是我的誤差高達(dá) 0.001f,因?yàn)槲以谑褂?TransformPoint(以獲取網(wǎng)格頂點(diǎn)的世界位置)后立即乘以四元數(shù),將 3D 面投影到 2D 平面上。我對(duì)多邊形一無(wú)所知,因?yàn)樗鼈兪怯稍S多網(wǎng)格三角形組成的 - 它們可以具有任何形狀。我如何處理這種極端的不準(zhǔn)確性并找到多邊形內(nèi)部或邊界上的所有點(diǎn)?    public static bool IsInsidePolygon(Vector2[] vertices, Vector2 checkPoint)    {        float[] vertX = new float[vertices.Length];        float[] vertY = new float[vertices.Length];        for (int i = 0; i < vertices.Length; i++)        {            vertX[i] = vertices[i].x;            vertY[i] = vertices[i].y;        }        return IsInsidePolygon(vertices.Length, vertX, vertY, checkPoint.x, checkPoint.y);    }    public static bool IsInsidePolygon3(int nvert, float[] vertx, float[] verty, float testx, float testy)    {        int i, j = 0;        bool c = false;        for (i = 0, j = nvert - 1; i < nvert; j = i++)        {            if (((verty[i] > testy) != (verty[j] > testy)) &&         (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))                c = !c;        }        return c;    }
查看完整描述

1 回答

?
明月笑刀無(wú)情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

解決方案是找到到多邊形的最近距離,如果距離在邊距內(nèi),則返回 true,以下是完整代碼:


'''


public static float DistancePointLine2D(Vector2 point, Vector2 lineStart, Vector2 lineEnd)

{

    return (ProjectPointLine2D(point, lineStart, lineEnd) - point).magnitude;

}

public static Vector2 ProjectPointLine2D(Vector2 point, Vector2 lineStart, Vector2 lineEnd)

{

    Vector2 rhs = point - lineStart;

    Vector2 vector2 = lineEnd - lineStart;

    float magnitude = vector2.magnitude;

    Vector2 lhs = vector2;

    if (magnitude > 1E-06f)

    {

        lhs = (Vector2)(lhs / magnitude);

    }

    float num2 = Mathf.Clamp(Vector2.Dot(lhs, rhs), 0f, magnitude);

    return (lineStart + ((Vector2)(lhs * num2)));

}



public static float ClosestDistanceToPolygon(Vector2[] verts, Vector2 point)

{

    int nvert = verts.Length;

    int i, j = 0;

    float minDistance = Mathf.Infinity;

    for (i = 0, j = nvert - 1; i < nvert; j = i++)

    {

        float distance = DistancePointLine2D(point, verts[i], verts[j]);

        minDistance = Mathf.Min(minDistance, distance);

    }


    return minDistance;

}


public static bool IsInsidePolygon(Vector2[] vertices, Vector2 checkPoint, float margin = 0.01f)

{

    if(ClosestDistanceToPolygon(vertices, checkPoint) < margin)

    {

        return true;

    }


    float[] vertX = new float[vertices.Length];

    float[] vertY = new float[vertices.Length];

    for (int i = 0; i < vertices.Length; i++)

    {

        vertX[i] = vertices[i].x;

        vertY[i] = vertices[i].y;

    }


    return IsInsidePolygon(vertices.Length, vertX, vertY, checkPoint.x, checkPoint.y);

}


public static bool IsInsidePolygon(int nvert, float[] vertx, float[] verty, float testx, float testy)

{

    bool c = false;

    int i, j = 0;

    for (i = 0, j = nvert - 1; i < nvert; j = i++)

    {

        if ((((verty[i] <= testy) && (testy < verty[j])) ||


             ((verty[j] <= testy) && (testy < verty[i]))) &&


            (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))

            c = !c;

    }

    return c;

}

'''


查看完整回答
反對(duì) 回復(fù) 2023-09-16
  • 1 回答
  • 0 關(guān)注
  • 126 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)