求可视物体解法[出个一般的题目]

skywind 2003-09-30 11:04:17
哦,问题是这个样子的,
1。在2D地形中,地形有各种多边形组成,
2。每个多边形由若干前后相接的2D线段顺序连接而成
3。每个线段由开始点P1[float x, float y] P2[float x, float y]组成,
由文件读取
4。现在有一个视点V[float x, float y]可以在这个区域的任何地方
计算,V点可以看到的物体线段集合(是一系列线段的集合),这些线段或者是某物体完整的一条边,或者是某物体一边中的一段,请以图形的方式表达出来。
在视点V改变的情况下,准确的计算出可以看到的线段集合。

这是以前做电磁波跟踪里面的一个基本算法,大家想想有什么方法,我随后公布答案
...全文
49 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
skywind 2003-10-16
  • 打赏
  • 举报
回复
绕射的意思就是在拐角处(端点)再当作一个信号元了:

* 原点

#---------# 绕射点,在#处再次当作原点搜索
| |
| |
| |
-----------
zzwu 2003-10-14
  • 打赏
  • 举报
回复
.... 但不知道"绕射"采用了什么规则来计算的?
zzwu 2003-10-14
  • 打赏
  • 举报
回复
http://www.joynb.com/resource/pvsp.gif
有点像射线跟踪法绘图的原理,视线或光线遇到平面就按入射角=出射角的路径继续,都不知道"绕射"采用了什么规则来计算的?
skywind 2003-10-08
  • 打赏
  • 举报
回复
大家说的都非常正确,请大家继续考虑路径求解问题 ^o^
BlueSky2008 2003-10-07
  • 打赏
  • 举报
回复
顶一下!是不是计算每个顶点的角度,按角度排序(只要计算角度的相对大小,能排序就行了,不要计算具体值)然后按角度递增顺序,依次选择距离最近的顶点?
skywind 2003-10-07
  • 打赏
  • 举报
回复
部分答案公布:

请大家如图:http://www.joynb.com/resource/pvsx.gif

其实非常惊讶,我想了好多天的,大家一看就明白了,大概方法如大家所说,
我也没什么好买弄的了,只不过速度方面,我做了些优化而已了。

1.所有图形的线段都是向量,也就是说,一个物体是由逆时针相接的线段组成,
从右手螺旋看,拇指刚好指向建筑上方。

2.判断可视并不能一次360度全部判断完,不能超过180度,我按3个120度做的,
如图中所示,灰色的两条线段就是这次视觉判断的范围。权且叫视锥了

3.在这个视锥里面,进行线段筛选裁减,由于线段是有向的,所以通过一个简单的
点乘视点坐标,<0的(背向视点)的就可以丢弃(由于图形是封闭图形,所以不会影响)

4.这里就如大家所说了,在视锥中建立坐标系,将所有端点与源点连线。

5.排序:处于速度考虑完全拒绝三角函数,连线以后这些连出去的线就形成若干矢量,
将这些矢量都单位化,在视锥坐标系中坐标是[u,v],那么当视锥角度小于180度时
可以认为将单位化的矢量的横轴坐标u从小到大排序得到的矢量就是按角度从左到右
变化的顺序

6.归并:有的矢量相差非常小,当<delta时,认为是一个,进行归并。舍去重复的。

7.现在得到一个个扇形了,在扇形中间的线段取离原点最近的放如结果中,在取最近的
时候,需要判断两线段谁离原点近,不用算两点距离,只要判断两端点的v坐标谁小
就可以简单选取了

8.连接:最终可视的线段被筛选出来了,不过是小段小段的,需要拼接,按照编号坐标
等等。

9.完成,依据上面1-8的方法求另外两个120度的视锥,最后连接就是最终结果了 -_-


晕,写了那么多的代码,也不好帖出来的~~ 。
我是苦了一星期了,大家可是看了就做出来 -_- 。无话可说,其实这是一个电磁波
跟踪程序的基本部分:电磁波从原点出发,碰到墙壁反射,碰到端点绕射。。。。

呵呵,又有变种问题了,不知道大家还感兴趣否:
1.电磁波从原点出发。碰到墙壁反射
2.电磁波如果碰到端点(墙角)就进行绕射,也就是象那里又有一个信号源一样的。
3.在给定反射层数和绕射层数的情况下,求界电磁波从一点到另外一点的路径。

如图所示:
http://www.joynb.com/resource/pvsp.gif
这是三层反射,两层绕射求出来的路径结果,呵呵。问题变了,彻底的
电磁波路径求解,不知道各位在根据上面求解可视区域的基础上面,对于路径求解
有何想法,路径肯定是不难的,但是效率!关键就是效率问题如何解决。

大家先说说,我随后公布答案 :-)
warton 2003-10-04
  • 打赏
  • 举报
回复
skywind 做的不错,顶一下!
skywind 2003-10-02
  • 打赏
  • 举报
回复
哦,这题好玩
skywind 2003-10-02
  • 打赏
  • 举报
回复
要是事先编译个bsp就搞笑了 -_- 不过那东西只能静态啊
skywind 2003-10-02
  • 打赏
  • 举报
回复
不考虑多边形之间的阻拦了,不过我觉得如果设计好的话,考不考虑都一样
zzwu 2003-10-02
  • 打赏
  • 举报
回复
这个题目应和隐藏线/隐藏面的消去算法一样,或者说更简单(因为只是2D),
1.以视点V为中心,
2.向2D平面所有线段端点引射线,
3.求射线与多边形边的交点,
4.这些交点就把多边形边分成了线段,
5.保留与视点V最近的一个线段,其余都不画出来,就行了.
zzwu 2003-10-02
  • 打赏
  • 举报
回复
skywind(今何再) :
不用考虑多个多边形之间的阻挡吗?
frankzch 2003-10-01
  • 打赏
  • 举报
回复
哦,现在题目基本清楚了
我原先以为在2D地形中不考虑遮挡的问题(没有接触过这类问题的在你的题目中看不出来)
回去再考虑一下
LeeMaRS 2003-10-01
  • 打赏
  • 举报
回复
好像就是USACO里面的fence,一个麻烦的题。
frankzch 2003-10-01
  • 打赏
  • 举报
回复
应该还有一个视距把?(眼睛能够看到的最大范围)
以该视点为圆心,视距为半径做圆,每个多边形交在圆内的部分就是可以看到的线段的集合

对任一多边形与圆的交线可以这样求:
1、将视点与多边形的每个顶点作连线,若该连线距离小于半径,则该顶点包含在圆内;否则在圆外
2、若多边形某一边的两个顶点都在圆内,则该线段在圆内;若只有一个顶点在圆内,则圆与该线段有交点,可通过方程求解

也可以直接通过解方程求圆与每条线段的交点
skywind 2003-10-01
  • 打赏
  • 举报
回复
上面的师兄,问题在于考虑充分的遮挡特性,我画了一副示意图,大概就是那个样子。
红色线段代表能看到的部分,我是用矢量来表示的,圆圈是视点

http://www.joynb.com/resource/pvs.gif

33,006

社区成员

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

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