NetTopologySuite中如何旋转LineSegment?
实现LineSegment的旋转变换
因为AffineTransformation的核心是对Coordinate坐标点进行变换,而LineSegment仅由两个端点坐标构成,所以无需依赖Geometry基类,直接操作坐标点即可实现旋转。下面提供几种实用方案:
方案1:给LineSegment添加扩展方法(推荐,复用性高)
编写扩展方法封装变换逻辑,后续可以直接调用:
public static LineSegment ApplyAffineTransformation(this LineSegment segment, AffineTransformation transformation) { Coordinate transformedStart = transformation.Transform(segment.GetCoordinate(0)); Coordinate transformedEnd = transformation.Transform(segment.GetCoordinate(1)); return new LineSegment(transformedStart, transformedEnd); }
使用示例
// 创建旋转变换实例(示例:绕原点旋转90度,即π/2弧度) var rotationTransform = AffineTransformation.Rotation(Math.PI / 2); // 对LinearRing提取的线段列表批量应用变换 var rotatedSegments = outerBoundary.GetSegments() .Select(seg => seg.ApplyAffineTransformation(rotationTransform)) .ToList();
方案2:直接遍历坐标并变换(无需扩展方法)
如果只是临时需求,也可以在生成线段时直接处理坐标变换:
var rotationTransform = AffineTransformation.Rotation(Math.PI / 2); var coordinates = outerBoundary.Coordinates; var rotatedSegments = new List<LineSegment>(); for (int i = 0; i < coordinates.Length; i++) { Coordinate transformedStart = rotationTransform.Transform(coordinates[i]); Coordinate transformedEnd = rotationTransform.Transform(coordinates[(i + 1) % coordinates.Length]); rotatedSegments.Add(new LineSegment(transformedStart, transformedEnd)); }
方案3:先变换整个LinearRing再拆线段(更高效)
如果不需要单独处理原始线段,建议直接先对整个LinearRing应用变换,再提取线段——这种方式利用几何库的内置逻辑,代码更简洁,效率也更高:
var rotationTransform = AffineTransformation.Rotation(Math.PI / 2); // 变换整个LinearRing(注意强制类型转换) var transformedRing = (LinearRing)rotationTransform.Transform(outerBoundary); // 提取变换后的线段 var rotatedSegments = transformedRing.GetSegments();
内容的提问来源于stack exchange,提问作者dotnetexplorer
相关产品推荐
相关产品推荐

