ArcGIS Pro SDK (九)几何 10 弧
文章目录
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 构造圆弧 - 使用内部点
// 从 (2, 1) 到 (1, 2) 构造圆弧,内部点为 (1 + sqrt(2)/2, 1 + sqrt(2)/2)。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
MapPoint fromPt = MapPointBuilderEx.CreateMapPoint(2, 1);
MapPoint toPt = MapPointBuilderEx.CreateMapPoint(1, 2);
Coordinate2D interiorPt = new Coordinate2D(1 + Math.Sqrt(2) / 2, 1 + Math.Sqrt(2) / 2);
// BuilderEx 的便捷方法不需要在 MCT 上运行。
EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateCircularArc(fromPt, toPt, interiorPt);
// BuilderEx 的构造函数不需要在 MCT 上运行。
EllipticArcBuilderEx eab = new EllipticArcBuilderEx(fromPt, toPt, interiorPt);
// 使用生成器执行操作
EllipticArcSegment anotherCircularArc = eab.ToSegment();
2 构造圆弧 - 使用弦长度和方位
// Construct a circular arc counterclockwise from (2, 1) to (1, 2) such that the embedded
// circle has center point at (1, 1) and radius = 1.
// Use a builderEx convenience method or use a builderEx constructor.
MapPoint fromPt = MapPointBuilderEx.CreateMapPoint(2, 1, SpatialReferences.WGS84);
double chordLength = Math.Sqrt(2);
double chordBearing = 3 * Math.PI / 4;
double radius = 1;
ArcOrientation orientation = ArcOrientation.ArcCounterClockwise;
MinorOrMajor minorOrMajor = MinorOrMajor.Minor;
// BuildeExr convenience methods don't need to run on the MCT.
EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateCircularArc(fromPt, chordLength, chordBearing, radius, orientation, minorOrMajor);
// BuilderEx constructors need to run on the MCT.
EllipticArcBuilderEx cab = new EllipticArcBuilderEx(fromPt, chordLength, chordBearing, radius, orientation, minorOrMajor);
// do something with the builder
EllipticArcSegment anotherCircularArc = cab.ToSegment();
3 构建圆弧 - 使用中心点、角度和半径
// 构造一个圆弧,中心点在 (0, 0),起始角度为 0,中心角为 pi/2,半径为 1。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
SpatialReference sr4326 = SpatialReferences.WGS84;
Coordinate2D centerPt = new Coordinate2D(0, 0);
double fromAngle = 0;
double centralAngle = Math.PI / 2;
double radius = 1;
// BuilderEx 的便捷方法不需要在 MCT 上运行。
EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateCircularArc(fromAngle, centralAngle, centerPt, radius, sr4326);
// BuilderEx 的构造函数不需要在 MCT 上运行。
EllipticArcBuilderEx cab = new EllipticArcBuilderEx(fromAngle, centralAngle, centerPt, radius, sr4326);
EllipticArcSegment otherCircularArc = cab.ToSegment();
4 构造椭圆弧 - 使用中心点和旋转角度
// 构造一个中心在 (1, 1) 的椭圆弧,起始角度为 0,中心角为 PI/2,旋转角为 0,半长轴为 1,短长轴比为 0.5。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
Coordinate2D centerPt = new Coordinate2D(1, 1);
// BuilderEx 的便捷方法不需要在 MCT 上运行。
EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateEllipticArcSegment(centerPt, 0, Math.PI / 2, 0, 1, 0.5);
double semiMajor;
double semiMinor;
circularArc.GetAxes(out semiMajor, out semiMinor);
// semiMajor = 1, semiMinor = 0.5
// BuilderEx 的构造函数不需要在 MCT 上运行。
EllipticArcBuilderEx cab = new EllipticArcBuilderEx(centerPt, 0, Math.PI / 2, 0, 1, 0.5);
cab.GetAxes(out semiMajor, out semiMinor);
EllipticArcSegment otherCircularArc = cab.ToSegment();
5 构造圆弧 - 使用中心点和方向
// 从 (2, 1) 到 (1, 2) 构造一个圆弧,中心点在 (1, 1),方向为逆时针。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
MapPoint toPt = MapPointBuilderEx.CreateMapPoint(1, 2);
MapPoint fromPt = MapPointBuilderEx.CreateMapPoint(2, 1);
Coordinate2D centerPtCoord = new Coordinate2D(1, 1);
// BuilderEx 的便捷方法不需要在 MCT 上运行。
EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateCircularArc(fromPt, toPt, centerPtCoord, ArcOrientation.ArcCounterClockwise);
// BuilderEx 的构造函数需要在 MCT 上运行。
EllipticArcBuilderEx cab = new EllipticArcBuilderEx(fromPt, toPt, centerPtCoord, ArcOrientation.ArcCounterClockwise);
EllipticArcSegment otherCircularArc = cab.ToSegment();
6 构造圆弧 - 使用两个线段和半径
// 从 (100, 100) 到 (50, 50) 构造一条线段,另一条线段从 (100, 100) 到 (150, 50)。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
LineSegment segment1 = LineBuilderEx.CreateLineSegment(new Coordinate2D(100, 100), new Coordinate2D(50, 50));
LineSegment segment2 = LineBuilderEx.CreateLineSegment(new Coordinate2D(100, 100), new Coordinate2D(150, 50));
// 构造提示点以确定圆弧将在哪里构造。
Coordinate2D hintPoint = new Coordinate2D(100, 75);
// 调用 QueryFilletRadius 以获取可与这些线段一起使用的最小和最大半径。
var minMaxRadii = EllipticArcBuilderEx.QueryFilletRadiusRange(segment1, segment2, hintPoint);
// 使用最大半径创建圆弧。
double maxRadius = minMaxRadii.Item2;
// BuilderEx 的便捷方法不需要在 MCT 上运行。
// 在 2.x 版本中 - EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateEllipticArcSegment(segment1, segment2, maxRadius, hintPoint);
EllipticArcSegment circularArc = EllipticArcBuilderEx.CreateCircularArc(
segment1, segment2, maxRadius, hintPoint);
// BuilderEx 的构造函数需要在 MCT 上运行。
EllipticArcBuilderEx cab = new EllipticArcBuilderEx(segment1, segment2, maxRadius, hintPoint);
EllipticArcSegment otherCircularArc = cab.ToSegment();
7 构造圆
// 构造一个圆,中心在 (-1,-1),半径为 2,方向为顺时针。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
Coordinate2D centerPtCoord = new Coordinate2D(-1, -1);
// Builder 便捷方法不需要在 MCT 上运行。
EllipticArcSegment circle = EllipticArcBuilderEx.CreateCircle(centerPtCoord, 2, ArcOrientation.ArcClockwise);
// circle.IsCircular = true
// circle.IsCounterClockwise = false
// circle.IsMinor = false
double startAngle, rotationAngle, centralAngle, semiMajor, semiMinor;
Coordinate2D actualCenterPt;
circle.QueryCoords(out actualCenterPt, out startAngle, out centralAngle, out rotationAngle, out semiMajor, out semiMinor);
// semiMajor = 2.0
// semiMinor = 2.0
// startAngle = PI/2
// centralAngle = -2*PI
// rotationAngle = 0
// endAngle = PI/2
// BuilderEx 的构造函数需要在 MCT 上运行。
EllipticArcBuilderEx builder = new EllipticArcBuilderEx(centerPtCoord, 2, ArcOrientation.ArcClockwise);
EllipticArcSegment otherCircle = builder.ToSegment();
8 构造椭圆
// 构造一个中心在 (1, 2) 的椭圆,旋转角为 -pi/6,半长轴为 5,短长轴比为 0.2,方向为顺时针。
// 使用 builderEx 的便捷方法或使用 builderEx 构造函数。
Coordinate2D centerPt = new Coordinate2D(1, 2);
// BuilderEx 的便捷方法不需要在 MCT 上运行。
EllipticArcSegment ellipse = EllipticArcBuilderEx.CreateEllipse(centerPt, -1 * Math.PI / 6, 5, 0.2, ArcOrientation.ArcClockwise);
// BuilderEx 的构造函数需要在 MCT 上运行。
EllipticArcBuilderEx builder = new EllipticArcBuilderEx(centerPt, -1 * Math.PI / 6, 5, 0.2, ArcOrientation.ArcClockwise);
EllipticArcSegment anotherEllipse = builder.ToSegment();
9 椭圆构建器属性
// 获取曲线的属性
EllipticArcBuilderEx builder = new EllipticArcBuilderEx(arcSegment);
MapPoint startPt = builder.StartPoint;
MapPoint endPt = builder.EndPoint;
Coordinate2D centerPt = builder.CenterPoint;
bool isCircular = builder.IsCircular;
bool isMinor = builder.IsMinor;
double startAngle = builder.StartAngle;
double endAngle = builder.EndAngle;
double centralAngle = builder.CentralAngle;
double rotationAngle = builder.RotationAngle;
ArcOrientation orientation = builder.Orientation;
10 椭圆弧属性
// 获取曲线的控制点
EllipticArcSegment arc = EllipticArcBuilderEx.CreateEllipticArcSegment(arcSegment);
MapPoint startPt = arc.StartPoint;
MapPoint endPt = arc.EndPoint;
Coordinate2D centerPt = arc.CenterPoint;
bool isCircular = arc.IsCircular;
bool isMinor = arc.IsMinor;
bool isCounterClockwise = arc.IsCounterClockwise;
bool isCurve = arc.IsCurve;
double len = arc.Length;
double ratio = arc.MinorMajorRatio;
double semiMajorAxis, semiMinorAxis;
// 获取轴
arc.GetAxes(out semiMajorAxis, out semiMinorAxis);
// 或者使用属性
// semiMajorAxis = arc.SemiMajorAxis;
// semiMinorAxis = arc.SemiMinorAxis;
double startAngle, centralAngle, rotationAngle;
// 或者使用 QueryCoords 获取完整信息
arc.QueryCoords(out centerPt, out startAngle, out centralAngle, out rotationAngle, out semiMajorAxis, out semiMinorAxis);
// 使用属性获取角度信息
// double endAngle = arc.EndAngle;
// centralAngle = arc.CentralAngle;
// rotationAngle = arc.RotationAngle;
// startAngle = arc.StartAngle;