我正在用Python->PyGame>al蝴蝶结做一个游戏,并且遇到了板一代的问题。然而,我将尝试用语言不可知论的方式来解释这个问题。我相信这和蟒蛇无关。
我已经把棋盘分成了几个部分。
第一部分产生板孔。
孔包含在列表/数组中。每个孔物体都有一个与其周围的其他孔相关的角度的映射,每一个孔也都与之相连。(有点像HTML兄弟姐妹,区别是任何角度都是可能的)
一个洞就像:
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:我会贴出源代码,如果它有帮助的话,但是我觉得它会把事情搞得一团糟。
谢谢你所有的答案。
那些认为“四舍五入”可能不会成为问题的人是对的。考虑到这一点,我又看了一遍代码。我很不好意思地说,我在板的第一部分产生了错误的角度,渲染部分是正确的。
我认为诺曼的答案是正确的,因为它解释了如何使用向量的线性组合来解决问题。
发布于 2010-02-14 23:28:50
如果洞位置被存储为整数,我不怀疑舍入误差积累得足够快,足以杀死你。如果孔位置被存储为浮点,如果在每次计算中有一个单位(ULP)的错误,我不太确定误差累积的速度--但是如果每一步误差加倍,那么在双精度浮点出错之前,最多有53个链接。
如果你想要精确到岩石-固体,我会表示每一个位置为向量的线性组合。你可以用它的角度来表示每一个向量,你只有几个角度,所以你可以把一个洞的位置表示成类似的东西。
采取六个30度步骤,两个90度步骤和四个180度步骤。
数字6,2和4将是精确的,一旦你把所有的位置计算成向量,你就可以做三角转换成(x,y)坐标。如果你担心速度,你可以缓存每个角度的arctangent,它甚至会很快。
如果这个描述过于简洁,请告诉我。
发布于 2010-02-14 23:19:24
一旦我们意识到这些点将被转换成像素坐标,也就是a,关于精度的一点就变得相对重要。整数。累积误差0.5和砰!你离只有一个像素。
所以,要么是在准确性上有一个巨大的问题,四舍五入的误差上升得很快,要么是问题的根源在其他地方。我特别关注这个问题:
扩展孔的位置(在第二步中计算)以适应窗口
直到我看到一个屏幕,我会假设“斜视”的意思是‘椭圆形-有点-差不多-事情’;听起来正是一个错误在这一步可能产生。
发布于 2010-02-15 01:54:13
我不想提出这个建议,但是,从中间开始。此外,您应该查看您的代码,并检查一次不幸的转换。如果一个洞的结尾是"138.2,150.8",你需要保留分数部分,直到你计算出下一个洞为止。
https://stackoverflow.com/questions/2263121
复制相似问题