如何计算游戏板上的孔位?

时间:2010-02-14 22:39:30

标签: python language-agnostic rounding precision

我正在使用Python-> PyGame-> Albow制作游戏并遇到了板生成问题。但是,我会尝试以语言无关的方式解释问题。我相信它与python无关。

我将游戏板生成分为几个部分。

第一部分会产生电路板孔。

孔包含在列表/数组中。每个孔对象具有与围绕它的其他孔相关的角度映射,每个孔也链接回它。 (类似于HTML DOM兄弟,不同的角度是可能的)

洞就像:

hole = {
    empty: True,
    links: {
        90: <other hole>,
        270: <another hole>,
        etc...
    }
}

第二部分,计算空洞位置。 代码是这样的。

def calculate_position(hole):
    for linked_hole in hole.links:
        if linked_hole.position == None:
            #calculate linked hole's position relative to this hole
            linked_hole.position = [position relative to first hole]
            calculate_position(linked_hole)

first_hole.position = (0, 0) #x, y
calculate_position( first_hole )

第三部分,画板。

找到窗口高度,展开孔的位置(在第二步中计算)以适合窗口。画出一切。

我相信问题出在第二步,我正在计算相对于前一洞的每个洞。圆角误差加起来,并且电路板会在距离孔的起始孔越远的位置处斜视形状,并且电路板越大。只有在制作非矩形板时才会发生这种情况,否则会出现舍入错误。

我使用简单的三角法来计算孔的相对位置,将角度转换为弧度并使用内置的sin / cos函数。

任何关于解决方案的想法或者我是否对这个问题有误都是有用的:)

PS:我会发布源代码,如果它会有所帮助,但会觉得它会让事情变得混乱

感谢所有答案。

那些说四舍五入的人可能不会成为一个问题。考虑到这一点,我再看一下代码。我很尴尬地说我在电路板生成的第一部分产生了错误的角度,渲染部分是正确的。

我将Norman的答案标记为正确,因为它解释了如何使用向量的线性组合来解决问题。

3 个答案:

答案 0 :(得分:1)

如果将孔位置存储为整数,我不怀疑舍入误差会很快累积到足以杀死你。如果孔位置存储为浮点,并且如果在每次计算时最后一个位置(ULP)有一个单位的错误,我不太确定错误累积的速度 - 但如果每一步的错误加倍,那么你在双精度浮点出错之前,最多有53个链接。

如果你想要坚如磐石,我会将每个位置表示为向量的线性组合。你可以用它的角度来表示每个向量,你只有几个角度,所以你可以像

那样表示一个洞的位置。
  

采取六个30度步骤和两个90度步骤和四个180度步骤

数字六,二和四将是精确,一旦你将所有位置计算为矢量,你就可以将三角形转换为(x,y)坐标全部在一个人去。如果你担心速度,你可以缓存每个角度的反正切,它甚至会很快。

如果这个描述太简洁,请告诉我。

答案 1 :(得分:0)

一旦我们意识到这些点将被转换为像素坐标,即a.k.a。整数,关于精度的位就变得相对重要。累积0.5和bam的错误!你一个像素关闭。

因此,要么准确性存在巨大问题,要么四舍五入错误的速度非常快,或问题的根源在其他地方。我特别关注这一点:

  

扩展孔的位置(在第二步中计算)以适合窗口

在我看到一个屏幕之前,我会假设“斜视”意味着“椭圆形的有点儿的东西”;听起来就是这个步骤中的错误所能产生的。

答案 2 :(得分:0)

我讨厌建议这个,但是,从中心开始。此外,您应该查看您的代码并仔细检查是否存在不幸的转换。是的,如果一个洞最终达到“138.2,150.8”,你需要保留小数部分直到你计算出下一个洞。