Find the Opposite Side of a CircleCollider2D

Hi there,

I’m trying to find the ‘exit’ point of a Physics2D.Raycast through a CircleCollider2D:

Raycast Exit Point Diagram

So right now I’m trying to calculate the angle to the center from hit.point, and then reflect than back out to the exit, but it’s bearing no fruit.

Here’s what I’ve got currently, any help is thoroughly appreciated!

public void HandleCircleHit(RaycastHit2D hit, Vector2 direction) {
    Vector2 directionToCenter = hit.collider.transform.position - (Vector3)hit.point;
    float angle = Vector2.Angle(direction, directionToCenter);
    Vector3 cross = Vector3.Cross(direction, directionToCenter);
    angle *= cross.z < 0 ? 1 : -1;

    float centerAngle = 180 - Mathf.Abs(angle + angle);
    float directionModifier = angle < 0 ? -1 : 1;

    Vector2 directionToOtherEdge = Quaternion.Euler(0, 0, centerAngle * directionModifier) * directionToCenter;
    Vector2 edgePosition = (Vector2)hit.collider.transform.position + (directionToOtherEdge.normalized * (hit.collider as CircleCollider2D).radius);

    Debug.DrawLine(hit.point, hit.collider.transform.position, Color.red, 3f);
    Debug.DrawLine(hit.collider.transform.position, edgePosition, Color.red, 3f);
}

I’ve solved this using the code below, though I’m interested to know if there’s an existing way to do this!

/// <summary>Returns the point on <paramref name="circleCollider"/> where a line travelling in <paramref name="direction"/> through <paramref name="entryPoint"/> will exit.</summary>
public static Vector2 GetRayExitThroughCircle(CircleCollider2D circleCollider, Vector2 entryPoint, Vector2 direction) {
    Vector2 colliderCenter = circleCollider.transform.position;
    Vector2 directionToCenter = colliderCenter - entryPoint;

    float angleTowardsCenter = Vector2.Angle(direction, directionToCenter);
    float angleTowardsExitPoint = 180 - (angleTowardsCenter + angleTowardsCenter); // Angles inside a triangle add to 180

    if (Vector3.Cross(direction, directionToCenter).z < 0) {
        angleTowardsExitPoint *= -1;
    }

    Vector2 directionToExitPoint = Quaternion.Euler(0, 0, angleTowardsExitPoint) * directionToCenter;
    Vector2 exitPoint = colliderCenter + (-directionToExitPoint.normalized * circleCollider.radius);

    return exitPoint;
}