【问题标题】:Intersect and Trim lines with a polygon与多边形相交和修剪线
【发布时间】:2014-07-28 03:10:28
【问题描述】:

我定义了一个Polygon。我想将其他Lines 与该多边形的Edges (此处为白色矩形)相交并修剪列表,以便线条的端点限制在多边形的内部。

目前,我将每条青色线与多边形的边缘相交,这给了我交点。但问题是我不知道如何修剪它们。我知道我需要将每条相交线(青色线)的X1Y1X2Y2更改为交点。但我不知道该怎么做。

让我这样解释。一条青色线与多边形的一条边相交,现在我需要将青色线的端点移动到交叉点以模拟修剪对吗? 哪个端点我需要移动?我有点迷路了。

public class Polygon
{
    public List<Line>() Edges;
}

public class Line
{
    public double X1;
    public double X2;
    public double Y1;
    public double Y2;
}

var listOfIntersectingLines = new List<Line>() {L1, L2, ... };

var ListOfLinesLimitedToPolygon = ?

【问题讨论】:

  • 多边形可以凹吗?
  • @Kicsi 不,它总是凸的。
  • 如何计算交点?是语言特性吗?如果您尝试将一条线与一个部分相交,并且交点在该部分之外,该函数会返回什么?
  • 不,我已经编写了自己的函数,我将每条线与多边形的边(线)相交。
  • 最后一个问题:青色线的一端是否有可能在修剪之前位于多边形内部?

标签: algorithm geometry line polygon intersection


【解决方案1】:

当你相交两个没有交点的部分时,你的函数应该返回 null。例如:在您的第一张图片中,从底部算起的第 4 行不与矩形的左侧或顶部边缘相交,它仅与底部和右侧边缘相交。如果您选择一条青色线,并将其与多边形的所有边缘相交,您将始终得到 2 个或 0 个相交点。如果你得到 2,那么这 2 个点就是你修剪过的青色线的端点。如果你得到 0,这意味着青色线在多边形之外。

可能的问题: 1. 边缘与青色线重叠。您必须决定是否要保留这条线,并相应地调整您的交集功能。 2. 一条边穿过一个角。处理它的最简单方法是,如果线到达边缘的“第一个”端点,则返回一个相交点,但如果它穿过第二个端点,则返回 null。由于您的多边形可能是从点到点定义的,因此可以确保在每个角落,只有 1 条边可以相交。

【讨论】:

  • 我的问题是说其中一条线与一条边相交。现在我怎么知道我需要移动到相交线的哪一端来模拟修剪?
  • @Vahid 首先找到给定青色线的所有交点(它将是 0 或 2)。然后,如果您找到 2 个点,那么修剪线是从 A 到 B 还是从 B 到 A 都不再重要(换句话说:同时设置 2 个端点)。
  • 谢谢 Kicsi,现在我明白你的意思了。非常感谢。
猜你喜欢
  • 2021-11-20
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2011-08-30
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多