我正在使用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的答案标记为正确,因为它解释了如何使用向量的线性组合来解决问题。
答案 0 :(得分:1)
如果将孔位置存储为整数,我不怀疑舍入误差会很快累积到足以杀死你。如果孔位置存储为浮点,并且如果在每次计算时最后一个位置(ULP)有一个单位的错误,我不太确定错误累积的速度 - 但如果每一步的错误加倍,那么你在双精度浮点出错之前,最多有53个链接。
如果你想要坚如磐石,我会将每个位置表示为向量的线性组合。你可以用它的角度来表示每个向量,你只有几个角度,所以你可以像
那样表示一个洞的位置。采取六个30度步骤和两个90度步骤和四个180度步骤
数字六,二和四将是精确,一旦你将所有位置计算为矢量,你就可以将三角形转换为(x,y)坐标全部在一个人去。如果你担心速度,你可以缓存每个角度的反正切,它甚至会很快。
如果这个描述太简洁,请告诉我。
答案 1 :(得分:0)
一旦我们意识到这些点将被转换为像素坐标,即a.k.a。整数,关于精度的位就变得相对重要。累积0.5和bam的错误!你一个像素关闭。
因此,要么准确性存在巨大问题,要么四舍五入错误的速度非常快,或问题的根源在其他地方。我特别关注这一点:
扩展孔的位置(在第二步中计算)以适合窗口
在我看到一个屏幕之前,我会假设“斜视”意味着“椭圆形的有点儿的东西”;听起来就是这个步骤中的错误所能产生的。
答案 2 :(得分:0)
我讨厌建议这个,但是,从中心开始。此外,您应该查看您的代码并仔细检查是否存在不幸的转换。是的,如果一个洞最终达到“138.2,150.8”,你需要保留小数部分直到你计算出下一个洞。