当前位置: 移动技术网 > IT编程>开发语言>.net > C# Unity计算不规则多边形中心点、重心点、点位最小值

C# Unity计算不规则多边形中心点、重心点、点位最小值

2020年07月28日  | 移动技术网IT编程  | 我要评论

重心点计算适用于凹多边形
上代码了

using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 获取中心点、重心点、最大最小值
/// </summary>
public class GetCenterPointFunction
{
    /// <summary>
    /// 获取不规则多边形几何中心点
    /// </summary>
    /// <param name="mPoints"></param>
    /// <returns></returns>
    public static Vector2 GetCenterPoint(List<Vector2> mPoints)
    {
        float cx = (GetMinX(mPoints) + GetMaxX(mPoints)) / 2;
        float cy = (GetMinY(mPoints) + GetMaxY(mPoints)) / 2;
        return new Vector2(cx, cy);
    }
    /// <summary>
    /// 获取最小X值
    /// </summary>
    /// <param name="mPoints"></param>
    /// <returns></returns>
    public static float GetMinX(List<Vector2> mPoints)
    {
        float minX = 0;
        if (mPoints.Count > 0)
        {
            minX = mPoints[0].x;
            foreach (Vector2 point in mPoints)
            {
                if (point.x < minX)
                    minX = point.x;
            }
        }
        return minX;
    }
    /// <summary>
    /// 获取最大X值
    /// </summary>
    /// <param name="mPoints"></param>
    /// <returns></returns>
    public static float GetMaxX(List<Vector2> mPoints)
    {
        float maxX = 0;
        if (mPoints.Count > 0)
        {
            maxX = mPoints[0].x;
            foreach (Vector2 point in mPoints)
            {
                if (point.x > maxX)
                    maxX = point.x;
            }
        }
        return maxX;
    }
    /// <summary>
    /// 获取最小Y值
    /// </summary>
    /// <param name="mPoints"></param>
    /// <returns></returns>
    public static float GetMinY(List<Vector2> mPoints)
    {
        float minY = 0;
        if (mPoints.Count > 0)
        {
            minY = mPoints[0].y;
            foreach (Vector2 point in mPoints)
            {
                if (point.y < minY)
                    minY = point.y;
            }
        }
        return minY;
    }
    /// <summary>
    /// 获取最大Y值
    /// </summary>
    /// <param name="mPoints"></param>
    /// <returns></returns>
    public static float GetMaxY(List<Vector2> mPoints)
    {
        float maxY = 0;
        if (mPoints.Count > 0)
        {
            maxY = mPoints[0].y;
            foreach (Vector2 point in mPoints)
            {
                if (point.y > maxY)
                    maxY = point.y;
            }
        }
        return maxY;
    }


    /// <summary>
    /// 获取不规则多边形重心点
    /// </summary>
    /// <param name="mPoints"></param>
    /// <returns></returns>
    public static Vector2 GetCenterOfGravityPoint(List<Vector2> mPoints)
    {
        float area = 0.0f;//多边形面积
        float gx = 0.0f, gy = 0.0f;// 重心的x、y
        for (int i = 1; i <= mPoints.Count; i++)
        {
            float iX = mPoints[i % mPoints.Count].x;
            float iY = mPoints[i % mPoints.Count].y;
            float nextX = mPoints[i - 1].x;
            float nextY = mPoints[i - 1].y;
            float temp = (iX * nextY - iY * nextX) / 2.0f;
            area += temp;
            gx += temp * (iX + nextX) / 3.0f;
            gy += temp * (iY + nextY) / 3.0f;
        }
        gx = gx / area;
        gy = gy / area;
        Vector2 v2 = new Vector2(gx, gy);
        return v2;
    }
}

本文地址:https://blog.csdn.net/gheartsea/article/details/107617653

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网