角度遮挡算法
Angle occlusion algorithm
我有两个向量形成一个特定的角度,表示什么是"visible",在下图中表示为蓝色角度。
红色的角代表 "occluding angle" 阻挡入射光。
我需要有效地计算紫色角,它表示可见光与遮挡角的百分比,这会创建四种可能的情况,描述为部分遮挡(一侧或两侧)、完全遮挡或完全没有遮挡。
我没能找到一个有效的算法来完成这个非常具体的任务,考虑到蓝色角度可能与 PI 一样大,但遮挡角可能高达 2PI,放置在圆圈内的任何位置
编辑:两个角度均由 4 个归一化向量指定,完全不需要使用角度,因为我只需要知道蓝色向量之间 area/angle 的百分比被红色矢量
要确定 angular 段是否相交和相交类型,您可以使用我的答案中描述的方法
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)
链接的答案还讨论了奇怪定义的弧的规范化问题(可能对您的情况不重要)和获取表征交叉点类型的二进制代码(重要 - 在您的情况下它被排除在间隔之外)
我有两个向量形成一个特定的角度,表示什么是"visible",在下图中表示为蓝色角度。
红色的角代表 "occluding angle" 阻挡入射光。
我需要有效地计算紫色角,它表示可见光与遮挡角的百分比,这会创建四种可能的情况,描述为部分遮挡(一侧或两侧)、完全遮挡或完全没有遮挡。
我没能找到一个有效的算法来完成这个非常具体的任务,考虑到蓝色角度可能与 PI 一样大,但遮挡角可能高达 2PI,放置在圆圈内的任何位置
编辑:两个角度均由 4 个归一化向量指定,完全不需要使用角度,因为我只需要知道蓝色向量之间 area/angle 的百分比被红色矢量
要确定 angular 段是否相交和相交类型,您可以使用我的答案中描述的方法
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)
链接的答案还讨论了奇怪定义的弧的规范化问题(可能对您的情况不重要)和获取表征交叉点类型的二进制代码(重要 - 在您的情况下它被排除在间隔之外)