分解点集

    在工作的时候,遇到一个简单的应用,要求实现在地图上的一个视频联动效果,由于坐标之间的距离大小不一,所以地图上的小车跑得不是很流畅,所以简单写了一个细分坐标的类。如下:

public class CoordinateSeperate
    {
        /// <summary>
        /// 求两个坐标点之间的距离,只用于XY坐标
        /// </summary>
        protected double GetDistance(ICoordinate point1, ICoordinate point2)
        {
            if (point1 == null || point2 == null)
                return 0;

            double distance = 0;
            double sumSquare = (point1.X - point2.X) * (point1.X - point2.X) + (point1.Y - point2.Y) * (point1.Y - point2.Y);
            distance = Math.Sqrt(sumSquare);
            return distance;
        }

 

        /// <summary>
        /// 检查两个点之间的距离是不是合理
        /// </summary>
        protected bool IsDistanceValid(ICoordinate point1, ICoordinate point2, double maxDistance)
        {
            if (point1 == null || point2 == null || maxDistance == 0)
                return false;

            double currentDistance = GetDistance(point1, point2);
            if (currentDistance <= maxDistance)
                return true;
            else
                return false;
        }

 

        /// <summary>
        /// 获取中点
        /// </summary>
        protected ICoordinate GetMidPoint(ICoordinate point1, ICoordinate point2)
        {
            if (point1 == null || point2 == null)
                return null;

            ICoordinate newCoordinate = new Coordinate();
            newCoordinate.X = (point1.X > point2.X) ? (point2.X + (point1.X - point2.X) / 2) : (point1.X + (point2.X - point1.X) / 2);
            newCoordinate.Y = (point1.Y > point2.Y) ? (point2.Y + (point1.Y - point2.Y) / 2) : (point1.Y + (point2.Y - point1.Y) / 2);

            return newCoordinate;
        }

 

        /// <summary>
        /// 将坐标list进行分解
        /// </summary>
        public void SeperateCoordinates(List<ICoordinate> coordList,double distance)
        {
            if (coordList == null || coordList.Count == 0 || distance == 0)
                return;

            int startNum = 0;
            int endNum = 1;
            ICoordinate startCoord, endCoord,midCoord;

            for (int i = 0; i < coordList.Count; i++)
            {
                startNum = i;
                endNum = i + 1;

                if (endNum >= coordList.Count)
                    break;

                startCoord = coordList[startNum];
                endCoord = coordList[endNum];

                if (!IsDistanceValid(startCoord, endCoord, distance))
                {
                    midCoord = GetMidPoint(startCoord, endCoord);
                    coordList.Insert(endNum, midCoord);

                    //本来这种细分坐标的问题,要用递归来实现的,但是后来测试发现,

                    //就这么一个自减不仅实现了效果,而且循环的次数还更少。
                    i--;
                }
            }
        }
    }

测试程序:

class Program
    {
        static void Main(string[] args)
        {
            List<ICoordinate> coordlist = new List<ICoordinate>();
            ICoordinate coord1 = new Coordinate(0, 0);
            ICoordinate coord2 = new Coordinate(10, 10);
            ICoordinate coord3 = new Coordinate(20, 20);
            ICoordinate coord4 = new Coordinate(30, 40);
            coordlist.Add(coord1);
            coordlist.Add(coord2);
            coordlist.Add(coord3);
            coordlist.Add(coord4);

            CoordinateSeperate coordSep = new CoordinateSeperate();
            coordSep.SeperateCoordinates(coordlist, 2);

            for (int i = 0; i < coordlist.Count; i++)
            {
                Console.Write("X:" + coordlist[i].X + " Y:" + coordlist[i].Y);
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }

测试的效果,四个点的点集被分成了更加详细的点集:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值