角度遮挡算法

时间:2016-12-19 16:47:38

标签: algorithm performance math angle

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

红色角度表示阻挡入射光的“遮挡角度”。

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

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

enter image description here

编辑:从4个标准化矢量指定两个角度,根本不需要处理角度,因为我只需要知道蓝色矢量之间的区域/角度的百分比被红色矢量遮挡

1 个答案:

答案 0 :(得分:3)

要确定角度段是否相交和交叉类型,您可以使用我的答案中描述的方法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)

链接的答案还讨论了奇怪定义的弧的规范化问题(可能对你的情况不重要)以及获得表征交集类型的二进制代码(重要的 - 在你的情况下是排除的间隔)