美文网首页
重心插值算法(三角形像素插值算法)

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

作者: Jaymz_2b11 | 来源:发表于2022-12-04 15:57 被阅读0次

重心插值算法

    /// <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;
    }

相关文章

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

    重心插值算法

  • 重心插值算法

    如果你是一个女程序员,那么你一定要自信,因为你本来就很美,如果有人不同意,那你就嫁给他! 最近我们收到了一个非常典...

  • Unity Texture缩放 合成 解压

    图片缩放 图像放大有许多算法,关键在于对未知像素使用何种插值算法。 最邻近插值算法原理图:image.png 选取...

  • 图像处理中的插值

    thiele插值算法 1点插值算法 function [C,c]=thiele(X,Y,Z)%X为插值点横坐标,Y...

  • 视觉笔试刷题_1_索贝公司_2019-08-10

    填空题 常用的插值算法:双线性插值、立方卷积插值、最近邻插值 常用的边缘检测算子:canny、sobel、Robe...

  • 【图像缩放算法】双立方(三次)插值

    当我们进行图像缩放的时候,我们就需要用到插值算法。常见的插值有: 最邻近插值 双线性插值 双立方(三次)插值在这三...

  • 014 图像插值(Image Interpolation)

    最常见四种插值算法INTER_NEAREST = 0 # 最近邻插值INTER_LINEAR = 1 # 双线性插...

  • 反距离权重IDW算法解析与示例

    在GIS和图像处理中插值算法很常用,散点状的数据面状化。常用的插值方法包括:反距离权重插值法(IDW)、克里金插值...

  • 图片放大算法

    一、 图像放大算法 图像放大有许多算法,其关键在于对未知像素使用何种插值方式。以下我们将具体分析几种常见的算法,然...

  • 28. 图像缩放

    插值方法 四种插值,最近邻域插值 双线性插值 像素关系重采样 立方插值其中最近邻域插值、双线性插值原理如下: 1)...

网友评论

      本文标题:重心插值算法(三角形像素插值算法)

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