我一直在Python3.2.5中开发一个二维对象创建程序,该程序处理任意形状的操作并计算它们之间的碰撞检测。这个程序允许你输入一个形状的坐标,从那里它可以做任何你想让它做的事情(把这个形状画到屏幕上,扩展边框,操作各个坐标,使它对称,等等)。在
但是我在计算任意多边形的内角时遇到了一个问题。虽然我用这个算法计算角度,技术上输出正确的角度,但我无法判断程序是否显示出内角或外角(因为用户输入的任意形状可能有凹面顶点)。在
在纸上,这看起来像是小菜一碟,因为你可以形象化的形状,你可以解释哪个角度是内部和外部的自动。但是由于程序只存储坐标值,实际上并没有可视化地创建对象来外推数据,所以这个问题变得有点棘手。在
所以我的问题是:
我应该用什么方法来计算两条直线之间的夹角?我应该如何用它来确定内角和外角之间的差异?在
例如,如果我有一个有坐标的形状((30,50),(35,47),(40,50),(37,43),(35,35),(33,43))(它看起来有点像一个底凹的倒立尖顶),我可以很容易地计算线之间的角度,但我计算的角度是个谜。在
正如Jesse建议的那样,首先需要按某种顺序保存顶点列表。我建议逆时针方向。用点积求出十字积的角度和符号,告诉你它是哪一边的。按逆时针顺序存储时,内角为正
找到两个向量之间有符号角的黄金标准是
atan2(cross(a,b)), dot(a,b))
。在所有角度都具有高精度和鲁棒性。(在2D中,cross
是垂直点积,ax*by-ay*bx
。在三维空间中,使用十字积的长度;它的方向是旋转轴。)有些事情不能做:
acos
的东西。反余弦是一种代码气味。它受限制的范围,不会给你的迹象,需要手动参数夹紧,并在其极端精度差。如果你发现自己在用它,试试别的办法。在我不知道你尝试过什么算法,但通常这个问题是通过以相同的顺序(比如顺时针)存储点列表来解决的,这样每次按顺序对三个点进行角度计算时,你总是得到形状的同一侧(比如内角)。在
相关问题 更多 >
编程相关推荐