我制作了这个应用程序,让用户在屏幕上画一条线,然后球在现实生活和物体中以反弹的角度逼真地反弹。但它只适用于直线。现在我正试图让它弯曲。
我决定从微积分方法中明确表示,因为所涉及的矩阵似乎比需要的更加可怕。我正在做的是在-(void)touchesMoved
事件中,它记录CGPoint阵列中的当前触摸点。然后为了找到碰撞,我有一个类似for (int i = 2; i <= numberOfPoints; i++) {
的for循环,当numberOfPoints增加时,它会飞过i的所有值。因此,对于碰撞,我假设我会得到i和i-1之间的直线斜率,然后得到从球到该直线的垂直距离,当它接近零时发生碰撞,就像我在直线版本中所做的那样
然而,这不起作用。有没有人有任何提示更好的方法来做到这一点?我真的强调了我对这一个的所有选择
答案 0 :(得分:1)
使用i和i-1计算斜率可以简化它。我建议:
加宽两点之间的距离以计算斜率(例如i和i-4)。原因是对于人眼来说,两个连续点之间的区别是不可察觉的。对于略微进一步分开的点,眼睛将感知到相同的斜率。但是,相距较远的点可能会为您提供更准确的斜率。
如果碰撞点是i,请尝试平均(i,i-1),(i,i-2),(i,i-3),(i,i + 1)之间的斜率,(i,i + 2),(i,i + 3)。我觉得这也应该会给你一个更好的结果。
如果我是你,我会使用选项2。
您还可以使用两个选项的混合,选择更远的点集,然后平均这些斜率。
另外,作为旁注,我假设你已经知道了,但你听说过Box2D
编辑:
还有一件事......如果你能找到一种方法将用户的曲线段划分为多个直线段,你可以简单地使用旧的算法。