原帖由
liuxingfeiye 于 2013-9-28 20:25:32 发表
网优工作这两年多来(通信三年),感觉有个工具软件太方便了,最近又卸载了那坑爹的LOL后没事干,刚好最近想玩下mapinfo插件,想起好像有个很火的seeSite,记得用过一次,唯一有印象的就是扇区能自动合理大小, ...
第二次看帖了,咱们可以研究下 mapxtreme的;
既然你使用mapxtreme,也想比较绘制扇区的算法,我这里再给你提供一个mapxtreme的绘制扇区的函数虽然是C# 的,很容易就能改为 java 了。你试试,比较下速度怎么样?
代码直接上了。 现成的 C#函数不需要改任何地方
帖代码前再PS一个: 有空研究下“泰森多边形” 这个玩意,非常好玩;
以下为代码,别闲少。
/// <summary>
/// 创建扇形
/// </summary>
/// <param name="coordSys">坐标系</param>
/// <param name="pt">中心点</param>
/// <param name="radius">半径</param>
/// <param name="startAngle">起始角</param>
/// <param name="endAngle">终止角</param>
/// <returns></returns>
public static FeatureGeometry CreateSector(CoordSys coordSys, DPoint pt, double radius, int startAngle, int endAngle)
{
FeatureGeometry ftr;
if (startAngle == 0 && endAngle == 360)
//经纬度坐标系,所以Spherical
ftr = new MapInfo.Geometry.Ellipse(coordSys, pt, radius * 0.75, radius * 0.75, DistanceUnit.Meter,DistanceType.Spherical);
else
{
int a2 = AngleConvertN2E(startAngle);
int a1 = AngleConvertN2E(endAngle);
//因为LegacyArc是逆时针坐标轴,所以转换后起始位置交换
var arc = new MapInfo.Geometry.LegacyArc(coordSys, pt, radius, radius, DistanceUnit.Meter,
DistanceType.Spherical, a1, a2);
var mc = arc.CreateMultiCurve(100);
var arcPts = mc[0][0].SamplePoints();
var linePts = new[] { mc[0].EndPoint, pt, mc[0].StartPoint };
var pts = new MapInfo.Geometry.DPoint[arcPts.Length - 1 + 3];
for (int i = 0, j = 0; i < arcPts.Length - 1 + 3; i++)
{
if (i < arcPts.Length - 1)
pts
= arcPts;
else
pts = linePts[j++];
}
ftr = new MultiPolygon(coordSys, CurveSegmentType.Linear, pts);
}
return ftr;
}
[
本帖最后由 life_is_sweet 于 2013-12-10 23:27 编辑 ]