【问题标题】:Angle occlusion algorithm角度遮挡算法
【发布时间】:2016-12-19 16:47:37
【问题描述】:

我有两个向量形成一个特定的角度,表示什么是“可见的”,表示为下图中的蓝色角度。

红色角代表一个“遮蔽角”,可以阻挡入射光。

我需要有效地计算紫色角,它表示可见光相对于遮挡角的百分比,这会产生四种可能的情况,描述为部分遮挡(一侧或两侧)完全遮挡或完全遮挡。

考虑到蓝色角度可能与 PI 一样大,但遮挡角度可能高达 2PI,放置在圆内的任何位置,我未能找到一种有效的算法来完成这项非常具体的任务

编辑:两个角度都是从 4 个归一化向量中指定的,根本不需要使用角度,因为我只需要知道蓝色向量之间的面积/角度有多少百分比被红色向量遮挡

【问题讨论】:

  • 您只需要角度的值(或值的总和)还是还需要知道它是如何旋转的?
  • 因为我只需要知道被遮挡的可见光的百分比,所以只知道紫罗兰色值就足够了。如果没有遮挡,它实际上应该是蓝色角度本身

标签: algorithm performance math angle


【解决方案1】:

要确定角线段是否相交和相交类型,您可以使用我的答案here中描述的方法

a1和a2是第一个扇区的端点,b1和b2是第二个扇区的端点,ma和mb是平分线,da和db是半角:

da = (a2 - a1)/ 2  
db = (b2 - b1)/ 2  
ma = (a2 + a1)/ 2  
mb = (b2 + b1)/ 2  
cda = Cos(da)
cdb = Cos(db)

要检查是否存在交集以及发生了什么样的交集,找到4个布尔值

 BStartInsideA = (Cos(ma - b1) >= cda)
 BEndInsideA  =  (Cos(ma - b2) >= cda)
 AStartInsideB = (Cos(mb - a1) >= cdb)
 AEndInsideB =   (Cos(mb - a2) >= cdb)

链接的答案还讨论了怪异定义的弧线的规范化问题(可能对您的情况并不重要)和获取表征交集类型的二进制代码(重要 - 在您的情况下它是排除区间)

【讨论】:

  • 直到两个角度都小于或等于 PI jsfiddle.net/1942vk9g/5
  • 试试var a2 = rad(270 + 360); - 这里需要圆弧归一化,否则平分线为300,半角为30
  • 它也适用于大于 180 的任何角度的负值,谢谢
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2022-01-24
  • 2011-06-27
  • 2014-09-22
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多