怎么判断一个线段是否可见?

idler 2002-01-11 10:34:50
在平面上给定一系列线段和一个观察点,如何判断从该点观察某线段是否可见?
只要没有被全部覆盖,这个线段即为可见。
...全文
335 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Soft21 2002-01-13
  • 打赏
  • 举报
回复
大家好啊,这里,Up!
mathe 2002-01-12
  • 打赏
  • 举报
回复
反正在多边形的情况,有一点是可以确定的,我们能够看到的线段肯定是一段连续的线段,而不会看到多段,所以只要将其它线段从和它相邻的线段开始一条条的计算出还没有被覆盖的部分(表示就很简单了),不过要注意一点要按照线段在多边形上的顺序来计算(不然中间结果会出现不连续的部分,那就比较麻烦了)
mathe 2002-01-12
  • 打赏
  • 举报
回复
这样好像将简单多了。
不过还要看观察点的位置是在多边形内部还是外部,还有多边形是否是凸多边形。
idler 2002-01-12
  • 打赏
  • 举报
回复
如果这些线段组成一个多边形呢?
mathe 2002-01-12
  • 打赏
  • 举报
回复
假设多边形的顶点依次为a1,..,an.观察点为O.
现在要判断a1an在O点能否看到。
初始化
s=0;e=1;代表线段 a1+t*(an-a1)在t=s时为a1,t=e时为an)

for(k=1;k<n;k++){
计算直线Oa[k]在直线a1an上的交点(其实可以使用上一次循环的结果)u
计算直线Oa[k+1]在直线a1an上的交点v
如果u同O在a[k]的同侧而且v同O在a[k+1]的同侧;continue;
如果一个同侧一个异侧比较麻烦,需要计算a[k]a[k+1]同a1an的交点(然后就同下面类似了,这里自己考虑一下吧)
同样将u和v表示为参数方程a1+t*(an-a1)中的形式。
由于是处理多边形,比然有u<=s或者v>=e
if(u<=s&&v>=e) 那么线段看不见;return;
if(u<=s)u=e;
else if(v>=e)v=s;


}
idler 2002-01-12
  • 打赏
  • 举报
回复
能不能给出一个具体的算法流程?
多谢!
mathe 2002-01-11
  • 打赏
  • 举报
回复
计算所有其他线段是否同目的线段所在直线相交,如果相交我们就将这些线段在交点处分为两条线段。
然后将所有这些线段上任取一点,如果它同观察点在目的直线分布在直线两边,则抛弃这条线,不然,就计算它在目的线段上投影的范围。就转化为一维问题了。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧