在NetTopologySuite中,如何旋转LineSegment?
我有一个叫LineRing的outerBoundary。由于找不到一个直接的方法来提取这个LineRing的各个片段,所以我创建了一个扩展方法,如下所示;
`
public static List<LineSegment> GetSegments(this LinearRing lineRing)
{
List<LineSegment> segments = new List<LineSegment>();
Coordinate[] coordinates = lineRing.Coordinates;
for (int i = 0; i < coordinates.Length; i++)
{
segments.Add(new LineSegment(coordinates[i], coordinates[(i + 1 )% coordinates.Length]));
}
return segments;
}`
因此,我在GetSegments上调用outerBoundary方法,它将各个边的列表作为LineSegments的列表返回。现在,我想用一个角度旋转每一个片段。如果GetSegments返回了一个LineStrings列表,我就可以用旋转的方式对AffineTransformation实例进行微格化,并将其应用于这些片段中的每一个。但是我觉得有一个LineSegment列表是直觉的,因为每个边都只有两个端点,而LineString允许有两个以上的顶点。现在,如何对LineSegments进行同样的处理?由于LineSegment没有继承几何基类,所以我理解AffineTransformation不能应用于LineSegments。有人能帮忙吗?
发布于 2022-11-22 14:50:06
我会使用一个小的三角函数,在每个段中按原点(在这里是中点)移动P0和P1。
使用上面的代码,循环每个段
foreach (LineSegment segment in segments)
Rotate(segments, seg.MidPoint, rotation);以及要旋转的代码:
public void Rotate(LineSegment segment, Coordinate origin, double radAngle)
{
double x = origin.X + (Math.Cos(radAngle) * (segment.P0.X - origin.X) - Math.Sin(radAngle) * (segment.P0.Y - origin.Y));
double y = origin.Y + (Math.Sin(radAngle) * (segment.P0.X - origin.X) + Math.Cos(radAngle) * (segment.P0.Y - origin.Y));
segment.P0.X = x;
segment.P0.Y = y;
x = origin.X + (Math.Cos(radAngle) * (segment.P1.X - origin.X) - Math.Sin(radAngle) * (segment.P1.Y - origin.Y));
y = origin.Y + (Math.Sin(radAngle) * (segment.P1.X - origin.X) + Math.Cos(radAngle) * (segment.P1.Y - origin.Y));
segment.P1.X = x;
segment.P1.Y = y;
}https://stackoverflow.com/questions/74527981
复制相似问题