feat: Circle & Shape Projections
This commit is contained in:
parent
dfcc877e58
commit
f980546d37
|
@ -13,6 +13,12 @@ public record Circle(Vector2D Center, float Radius)
|
||||||
|
|
||||||
public static Circle Displace(Circle circle, Vector2D displaceVector) => new(circle.Center + displaceVector, circle.Radius);
|
public static Circle Displace(Circle circle, Vector2D displaceVector) => new(circle.Center + displaceVector, circle.Radius);
|
||||||
|
|
||||||
|
public static Projection Project(Circle circle, Vector2D projectionVector)
|
||||||
|
{
|
||||||
|
float projectedCenter = circle.Center.Dot(projectionVector);
|
||||||
|
return new(projectedCenter - circle.Radius, projectedCenter + circle.Radius);
|
||||||
|
}
|
||||||
|
|
||||||
public static Circle TransformCircle(ITransform transform, Circle circle)
|
public static Circle TransformCircle(ITransform transform, Circle circle)
|
||||||
=> new(transform.TransformVector2D(circle.Center), circle.Radius * transform.Scale.Magnitude);
|
=> new(transform.TransformVector2D(circle.Center), circle.Radius * transform.Scale.Magnitude);
|
||||||
|
|
||||||
|
@ -27,6 +33,8 @@ public static class CircleExtensions
|
||||||
|
|
||||||
public static Circle Displace(this Circle circle, Vector2D displaceVector) => Circle.Displace(circle, displaceVector);
|
public static Circle Displace(this Circle circle, Vector2D displaceVector) => Circle.Displace(circle, displaceVector);
|
||||||
|
|
||||||
|
public static Projection ToProjection(this Circle circle, Vector2D projectionVector) => Circle.Project(circle, projectionVector);
|
||||||
|
|
||||||
public static Circle TransformCircle(this ITransform transform, Circle circle) => Circle.TransformCircle(transform, circle);
|
public static Circle TransformCircle(this ITransform transform, Circle circle) => Circle.TransformCircle(transform, circle);
|
||||||
|
|
||||||
public static bool ApproximatelyEquals(this Circle left, Circle right) => Circle.ApproximatelyEquals(left, right);
|
public static bool ApproximatelyEquals(this Circle left, Circle right) => Circle.ApproximatelyEquals(left, right);
|
||||||
|
|
|
@ -53,6 +53,30 @@ public record Shape(IList<Vector2D> Vertices) : IEnumerable<Vector2D>
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void Project(Shape shape, Vector2D projectionVector, IList<float> list)
|
||||||
|
{
|
||||||
|
list.Clear();
|
||||||
|
|
||||||
|
int count = shape.Vertices.Count;
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
list.Add(projectionVector.Dot(shape[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Projection Project(Shape shape, Vector2D projectionVector)
|
||||||
|
{
|
||||||
|
float min = float.MaxValue;
|
||||||
|
float max = float.MinValue;
|
||||||
|
|
||||||
|
foreach (var vertex in shape)
|
||||||
|
{
|
||||||
|
float projectedLength = projectionVector.Dot(vertex);
|
||||||
|
min = Math.Min(projectedLength, min);
|
||||||
|
max = Math.Max(projectedLength, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new(min, max);
|
||||||
|
}
|
||||||
|
|
||||||
public static Shape TransformShape(Shape shape, ITransform transform)
|
public static Shape TransformShape(Shape shape, ITransform transform)
|
||||||
{
|
{
|
||||||
List<Vector2D> vertices = new(shape.Vertices.Count);
|
List<Vector2D> vertices = new(shape.Vertices.Count);
|
||||||
|
@ -96,6 +120,9 @@ public static class ShapeExtensions
|
||||||
public static void ToLines(this Shape shape, IList<Line> lines) => Shape.GetLines(shape, lines);
|
public static void ToLines(this Shape shape, IList<Line> lines) => Shape.GetLines(shape, lines);
|
||||||
public static List<Line> ToLines(this Shape shape) => Shape.GetLines(shape);
|
public static List<Line> ToLines(this Shape shape) => Shape.GetLines(shape);
|
||||||
|
|
||||||
|
public static void ToProjection(this Shape shape, Vector2D projectionVector, IList<float> list) => Shape.Project(shape, projectionVector, list);
|
||||||
|
public static Projection ToProjection(this Shape shape, Vector2D projectionVector) => Shape.Project(shape, projectionVector);
|
||||||
|
|
||||||
public static Shape TransformShape(this ITransform transform, Shape shape) => Shape.TransformShape(shape, transform);
|
public static Shape TransformShape(this ITransform transform, Shape shape) => Shape.TransformShape(shape, transform);
|
||||||
public static void TransformShape(this ITransform transform, Shape from, ref Shape to) => Shape.TransformShape(from, transform, ref to);
|
public static void TransformShape(this ITransform transform, Shape from, ref Shape to) => Shape.TransformShape(from, transform, ref to);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue