You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:10:31