工作中遇到,将一条线段,按照一定距离等分,参照了http://blog.csdn.net/startwithdp/article/details/7360750
现在将c#代码贴出:
/// <summary>
/// 折线等分
/// </summary>
/// <param name="list">折线点集合</param>
/// <param name="dis">等分距离</param>
/// <returns></returns>
public static List<Point3d> CaculatePointList(List<Point3d> list, double dis)
{
List<Point3d> listPoints = new List<Point3d>();
Point3d tempPos = new Point3d();
try
{
double cur_span = dis;
for (int i = 0; i < list.Count - 1; i++)
{
if (i == 0)
{
listPoints.Add(list[i]);
tempPos = list[i];
}
else
{
while(true)
{
bool isBreak = false;
Vector3 lastPos = EarthView.World.Spatial3D.Utility.SpatialCalculator.SphericalToCartesian(tempPos.Y, tempPos.X, tempPos.Z + EarthView.World.Spatial.Math.Math.EARTH_RADIUS);
Vector3 v1 = EarthView.World.Spatial3D.Utility.SpatialCalculator.SphericalToCartesian(list[i].Y, list[i].X, list[i].Z + EarthView.World.Spatial.Math.Math.EARTH_RADIUS);
double cur_distance = (lastPos - v1).Length();
if ((cur_distance-cur_span)>0.0001)
{
double x = (v1.X - lastPos.X) * cur_span / cur_distance + lastPos.X;
double y = (v1.Y - lastPos.Y) * cur_span / cur_distance + lastPos.Y;
double z = (v1.Z - lastPos.Z) * cur_span / cur_distance + lastPos.Z;
Vector3 pos = new Vector3(x, y, z);
Vector3 geoPos = EarthView.UPGIS.RenderLib.Tools.GISTool.ComputeGeoFromWorld(pos);
listPoints.Add(new Point3d(geoPos.X, geoPos.Y, geoPos.Z));
tempPos = listPoints[listPoints.Count - 1];
cur_span = dis;
isBreak = false;
pos.Dispose(true);
pos = null;
geoPos.Dispose(true);
geoPos = null;
}
else
{
tempPos = list[i];
cur_span = cur_span - cur_distance;
isBreak = true;
}
lastPos.Dispose(true);
lastPos = null;
v1.Dispose(true);
v1 = null;
if (isBreak)
break;
}
}
}
}
catch (System.Exception ex)
{
}
return listPoints;
}