在工作的时候,遇到一个简单的应用,要求实现在地图上的一个视频联动效果,由于坐标之间的距离大小不一,所以地图上的小车跑得不是很流畅,所以简单写了一个细分坐标的类。如下:
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();
}
}
测试的效果,四个点的点集被分成了更加详细的点集: