将直线的起点和终点修剪到它们进入/退出矩形的位置?
Posted
技术标签:
【中文标题】将直线的起点和终点修剪到它们进入/退出矩形的位置?【英文标题】:Trim start and end points of straight line to where they enter/exit a rectangle? 【发布时间】:2021-01-26 21:14:18 【问题描述】:我正在画一些画布,出于性能原因,我想获取直线进入和/或退出屏幕的坐标。
更简单的说,我想在下图中找出坐标A'
和B'
。 A
和 B
是原始的开始和结束坐标。 A'
和B'
是从A
到B
的直线进入或离开屏幕边界的坐标。
这似乎是一种常见的情况,但我真的找不到一个简单有效的算法。
我正在使用 Flutter,但我想这是一个通用问题,无论哪种语言都有类似的解决方案(A 和 B 是点,屏幕是矩形)。
【问题讨论】:
不确定这对您的具体情况有帮助,但shapely 对于空间分析非常有用。 【参考方案1】:我们得到以下参数和方程:
点 A 和 B 由它们各自的坐标(xA, yA)
和 (xB, yB)
给出;
边界框由 4 个不等式xMin <= x; x <= xMax; yMin <= y; y <= yMax
给出;
线 (AB) 由其方程 (y-yA)*(xB-xA) = (yB-yA)*(x-A)
给出。
我们可以用它们来求解交点:
在前两个例子中,您可以通过设置y=yMax
并求解x
的直线方程来找到A'
的坐标(x,y)
;
在第一个例子中,您可以通过设置x=xMax
并求解y
的直线方程来找到B'
的坐标(x,y)
;
在第三个示例中,您可以通过设置y=yMin
并求解x
的直线方程来找到B'
的坐标(x,y)
。
要在所有可能的情况下找到与边界框的所有交点,您可以求解所有 4 种可能的交点类型的方程,然后丢弃以下任一解:
不满足边界框不等式(这些解是与边界框边的“延续”的交集);或 不满足线段 [AB] 周围的隐式边界框的不等式(这些解决方案是线 (AB) 与边界框的交点,如果您只想要线段 [AB] 的交点,您将不感兴趣) AB] 与边界框)。【讨论】:
以上是关于将直线的起点和终点修剪到它们进入/退出矩形的位置?的主要内容,如果未能解决你的问题,请参考以下文章