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

标签 python language-agnostic rounding precision

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

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

第一部分生成板孔。

空洞包含在列表/数组中。每个孔对象都有与其周围其他孔相关的角度映射,这些孔中的每一个也链接回它。 (有点像 HTML DOM sibling ,不同之处在于任何角度都是可能的)

一个洞是这样的:

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 的答案标记为正确,因为它解释了如何使用向量的线性组合来解决问题。

最佳答案

如果孔位置存储为整数,我相信舍入误差累积的速度足以让您丧命。如果孔位置存储为 float ,并且每次计算时最后一个位置 (ULP) 有一个单位的误差,我不太确定误差累积的速度有多快——但如果误差在每一步都加倍,那么你在 double float 出错之前最多有 53 个链接。

如果您想要绝对准确,我会将每个位置表示为向量的线性组合。你可以用它的角度来表示每个向量,而且你只有几个角度,所以你可以将孔的位置表示为类似的东西

Take six 30-degree steps and two 90-degree steps and four 180-degree steps

数字 6、2 和 4 将是精确的,一旦您将所有位置计算为向量,您就可以执行三角函数以将所有坐标转换为 (x, y) 坐标一去。如果您担心速度,您可以缓存每个角度的反正切值,它甚至会很快。

如果此描述过于简洁,请告诉我。

关于python - 如何计算游戏板上孔的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2263121/

相关文章:

if 语句中的 Python 变量范围

python - CodeHS 8.3.8 : Word Ladder? 我还需要什么

python - 如何使用 scapy PcapWriter 对数据包强制执行错误的校验和?

python - 无法抓取这个特定的 div 类

language-agnostic - 主观性在编程中的作用有多大?

Java 如何迭代 double 组并四舍五入到最接近的整数

ios - 将 float 四舍五入到最接近的 .5

algorithm - 设计一个堆栈使得 getMinimum( ) 应该是 O(1)

algorithm - 平面图中的小循环发现

Clojure - 如果需要的话四舍五入到小数