将直线的起点和终点修剪到它们进入/退出矩形的位置?

Posted

技术标签:

【中文标题】将直线的起点和终点修剪到它们进入/退出矩形的位置?【英文标题】:Trim start and end points of straight line to where they enter/exit a rectangle? 【发布时间】:2021-01-26 21:14:18 【问题描述】:

我正在画一些画布,出于性能原因,我想获取直线进入和/或退出屏幕的坐标。

更简单的说,我想在下图中找出坐标A'B'AB 是原始的开始和结束坐标。 A'B' 是从AB 的直线进入或离开屏幕边界的坐标。

这似乎是一种常见的情况,但我真的找不到一个简单有效的算法。

我正在使用 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] 与边界框)。

【讨论】:

以上是关于将直线的起点和终点修剪到它们进入/退出矩形的位置?的主要内容,如果未能解决你的问题,请参考以下文章

百度地图怎么设置起点和终点

直线与矩形相交的特例

MFC 动态绘制直线,圆弧段(连续)如何实现

绘制直线

已知直线终点与起点坐标 怎么两点距离

能够在音频播放器上选择起点和终点