【发布时间】:2015-01-19 01:11:46
【问题描述】:
我在 (0, 0, w, h) 处有一个边界框,其中某处有一个点 (x, y),还有一个指向某个随机方向的方向向量 (dx, dy),我是什么尝试做的是从该点沿该方向创建一条线到边界框的边缘。
看下图,黑点是点,箭头是方向向量,红线是我想要的结果线。
我现在做的是简单地将线延长向量乘以一些随机大数,保证将其放置在框外,然后使用线剪裁算法对其进行剪裁。这完全可行,但感觉就像一个非常hacky的解决方案,有没有更好的方法来做到这一点?
【问题讨论】:
-
如果痘是轴对齐的,您可以检查 dx、dy 的符号(查看哪些边可能相交)然后检查 (s1.x - x) / dx 之间哪个最小, 和 (s2.y - y) / dy。
-
我在一年前的一个 javascript 项目中需要完全相同的东西。如果你有兴趣,你可以看看code here,见函数
intersectScreenEdge(向下滚动到评论区说“数学”)。请注意,此函数可以将点放置在给定距离的框外(参数o),因此在使用圆形帽进行绘图时是安全的。如果不需要,只需设置o = 0,或者在代码中忽略o。 -
我发现你的解决方案不是很老套,只要你能保证“随机大数”总是足够大以达到边缘(并且永远不会太大而不会引入浮点精度问题,或者可能还有其他意想不到的问题)。您可以简单地将长度设置为
w + h以确保安全(triangle inequality;您可以更接近对角线的长度,但这需要一个不必要的平方根)。 (假设您将它与 normalizeddx, dy向量相乘。)
标签: c++ algorithm math geometry