@@ -20,8 +20,8 @@ getRegularPolyVertices(const RegularPolygonCollider *rp) {
2020 for (int i = 0 ; i < sides; i++) {
2121 float angle = i * angleStep + startAngle;
2222
23- float localX = rp->radius * std::cos (angle);
24- float localY = rp->radius * std::sin (angle);
23+ float localX = rp->radius * std::cos (angle) * rp-> scaleX ;
24+ float localY = rp->radius * std::sin (angle) * rp-> scaleY ;
2525
2626 int finalX = static_cast <int >(localX * c + localY * s) + rp->x ;
2727 int finalY = static_cast <int >(-localX * s + localY * c) + rp->y ;
@@ -202,32 +202,33 @@ bool IntersectionVisitor::visitRegularPolygon(
202202
203203bool IntersectionVisitor::circleCircle (const CircleCollider *c1,
204204 const CircleCollider *c2) {
205- float distSq = CollisionMath::distanceSquared (c1 ->x , c1 ->y , c2 ->x , c2 ->y );
206- float radSum = c1->radius + c2->radius ;
207- return distSq < radSum * radSum ;
205+ return CollisionMath::pointInEllipse (c2 ->x , c2 ->y , c1 ->x , c1 ->y ,
206+ c1->radiusX () + c2->radiusX (),
207+ c1-> radiusY () + c2-> radiusY ()) ;
208208}
209209
210210bool IntersectionVisitor::circleRectangle (const CircleCollider *circle,
211211 const RectangleCollider *rect) {
212212 if (rect->rotation == 0 .0f ) {
213213 // Fast AABB Check
214+ float w = rect->scaledWidth ();
215+ float h = rect->scaledHeight ();
214216 float testX = circle->x ;
215217 float testY = circle->y ;
216218
217219 if (circle->x < rect->x )
218220 testX = rect->x ;
219- else if (circle->x > rect->x + rect-> width )
220- testX = rect->x + rect-> width ;
221+ else if (circle->x > rect->x + w )
222+ testX = rect->x + w ;
221223
222224 if (circle->y < rect->y )
223225 testY = rect->y ;
224- else if (circle->y > rect->y + rect-> height )
225- testY = rect->y + rect-> height ;
226+ else if (circle->y > rect->y + h )
227+ testY = rect->y + h ;
226228
227- float distX = circle->x - testX;
228- float distY = circle->y - testY;
229- return (distX * distX + distY * distY) <=
230- (circle->radius * circle->radius );
229+ return CollisionMath::pointInEllipse (testX, testY, circle->x , circle->y ,
230+ circle->radiusX (),
231+ circle->radiusY ());
231232 } else {
232233 // Rotated Rectangle -> Treat as Polygon vs Circle
233234 auto corners = rect->getCorners ();
@@ -247,9 +248,9 @@ bool IntersectionVisitor::circleRectangle(const CircleCollider *circle,
247248
248249bool IntersectionVisitor::circlePoint (const CircleCollider *circle,
249250 const PointCollider *point) {
250- return CollisionMath::distanceSquared (circle ->x , circle ->y , point ->x ,
251- point ->y ) <=
252- (circle-> radius * circle->radius );
251+ return CollisionMath::pointInEllipse (point ->x , point ->y , circle ->x ,
252+ circle ->y , circle-> radiusX (),
253+ circle->radiusY () );
253254}
254255
255256bool IntersectionVisitor::circleLine (const CircleCollider *circle,
@@ -269,9 +270,9 @@ bool IntersectionVisitor::circleLine(const CircleCollider *circle,
269270 lineLenSq));
270271 float closestX = line->x + t * (x2 - line->x );
271272 float closestY = line->y + t * (y2 - line->y );
272- return CollisionMath::distanceSquared (circle-> x , circle->y , closestX ,
273- closestY) <
274- (circle-> radius * circle->radius );
273+ return CollisionMath::pointInEllipse (closestX, closestY, circle->x ,
274+ circle-> y , circle-> radiusX (),
275+ circle->radiusY () );
275276}
276277
277278bool IntersectionVisitor::circlePolygon (const CircleCollider *circle,
@@ -311,8 +312,10 @@ bool IntersectionVisitor::rectangleRectangle(const RectangleCollider *r1,
311312 const RectangleCollider *r2) {
312313 // Optimization: If BOTH are unrotated, use fast AABB
313314 if (r1->rotation == 0 .0f && r2->rotation == 0 .0f ) {
314- return !(r1->x >= r2->x + r2->width || r1->x + r1->width <= r2->x ||
315- r1->y >= r2->y + r2->height || r1->y + r1->height <= r2->y );
315+ float w1 = r1->scaledWidth (), h1 = r1->scaledHeight ();
316+ float w2 = r2->scaledWidth (), h2 = r2->scaledHeight ();
317+ return !(r1->x >= r2->x + w2 || r1->x + w1 <= r2->x ||
318+ r1->y >= r2->y + h2 || r1->y + h1 <= r2->y );
316319 }
317320
318321 auto p1 = r1->getCorners ();
@@ -323,8 +326,10 @@ bool IntersectionVisitor::rectangleRectangle(const RectangleCollider *r1,
323326bool IntersectionVisitor::rectanglePoint (const RectangleCollider *rect,
324327 const PointCollider *point) {
325328 if (rect->rotation == 0 .0f ) {
326- return point->x >= rect->x && point->x <= rect->x + rect->width &&
327- point->y >= rect->y && point->y <= rect->y + rect->height ;
329+ return point->x >= rect->x &&
330+ point->x <= rect->x + rect->scaledWidth () &&
331+ point->y >= rect->y &&
332+ point->y <= rect->y + rect->scaledHeight ();
328333 }
329334 auto corners = rect->getCorners ();
330335 return CollisionMath::pointInPolygon (point->x , point->y , corners);
0 commit comments