POST
|
Thanks Brian!! Wonderful idea of using the supplementary angle. I love it. I did a few tests and it run faster than mine. 😄 Here're the codes in C#, just in case someone needs them: -------- using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Carto; -------- creating a fan in c# double radius = 400; double fanOrientation = 0; double degreesOpen = 60; //point origin //para e: ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent IPoint ptOrigin = new PointClass(); ptOrigin.PutCoords(e.mapX, e.mapY); //first and second point along the circle IPoint pt1 = new PointClass(); double az = 90 - (fanOrientation - (degreesOpen / 2)); pt1.X = radius * Math.Cos(az * Math.PI / 180.0F) + e.mapX; pt1.Y = radius * Math.Sin(az * Math.PI / 180.0F) + e.mapY; IPoint pt2 = new PointClass(); az = 90 - (fanOrientation + (degreesOpen / 2)); pt2.X = radius * Math.Cos(az * Math.PI / 180.0F) + e.mapX; pt2.Y = radius * Math.Sin(az * Math.PI / 180.0F) + e.mapY; //first and second straight leg IPolyline pPolyline1 = new PolylineClass(); pPolyline1.FromPoint = ptOrigin; pPolyline1.ToPoint = pt1; pPolyline1.SimplifyNetwork(); IPolyline pPolyline2 = new PolylineClass(); pPolyline2.FromPoint = ptOrigin; pPolyline2.ToPoint = pt2; pPolyline2.SimplifyNetwork(); //circular arc & QI/densify ICircularArc pCirArc = new CircularArcClass(); pCirArc.PutCoords(ptOrigin, pt1, pt2, esriArcOrientation.esriArcClockwise); object missing = Type.Missing; ISegmentCollection path1 = new PathClass(); path1.AddSegment(pCirArc as ISegment, ref missing, ref missing); IPolyline pSegPoly = new PolylineClass(); IGeometryCollection pGeoColl = pSegPoly as IGeometryCollection; pGeoColl.AddGeometry(path1 as IGeometry, ref missing, ref missing); IPolyline pPolyline3 = pGeoColl as IPolyline; pPolyline3.Densify(-1, 0); pPolyline3.SimplifyNetwork(); //union 3 legs ITopologicalOperator pTemgPolyline = pPolyline1 as ITopologicalOperator; pTemgPolyline = pTemgPolyline.Union(pPolyline2) as ITopologicalOperator; pTemgPolyline = pTemgPolyline.Union(pPolyline3) as ITopologicalOperator; //create polygon IPointCollection pPolygonPointColl; IPolygon pPolygon = new PolygonClass(); pPolygonPointColl = new PolygonClass(); pPolygonPointColl.AddPointCollection(pTemgPolyline as IPointCollection); pPolygon = pPolygonPointColl as IPolygon; pPolygon.Close(); //drawing test ISimpleFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = getRGB(200, 255, 200); //method getRGB(int r, int g, int b) pFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid; object o = pFillSymbol as object; axMapControl1.DrawShape(pPolygon, ref o); -------- private IColor getRGB(int r, int g, int b) { IRgbColor rgbcolor = new RgbColorClass(); rgbcolor.Red = r; rgbcolor.Green = g; rgbcolor.Blue = b; IColor color = rgbcolor as IColor; return color; }
... View more
02-11-2011
11:11 PM
|
0
|
0
|
298
|
POST
|
I want to create a fan-shaped buffer using a point with a given orientation and a radius r, just like this: I've come up with an idea already, but it's quite complicate and I'm wondering if there are any better ways to do it. My idea is to do the following steps: 1. use point p and radius r to generate a circle buffer. (I drew r wrong in the fig. it should be the radius of the circle. poor drawing. I know..) 2. draw a triangle of which the vertex is p and the perpendicular is pointing in my desired direction. 3. do an intersect operation between the circle and the triangle. The problem is that I really don't have a clue about how to generate the triangle I want. How should make the angle P = 2?? ? Really appreciated if some one could help me with this with some demo codes in C++/C#.:D
... View more
02-07-2011
11:13 PM
|
0
|
2
|
1139
|
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:23 AM
|