我正在尝试用锥实现射线跟踪(Amanatides 1984)。视锥线而不是射线,而是将其射入场景并与几何图形相交。由于多个三角形可以占据圆锥的孔径,因此我们需要计算(或者说要快速估算,因为圆锥跟踪无论如何都会产生很多近似值)被三角形覆盖的圆的相对面积。之后,将对各个贡献进行加权和汇总。

不幸的是,作者并没有提供有关其解决方案的很多细节。这是他在锥平面交点上写的:


上面的扩散角和射线与平面之间的夹角
共同表明了中心线之间的距离如何
圆和半平面的边缘[sic]。给定该距离,使用多项式逼近计算相交的面积。
完成平面的相交计算。


,然后,在垂直于圆锥体
方向向量的平面上投影多边形之后, >

然后我们必须计算投影的多边形
和一个圆之间的交点。这可以通过计算从圆心到每个边缘的距离
,然后使用前面提到的

我在StackExchange上找到了解决问题的方法。我已经从NowIGetToLearnWhatAHeadIs的答案中移植了代码,它可以正常工作,但是对我来说似乎很复杂。我正在使用Compute Shaders,因此分支是一件坏事,解决方案在很大程度上依赖于它。
是否可以近似地解决这个问题,从而以可观的性能/简单的代码获得合理的结果(例如±10%)?
例如,使用GPU,我对优化的解决方案感兴趣,该解决方案在分支上使用最小/最大。也许这样的东西已经存在。有运气吗?


评论

您毫无疑问已经阅读了吗?您愿意接受16个样本的蒙特卡洛吗?

#1 楼

努力寻求确切的解决方案

在我必须运行之前,请三思而后行。如果不计算圆切出的三角形的面积怎么办。相反,让我们计算一下它的逆。切出圆弧的三段区域。这种方法的优点在于,我们可以编写单个代码,然后重复三遍。当然,有时候答案是0,但没关系。



图像1:让我们计算一下这个问题。现在事实证明我们知道如何计算逆,这是一个圆的线段。因此,我们可以说$ A_ {int} = A_ {circle} -A_1-A_2-A_3 $。



图像2:我们知道此解决方案。

段面积的公式只是$ A_ {sector} -A_ {triangle} $,这在文学上有众所周知的解决方案。

因此,现在您要做的就是在以圆为中心的空间中找到边缘和圆之间的交点,计算它们之间的角度,然后计算每个线段。唯一的特殊情况是不存在交叉点。我不知道这是否很快,但是至少代码应该易于实现。

评论


$ \ begingroup $
我想可以用最接近的直线计算圆弧的大小,这将使它非常整洁。
$ \ endgroup $
– joojaa
16年7月15日在13:36

$ \ begingroup $
我喜欢这种方法的优雅。当其中一个顶点在三角形内时,是否需要特殊情况处理?好像可以算出该区域的一部分两次。
$ \ endgroup $
– trichoplax
16年7月16日在12:25

$ \ begingroup $
@joojaa的确可以使用矢状面来计算,甚至对此有一个近似公式(Harris and Stocker 1998)。参见mathworld.wolfram.com/CircularSegment.html
$ \ endgroup $
– David Kuri
16年7月17日在15:33

$ \ begingroup $
@trichoplax的确,如果圆中至少有一个顶点,则此方法将失败,并且我不能保证不会。还在那里寻找不错的解决方案...
$ \ endgroup $
– David Kuri
16年7月17日在15:34