如何解决将直线的起点和终点修剪到它们进入/退出矩形的位置吗?
我正在做一些画布绘画,出于性能原因,我想获取直线进入和/或离开屏幕的位置的坐标。
为了简单起见,我想在下图中找出坐标A'
和B'
。 A
和B
是原始的开始和结束坐标。 A'
和B'
是从A
到B
的直线进入或退出屏幕边界的坐标。
这似乎是一种常见的情况,但是我真的找不到一种简单有效的算法。
我正在使用Flutter,但是我想这是一个普遍的问题,无论使用哪种语言(A和B是点,屏幕都是矩形),都采用类似的解决方案。
解决方法
我们得到以下参数和方程式:
- 点A和B由它们各自的坐标
(xA,yA)
和(xB,yB)
给出; - 边界框由4个不等式
xMin <= x; x <= xMax; yMin <= y; y <= yMax
; - 线(AB)由其方程
(y-yA)*(xB-xA) = (yB-yA)*(x-A)
给出。
我们可以使用它们来求解交点:
- 在前两个示例中,可以通过设置
(x,y)
并求解A'
的线方程来找到y=yMax
的坐标x
; - 在第一个示例中,您可以通过设置
(x,y)
并求解B'
的线方程来找到x=xMax
的坐标y
; - 在第三个示例中,您可以通过设置
(x,y)
并求解B'
的线方程来找到y=yMin
的坐标x
。
要在所有可能的情况下使用边界框找到所有相交点,可以求解所有4种可能的相交类型的方程式,然后丢弃以下任一种解决方案:
- 不满足边界框不等式(这些解是与边界框边的“连续”相交);或
- 不满足线段[AB]周围的隐式边界框的不等式(这些解决方案是线(AB)与边界框的交点,如果只需要线段[[ AB]和边框)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。