Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private bool Contains(Circle circle1, Circle circle2, Vector2 point)
- {
- if (circle1.Contains(point) || circle2.Contains(point)) return true;
- float centerDistance = Vector2.Distance(circle1.Center, circle2.Center);
- float transformedRadius1 = circle1.Radius / centerDistance;
- float transformedRadius2 = circle2.Radius / centerDistance;
- float angle = (float)Math.Atan2(circle2.CenterX - circle1.CenterX, circle2.CenterY - circle1.CenterY);
- Vector2 transformedPoint = new Vector2(
- (float)((point.Y - circle1.CenterY) * Math.Sin(angle) + (point.X - circle1.CenterX) * Math.Cos(angle)) / centerDistance,
- (float)((point.Y - circle1.CenterY) * Math.Sin(angle) - (point.X - circle1.CenterX) * Math.Cos(angle)) / centerDistance);
- if (transformedRadius1 == transformedRadius2)
- return transformedPoint.X >= 0 && transformedPoint.X <= 1 && Math.Abs(transformedPoint.Y) <= transformedRadius1;
- float transformedRadiusDelta = transformedRadius1 - transformedRadius2;
- Debug.Assert(transformedRadiusDelta > 0 && transformedRadiusDelta < 1);
- if (transformedPoint.X < transformedRadius1 * transformedRadiusDelta
- || transformedPoint.X > 1 + transformedRadius2 * transformedRadiusDelta)
- return false;
- return transformedPoint.X * transformedRadiusDelta
- + Math.Abs(transformedPoint.Y) * Math.Sqrt(1 - transformedRadiusDelta * transformedRadiusDelta) <= transformedRadius1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement