using System; using System.Collections.Generic; using UnityEngine; namespace ProceduralToolkit { /// /// Representation of a 2D circle /// [Serializable] public struct Circle2 : IEquatable, IFormattable { public Vector2 center; public float radius; /// /// Returns the perimeter of the circle /// public float perimeter => 2*Mathf.PI*radius; /// /// Returns the area of the circle /// public float area => Mathf.PI*radius*radius; public static Circle2 unit => new Circle2(Vector2.zero, 1); public Circle2(float radius) : this(Vector2.zero, radius) { } public Circle2(Vector2 center, float radius) { this.center = center; this.radius = radius; } /// /// Returns a point on the circle at the given /// /// Angle in degrees public Vector2 GetPoint(float angle) { return Geometry.PointOnCircle2(center, radius, angle); } /// /// Returns a list of evenly distributed points on the circle /// /// Number of points public List GetPoints(int count) { return Geometry.PointsOnCircle2(center, radius, count); } /// /// Returns true if the point intersects the circle /// public bool Contains(Vector2 point) { return Intersect.PointCircle(point, center, radius); } /// /// Linearly interpolates between two circles /// public static Circle2 Lerp(Circle2 a, Circle2 b, float t) { t = Mathf.Clamp01(t); return new Circle2(a.center + (b.center - a.center)*t, a.radius + (b.radius - a.radius)*t); } /// /// Linearly interpolates between two circles without clamping the interpolant /// public static Circle2 LerpUnclamped(Circle2 a, Circle2 b, float t) { return new Circle2(a.center + (b.center - a.center)*t, a.radius + (b.radius - a.radius)*t); } public static explicit operator Sphere(Circle2 circle) { return new Sphere((Vector3) circle.center, circle.radius); } public static explicit operator Circle3(Circle2 circle) { return new Circle3((Vector3) circle.center, Vector3.back, circle.radius); } public static Circle2 operator +(Circle2 circle, Vector2 vector) { return new Circle2(circle.center + vector, circle.radius); } public static Circle2 operator -(Circle2 circle, Vector2 vector) { return new Circle2(circle.center - vector, circle.radius); } public static bool operator ==(Circle2 a, Circle2 b) { return a.center == b.center && a.radius == b.radius; } public static bool operator !=(Circle2 a, Circle2 b) { return !(a == b); } public override int GetHashCode() { return center.GetHashCode() ^ (radius.GetHashCode() << 2); } public override bool Equals(object other) { return other is Circle2 && Equals((Circle2) other); } public bool Equals(Circle2 other) { return center.Equals(other.center) && radius.Equals(other.radius); } public override string ToString() { return string.Format("Circle2(center: {0}, radius: {1})", center, radius); } public string ToString(string format) { return string.Format("Circle2(center: {0}, radius: {1})", center.ToString(format), radius.ToString(format)); } public string ToString(string format, IFormatProvider formatProvider) { return string.Format("Circle2(center: {0}, radius: {1})", center.ToString(format, formatProvider), radius.ToString(format, formatProvider)); } } }