重心插值算法(三角形像素插值算法)

重心插值算法

    /// <summary>
    /// 获取三角形内某点的颜色
    /// </summary>
    /// <param name="triangles">三角形顶点位置列表</param>
    /// <param name="trianglesColor">三角形顶点颜色列表</param>
    /// <param name="pointPosition">三角形内某位置</param>
    /// <returns></returns>
    public Color GetTriangleBarycenterColor(Vector3[] triangles, Color[] trianglesColor, Vector3 pointPosition)
    {
        var A = triangles[0];
        var B = triangles[1];
        var C = triangles[2];

        float a = (-(pointPosition.x - B.x) * (C.y - B.y) + (pointPosition.y - B.y) * (C.x - B.x)) / (-(A.x - B.x) * (C.y - B.y) + (A.y - B.y) * (C.x - B.x));
        float b = (-(pointPosition.x - C.x) * (A.y - C.y) + (pointPosition.y - C.y) * (A.x - C.x)) / (-(B.x - C.x) * (A.x - C.y) + (B.y - C.y) * (A.x - C.x));
        float c = 1 - a - b;

        //Debug.LogError($"a : {a}  b :{b}  c:{c}");

        Color colorA = trianglesColor[0];
        Color colorB = trianglesColor[1];
        Color colorC = trianglesColor[2];
        return colorA * a + colorB * b + colorC * c;
    }

    /// <summary>
    /// 顶点是否位于三角形内
    /// </summary>
    /// <param name="point">顶点位置</param>
    /// <param name="triangles">三角形顶点</param>
    /// <returns></returns>
    private bool IsPointInTriangle(Vector3 point, Vector3[] triangles)
    {
        var A = triangles[0];
        var B = triangles[1];
        var C = triangles[2];
        var v0 = C - A;
        var v1 = B - A;
        var v2 = point - A;

        float dot00 = Vector3.Dot(v0, v0);
        float dot01 = Vector3.Dot(v0, v1);
        float dot02 = Vector3.Dot(v0, v2);
        float dot11 = Vector3.Dot(v1, v1);
        float dot12 = Vector3.Dot(v1, v2);

        float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01);

        float u = (dot11 * dot02 - dot01 * dot12) * inverDeno;
        if (u < 0 || u > 1) // if u out of range, return directly
        {
            return false;
        }

        float v = (dot00 * dot12 - dot01 * dot02) * inverDeno;
        if (v < 0 || v > 1) // if v out of range, return directly
        {
            return false;
        }

        return u + v <= 1;
    }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容