Вы рисуете линию или кривую?Для линии я предполагаю, что вы используете только первую и последнюю обнаруженные точки.Для кривой вы используете все обнаруженные точки для формирования кривой, которую вы рисуете.
Если вы рисуете кривую, то подумайте, что я понимаю проблему.Вы рассчитываете линию пересечения, используя последовательные точки, обнаруженные сенсорной системой.Эти последовательные точки расположены очень близко друг к другу, что приводит к очень маленькому отливу лучей, и может случиться так, что вы можете навести линию с начальной и конечной точками внутри шаров, что может вызвать отрицательное столкновение.
Если цель состоит в том, чтобы определить, касаетесь ли вы шаров, я предлагаю использовать датчик, сохраняемый под касанием, а затем проверить столкновение с этим кодом в своем методе обновления:
for (b2ContactEdge* ce = sensorbody->GetContactList(); ce; ce = ce->next)
{
b2Contact* c = ce->contact;
if(c->IsTouching())
{
const b2Body* bodyA = c->GetFixtureA()->GetBody();
const b2Body* bodyB = c->GetFixtureB()->GetBody();
const b2Body* ballBody = (bodyA == sensorbody)?bodyB:bodyA;
...
}
}
Если вы действительноЕсли вы хотите использовать raycast, я предлагаю сохранить несколько последовательных точек и сделать из них вектор, чтобы избежать небольшого приведения лучей.
edit: Извините, пример, который я написал, написан на C ++, но вы должнысмог найти эквивалент для Objective-C.