首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算棋盘上洞的位置?

如何计算棋盘上洞的位置?
EN

Stack Overflow用户
提问于 2010-02-14 22:39:29
回答 3查看 363关注 0票数 2

我正在用Python->PyGame>al蝴蝶结做一个游戏,并且遇到了板一代的问题。然而,我将尝试用语言不可知论的方式来解释这个问题。我相信这和蟒蛇无关。

我已经把棋盘分成了几个部分。

第一部分产生板孔。

孔包含在列表/数组中。每个孔物体都有一个与其周围的其他孔相关的角度的映射,每一个孔也都与之相连。(有点像HTML兄弟姐妹,区别是任何角度都是可能的)

一个洞就像:

代码语言:javascript
复制
hole = {
    empty: True,
    links: {
        90: <other hole>,
        270: <another hole>,
        etc...
    }
}

第二部分,计算孔位。代码就像这样。

代码语言:javascript
复制
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:我会贴出源代码,如果它有帮助的话,但是我觉得它会把事情搞得一团糟。

谢谢你所有的答案。

那些认为“四舍五入”可能不会成为问题的人是对的。考虑到这一点,我又看了一遍代码。我很不好意思地说,我在板的第一部分产生了错误的角度,渲染部分是正确的。

我认为诺曼的答案是正确的,因为它解释了如何使用向量的线性组合来解决问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-14 23:28:50

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

如果你想要精确到岩石-固体,我会表示每一个位置为向量的线性组合。你可以用它的角度来表示每一个向量,你只有几个角度,所以你可以把一个洞的位置表示成类似的东西。

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

数字6,2和4将是精确的,一旦你把所有的位置计算成向量,你就可以做三角转换成(x,y)坐标。如果你担心速度,你可以缓存每个角度的arctangent,它甚至会很快。

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

票数 1
EN

Stack Overflow用户

发布于 2010-02-14 23:19:24

一旦我们意识到这些点将被转换成像素坐标,也就是a,关于精度的一点就变得相对重要。整数。累积误差0.5和砰!你离只有一个像素。

所以,要么是在准确性上有一个巨大的问题,四舍五入的误差上升得很快,要么是问题的根源在其他地方。我特别关注这个问题:

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

直到我看到一个屏幕,我会假设“斜视”的意思是‘椭圆形-有点-差不多-事情’;听起来正是一个错误在这一步可能产生。

票数 0
EN

Stack Overflow用户

发布于 2010-02-15 01:54:13

我不想提出这个建议,但是,从中间开始。此外,您应该查看您的代码,并检查一次不幸的转换。如果一个洞的结尾是"138.2,150.8",你需要保留分数部分,直到你计算出下一个洞为止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2263121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档