+ return false;
+
+ pcInfo->m_vecPoint = p1 - (p1 - p2) * r1 / (r1 + r2);
+ pcInfo->m_vecNormal = p1 - p2;
+
+ return true;
+}
+
+bool getInfo(const Polygon* pPoly, const Ball* pBall, CollisionInfo* pcInfo)
+{
+ // a few values to simplify the equations
+ float fRad = pBall->radius;
+ Vector2 vecPos = pBall->positionRaw();
+ Vector2 vecVelo = pBall->velocityRaw();
+
+ float fMaxX = pPoly->maxP.m_fX;
+ float fMinX = pPoly->minP.m_fX;
+ float fMaxY = pPoly->maxP.m_fY;
+ float fMinY = pPoly->minP.m_fY;
+
+ // quick binding box check
+ if (vecPos.m_fX - fRad > fMaxX || vecPos.m_fX + fRad < fMinX ||
+ vecPos.m_fY - fRad > fMaxY || vecPos.m_fY + fRad < fMinY)
+ return false;
+
+
+ Vector2 vecTotVec;
+ int iTot = 0;
+
+ {
+ const vector<Vector2>& pts = pPoly->points;
+ unsigned int num = pts.size();
+
+ for (unsigned int i = 0; i < num; i++)
+ {
+ Vector2 vec = vectorToLine(vecPos,
+ pts[i].m_fX,
+ pts[i].m_fY,
+ pts[(i + 1) % num].m_fX,
+ pts[(i + 1) % num].m_fY);
+
+ if (vec.sqrLength() <= fRad*fRad && 0 < vec.dot(vecVelo))
+ {
+ vecTotVec += vec;
+ iTot += 1;
+ }
+ }
+ }
+
+ if (iTot <= 0)
+ return false;
+
+
+ pcInfo->m_vecPoint = vecTotVec / iTot + vecPos;
+ pcInfo->m_vecNormal = vecPos - pcInfo->m_vecPoint;