tePolyline.TextureTilingMethod = TilingMethodCode.TM_METERS_PER_TILE;
tePolyline.TextureScaleX = douRoadWidth;
tePolyline.TextureScaleY = douRoadWidth;
tePolyline.TextureRotateAngle = 90;
tePolyline.FgAlpha = 0.0;
}
}
recs.MoveNext();
}
}
/// <summary>
/// 获取多边形的顶点坐标数组 这个函数用来根据道路中心线的坐标串和道路宽度两个参数生成多边形节点坐标数组。
/// </summary>
private object[] GetPolygonPoints(Points ptsTemp,double douRoadWith)
{
double Alpha, douLength, dYaw;
object dXL, dYL, dHL, dXR, dYR, dHR;
object oYaw, oPich, oYaw1, oYaw2, oPich1, oPich2, oYawTemp;
ESRI.MapObjects2.Core.Point ptS,ptE;
object[] ptsPolygon=new object[ptsTemp.Count*6];
for (int i = 0; i < ptsTemp.Count; i++)
{
Alpha=0;
if (i == 0)
{
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i + 1);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw, out oPich);
dYaw = (double)oYaw;
}
else
{
if (i == ptsTemp.Count - 1)
{
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i-1);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw, out oPich);
dYaw = (double)oYaw;
}
else
{
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i - 1);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw1, out oPich1);
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i+1);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw2, out oPich2);
dYaw = Math.Abs((double)oYaw1 - (double)oYaw2);
Alpha = dYaw / 2;
if (dYaw > 180) Alpha = 180 - Alpha;
if (dYaw > 180)
{
dYaw = ((double)oYaw1 + (double)oYaw2) / 2 - 180;
}
else
{
dYaw = ((double)oYaw1 + (double)oYaw2) / 2;
}
}
}
douLength = douRoadWith / Math.Cos(Alpha*Math.PI/180);
if (douLength > douRoadWith * 6)
{
douLength = douRoadWith * 6;
}
dXL=dXR=(object)ptsTemp.Item(i).X;
dYL=dYR=(object)ptsTemp.Item(i).Y;
dHL=dHR=0;
oYawTemp = (object)(dYaw - 90);
clsTE.CoordSys.MoveCoordEx(ref dXL, ref dYL, ref dHL, ref oYawTemp, 0, 0, douLength, 0, 0);
dHL = (object)clsTE.Terrain.GetGroundHeight((double)dXL, (double)dYL, AccuracyLevel.ACCURACY_BEST_FROM_MPT);
oYawTemp = (object)(dYaw + 90);
clsTE.CoordSys.MoveCoordEx(ref dXR, ref dYR, ref dHR, ref oYawTemp, 0, 0, douLength, 0, 0);
dHR = (object)clsTE.Terrain.GetGroundHeight((double)dXR, (double)dYR, AccuracyLevel.ACCURACY_BEST_FROM_MPT);
ptsPolygon[i * 3] = dXL;
ptsPolygon[i * 3 + 1] = dHL;
ptsPolygon[i * 3 + 2] = dYL;
ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3] = dXR;
ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3 + 1] = dHR;
ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3 + 2] = dYR;
}
return ptsPolygon;
}
tePolyline.TextureScaleX = douRoadWidth;
tePolyline.TextureScaleY = douRoadWidth;
tePolyline.TextureRotateAngle = 90;
tePolyline.FgAlpha = 0.0;
}
}
recs.MoveNext();
}
}
/// <summary>
/// 获取多边形的顶点坐标数组 这个函数用来根据道路中心线的坐标串和道路宽度两个参数生成多边形节点坐标数组。
/// </summary>
private object[] GetPolygonPoints(Points ptsTemp,double douRoadWith)
{
double Alpha, douLength, dYaw;
object dXL, dYL, dHL, dXR, dYR, dHR;
object oYaw, oPich, oYaw1, oYaw2, oPich1, oPich2, oYawTemp;
ESRI.MapObjects2.Core.Point ptS,ptE;
object[] ptsPolygon=new object[ptsTemp.Count*6];
for (int i = 0; i < ptsTemp.Count; i++)
{
Alpha=0;
if (i == 0)
{
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i + 1);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw, out oPich);
dYaw = (double)oYaw;
}
else
{
if (i == ptsTemp.Count - 1)
{
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i-1);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw, out oPich);
dYaw = (double)oYaw;
}
else
{
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i - 1);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw1, out oPich1);
ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i+1);
clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw2, out oPich2);
dYaw = Math.Abs((double)oYaw1 - (double)oYaw2);
Alpha = dYaw / 2;
if (dYaw > 180) Alpha = 180 - Alpha;
if (dYaw > 180)
{
dYaw = ((double)oYaw1 + (double)oYaw2) / 2 - 180;
}
else
{
dYaw = ((double)oYaw1 + (double)oYaw2) / 2;
}
}
}
douLength = douRoadWith / Math.Cos(Alpha*Math.PI/180);
if (douLength > douRoadWith * 6)
{
douLength = douRoadWith * 6;
}
dXL=dXR=(object)ptsTemp.Item(i).X;
dYL=dYR=(object)ptsTemp.Item(i).Y;
dHL=dHR=0;
oYawTemp = (object)(dYaw - 90);
clsTE.CoordSys.MoveCoordEx(ref dXL, ref dYL, ref dHL, ref oYawTemp, 0, 0, douLength, 0, 0);
dHL = (object)clsTE.Terrain.GetGroundHeight((double)dXL, (double)dYL, AccuracyLevel.ACCURACY_BEST_FROM_MPT);
oYawTemp = (object)(dYaw + 90);
clsTE.CoordSys.MoveCoordEx(ref dXR, ref dYR, ref dHR, ref oYawTemp, 0, 0, douLength, 0, 0);
dHR = (object)clsTE.Terrain.GetGroundHeight((double)dXR, (double)dYR, AccuracyLevel.ACCURACY_BEST_FROM_MPT);
ptsPolygon[i * 3] = dXL;
ptsPolygon[i * 3 + 1] = dHL;
ptsPolygon[i * 3 + 2] = dYL;
ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3] = dXR;
ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3 + 1] = dHR;
ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3 + 2] = dYR;
}
return ptsPolygon;
}