旋转椭圆中所有整个lat / lng交叉点的最快算法?

时间:2014-09-20 17:29:29

标签: algorithm geometry starling-framework cartesian-coordinates

我正在使用平铺(但可旋转)投影的2.5D游戏的平铺引擎。瓷砖是平面四边形,其顶点经过调整,并根据摄像机位置和x / y旋转设置放置位置。没有偏航(z)。在Starling中编写引擎。

相机的可见区域可以描述为属于任意旋转且任意高度的固定宽度椭圆的网格区域。

我现在要做的是获取一个落在屏幕空间内的图块列表,然后再进行投影,而不必根据变焦半径/ sin / cos测试每个坐标集。只要它大于半径,这可以是脏集。但我正在寻找最不脏和最优化的解决方案。

3 个答案:

答案 0 :(得分:1)

如果我理解你想要做什么,这类似于填充问题。

在椭圆上叠加矩形网格,并且要列出椭圆内至少有一个角的切片。通过适当的缩放,这与扫描填充椭圆相同。

将椭圆置于其隐式形式ax² + 2bxy + cy² + 2dx + 2ey + f = 0中,坐标缩放/平移,以使网格点落在整数坐标处。您首先确定y值的有用范围。然后,对于每个扫描线,您确定x的极值。

要修复y,您在x ax² + 2(by + d)x + (cy² + 2ey + f) = 0中有二度等式。

其判别为(by+d)- a(cy²+2ey+f) = (b²-ac)y² + 2(bd-ae)y + (d²-af)

y中求解这个二次方程可以得到y个值的范围;取最小的天花板和最大的天花板。

然后对于此范围内的每个整数,求解x,您将获得水平范围。

[注意我使用判别式B²-AC表示At²+ 2Bt + C = 0形式的等式。]

答案 1 :(得分:0)

当瓷砖不移动时,您可以使用八叉树或k-d树。

答案 2 :(得分:0)

我为我的(巨大的DTM)地形网格渲染做到了这一点:

  1. 沿着我的屏幕边界(相机截头Z-近平面)投射几条光线

    • 在相机中的像素方向
    • 它与从焦点开始并通过像素
    • 的线相同
  2. 计算椭球面上光线和地形网格之间的所有交点

    • 为每个使用过的网格线保留最小值,最大值
    • 这将为您提供已用过的单元格列表
  3. 填写空格

    • 为了确保
    • ,只需几个网格单元放大min max line / col
    • 如果缺少任何一条线(没有被光线击中但相邻的线条都是),那么也插入它
    • 这将提供呈现
    • 所需的所有单元格的列表
  4. 看起来像这样:

    • 全球概览:
    • cam view
    • Znear平面细节(近观察相机位置):
    • grid hit

    • 我有6个自由度,所以我需要沿整个屏幕区域投射光线而不仅仅是边界

    • 在你的情况下,4条射线就足够了
    • 可以稍后添加椭圆蒙版
    • 沿椭圆视图周长/周长投射更多光线

    这就是它渲染后的样子(朝向视界):

    enter image description here

    • Hipparcos明星高达+12 mag
    • terrain DTM 50m单元网格尺寸
    • 纹理从NASA GeoCover Circa 1990/2000 SWIR 14.75m内插 - > 50米DTM对齐