《Pro Android Games》的第二个案例,总体来说还是比较好理解的,其游戏的逻辑与SpaceBlaster基本相似,有趣的是在构建多边形的算法上——坐标的旋转、平移、判断点是否在多边形内部。这次也就重点说说这些算法(其实感觉这些算法也很好理解的,汗,其实没什么可以说的。。。),在这之前首先将相关的三个类的UML图给出:
想想,这两个算法真的没什么好说的,坐标的旋转是高中知识,画画图也能解出;至于判断点是否在多边形(包括凹多边形)内部,则是利用射线法(网上copy的):
注意到如果从P作水平向左(或者右)的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,如果P在多边形外部,则交点个数必为偶数(0也在内)。所以,我们可以顺序考虑多边形的每条边,求出交点的总个数。还有一些特殊情况要考虑。假如考虑边(P1,P2),
1)如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况
2)如果线段水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略
3)再判断相交之前,先判断P是否在边(P1,P2)的上面(叉积),如果在,则直接得出结论:P再多边形内部。
接下来的一周应该是先研究一下JNI和NDK!PS:测试代码在这里~