N原点分别在平面上的给定线段(0, 0),其位置绝对可以是任意的
最后一段将被称为红色。
需要判断红色线段是否从该点可见,(0, 0)或者是否被遮挡(被其他线段/线段覆盖)。
为清楚起见,图片:
在这里你可以看到,如果 1 或 2 是红色,那么它们是可见的;(0, 0)
如果红色是 3 或 4,那么它们是不可见的
实际上,我的解决方案 (O(N)) 如下:
由red红色(最后)段表示,由red.start和red.end表示红色的相应末端,然后如果至少有一个段
(0, 0), (red.start)并且(0, 0), (red.end)不与任何非红色线段相交,则从原点可见,否则不可见。
也就是说,问题被简化为正确定义线段的交集。
总的来说,我实现了它——一切正常(如果有兴趣我可以展示代码)。
对其他算法的工作原理感兴趣,例如,在对数时间内?或者对于线性但采用不同的方法?
编辑
原来这个算法是不正确的,没有考虑到红色段左右部分闭合,中间可见的情况

正确的算法:
将黑色线段与红线交叉,将黑色线段中位于同一半平面(边界为红色线段线)的那些部分与点 (0,0) 相交。将所有剩余的黑色部分投影到红色线段上。如果红色线段被完全覆盖(分析位于一条直线上的线段并集)- 它不可见,否则它是可见的。
来自@AnT 的说明:
正交投影在这里不适用。我们需要从点 (0, 0) 沿射线进行投影。
所以,我的澄清:
“剩余”我们将黑色线段中位于红色线段和连接点 (0,0) 与红色线段两端的线段组成的三角形内的部分称为“剩余”。
更新
@ampawd 关于在 X 轴上的正交投影的评论的插图。
关于“投影部分的总和”,你自己可以举一个反例 - 部分的总和将大于红色的投影,但是漏洞仍然存在。需要的是工会。
更新 2
绿色部分是黑色部分(位于橙红色三角形内)在红色部分上的投影。如果红色部分完全被绿色部分覆盖,那么它是不可见的。