package com.igorcrevar.rolloverchuck.utils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; public class CollisionHelper { private static Vector2 segmentV = new Vector2(); private static Vector2 ptV = new Vector2(); private static Vector2 tmpV2 = new Vector2(); private static Vector2 closestPointOnSegment(Vector2 segA, Vector2 segB, Vector2 circleCenter) { segmentV.set(segB).sub(segA); ptV.set(circleCenter).sub(segA); float segmentVLen = segmentV.len(); if (segmentVLen == 0f) { throw new IllegalArgumentException("segA == segB for closestPointOnSegment"); } Vector2 segVUnit = segmentV.scl(1 / segmentVLen); float proj = ptV.dot(segVUnit); if (proj <= 0f) { return segA; } if (proj >= segmentVLen) { return segB; } segVUnit.scl(proj).add(segA); return segVUnit; } public static boolean intersection(Vector2 segA, Vector2 segB, Vector3 circleCenter, float circleRadius) { tmpV2.set(circleCenter.x, circleCenter.z); return intersection(segA, segB, tmpV2, circleRadius); } public static boolean intersection(Vector2 segA, Vector2 segB, Vector2 circleCenter, float circleRadius) { Vector2 closest = closestPointOnSegment(segA, segB, circleCenter); tmpV2.set(circleCenter); // for god sake tmpV2.sub(closest); float len = tmpV2.len(); if (len > circleRadius) { return false; // no collision } if (len == 0) { return false; } return true; /*closest = closest_point_on_seg(seg_a, seg_b, circ_pos) dist_v = circ_pos - closest if dist_v.len() > circ_rad: return vec(0, 0) if dist_v.len() <= 0: raise ValueError, "Circle's center is exactly on segment" offset = dist_v / dist_v.len() * (circ_rad - dist_v.len()) return offset*/ } }