您的位置:首页 > 编程语言 > C#

SkylineGlobe 6.5 如何实现简单多边形的动态绘制 C#示例代码

2015-04-14 11:29 936 查看
在Skyline的TEPro软件中,我们可以很容易地绘制出多边形。



那么,在二次开发过程中,该如何绘制一个简单的多边形呢?

通过下面的示例代码,我们可以很容易完成这一项工作。

其中,重点需要了解Geometry对象的定义和使用。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TerraExplorerX;

namespace HelloSkyline
{
public partial class CTerrainPolygon: Form
{
SGWorld65 sgworld = null;
String pbhander = "";
ITerrainPolygon65 pITPolygon = null;
List<double> ListVerticsArray = new List<double>();

public CTerrainPolygon()
{
InitializeComponent();

sgworld = new SGWorld65();
sgworld.OnLButtonDown += new _ISGWorld65Events_OnLButtonDownEventHandler(sgworld_OnLButtonDown);
sgworld.OnRButtonDown += new _ISGWorld65Events_OnRButtonDownEventHandler(sgworld_OnRButtonDown);
}

bool sgworld_OnRButtonDown(int Flags, int X, int Y)
{
sgworld.Window.SetInputMode(MouseInputMode.MI_FREE_FLIGHT);
pbhander = "";
pITPolygon = null;
return true;
}

bool sgworld_OnLButtonDown(int Flags, int X, int Y)
{
IWorldPointInfo65 pIWPInfo = sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_TERRAIN);
IPosition65 pIPosition = sgworld.Navigate.GetPosition(AltitudeTypeCode.ATC_ON_TERRAIN);

if (pbhander == "TerrainPolygon")
{
if (pITPolygon == null)
{
ILinearRing cRing = null;
double[] cVerticesArray = null;
cVerticesArray = new double[] {
pIPosition.X,  pIPosition.Y,  0,
pIWPInfo.Position.X,  pIWPInfo.Position.Y,  pIWPInfo.Position.Distance,
pIWPInfo.Position.X,  pIWPInfo.Position.Y,  pIWPInfo.Position.Distance,
};
cRing = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(cVerticesArray);

uint nLineColor = 0xFF00FF00;
uint nFillColor = 0x7FFF0000;
AltitudeTypeCode eAltitudeTypeCode = AltitudeTypeCode.ATC_ON_TERRAIN;
string gid = CreateGroup("AnalysisTEMP");
pITPolygon = sgworld.Creator.CreatePolygon(cRing, nLineColor, nFillColor, eAltitudeTypeCode, gid, "Polygon");

IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
polygonGeometry.StartEdit();
foreach (ILinearRing ring in polygonGeometry.Rings)
{
double dx = pIWPInfo.Position.X;
double dy = pIWPInfo.Position.Y;
double dh = pIWPInfo.Position.Distance;
ring.Points.AddPoint(dx, dy, dh);
ring.Points.DeletePoint(0);
}
IGeometry editedGeometry = polygonGeometry.EndEdit();
pITPolygon.Geometry = editedGeometry;
}
else
{
IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
polygonGeometry.StartEdit();
foreach (ILinearRing ring in polygonGeometry.Rings)
{
double dx = pIWPInfo.Position.X;
double dy = pIWPInfo.Position.Y;
double dh = pIWPInfo.Position.Distance;
ring.Points.AddPoint(dx, dy, dh);
}
IGeometry editedGeometry = polygonGeometry.EndEdit();
pITPolygon.Geometry = editedGeometry;
}
}
return false;
}

private void button1_Click(object sender, EventArgs e)
{
pbhander = "TerrainPolygon";
sgworld.Window.SetInputMode(MouseInputMode.MI_COM_CLIENT);
}

private void button2_Click(object sender, EventArgs e)
{
string gid = sgworld.ProjectTree.FindItem("AnalysisTEMP");
if (gid != null && gid != "")
{
sgworld.ProjectTree.DeleteItem(gid);
}
}

private String CreateGroup(String GroupName)
{
string gid = sgworld.ProjectTree.FindItem(GroupName);
if (gid != null && gid != "")
{
return gid;
}
else
{
return sgworld.ProjectTree.CreateLockedGroup(GroupName);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: