Skip to content

Commit

Permalink
Clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
NoahStolk committed Sep 26, 2024
1 parent 8e2fbd6 commit 1bf4a5e
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 108 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace Detach.Demos.Collisions.Services.CollisionScenes;

public abstract class CollisionScene<T1, T2> : ICollisionScene
where T1 : struct
where T2 : struct
{
protected bool HasCollision { get; set; }

protected float TotalTime { get; private set; }

protected T1 A { get; set; }

protected T2 B { get; set; }

public virtual void Update(float dt)
{
TotalTime += dt;
}

public abstract void Render();
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,44 +5,40 @@

namespace Detach.Demos.Collisions.Services.CollisionScenes;

public sealed class PointInCircle : ICollisionScene
public sealed class PointInCircle : CollisionScene<Vector2, Circle>
{
private const float _pointOffset = 64;
private const float _circleOffset = 128;

private float _totalTime;
private Vector2 _point;
private Circle _circle;
private bool _collision;

public void Update(float dt)
public override void Update(float dt)
{
_totalTime += dt;
float doubleTime = _totalTime * 2;
base.Update(dt);

float doubleTime = TotalTime * 2;

_point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);
_circle = new Circle(
CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _circleOffset, MathF.Sin(_totalTime) * _circleOffset),
64 + MathF.Sin(_totalTime) * 32);
A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);
B = new Circle(
CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _circleOffset, MathF.Sin(TotalTime) * _circleOffset),
64 + MathF.Sin(TotalTime) * 32);

_collision = Geometry2D.PointInCircle(_point, _circle);
HasCollision = Geometry2D.PointInCircle(A, B);
}

public void Render()
public override void Render()
{
const uint textColor = 0xFFFFFFFF;
const uint backgroundColor = 0xFF000000;
uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF;
uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF;

Vector2 origin = ImGui.GetCursorScreenPos();

ImDrawListPtr drawList = ImGui.GetWindowDrawList();
drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor);
drawList.AddCircleFilled(origin + _point, 3, foregroundColor);
drawList.AddCircle(origin + _circle.Position, _circle.Radius, foregroundColor);
drawList.AddCircleFilled(origin + A, 3, foregroundColor);
drawList.AddCircle(origin + B.Position, B.Radius, foregroundColor);

drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}"));
drawList.AddText(origin + _circle.Position, textColor, Inline.Span($"Circle position: {_circle.Position.X:0.00} {_circle.Position.Y:0.00}"));
drawList.AddText(origin + _circle.Position + new Vector2(0, _circle.Radius), textColor, Inline.Span($"Circle radius: {_circle.Radius:0.00}"));
drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}"));
drawList.AddText(origin + B.Position, textColor, Inline.Span($"Circle position: {B.Position.X:0.00} {B.Position.Y:0.00}"));
drawList.AddText(origin + B.Position + new Vector2(0, B.Radius), textColor, Inline.Span($"Circle radius: {B.Radius:0.00}"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,48 +6,44 @@

namespace Detach.Demos.Collisions.Services.CollisionScenes;

public sealed class PointInOrientedRectangle : ICollisionScene
public sealed class PointInOrientedRectangle : CollisionScene<Vector2, OrientedRectangle>
{
private const float _pointOffset = 64;
private const float _rectangleOffset = 128;

private float _totalTime;
private Vector2 _point;
private OrientedRectangle _orientedRectangle;
private bool _collision;

public void Update(float dt)
public override void Update(float dt)
{
_totalTime += dt;
float doubleTime = _totalTime * 2;
base.Update(dt);

float doubleTime = TotalTime * 2;

_point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);
A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);

Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _rectangleOffset, MathF.Sin(_totalTime) * _rectangleOffset);
Vector2 halfExtents = new(64 + MathF.Sin(_totalTime) * 32, 32 + MathF.Cos(_totalTime) * 16);
float rotationInRadians = _totalTime * 1.5f;
_orientedRectangle = new OrientedRectangle(center, halfExtents, rotationInRadians);
Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _rectangleOffset, MathF.Sin(TotalTime) * _rectangleOffset);
Vector2 halfExtents = new(64 + MathF.Sin(TotalTime) * 32, 32 + MathF.Cos(TotalTime) * 16);
float rotationInRadians = TotalTime * 1.5f;
B = new OrientedRectangle(center, halfExtents, rotationInRadians);

_collision = Geometry2D.PointInOrientedRectangle(_point, _orientedRectangle);
HasCollision = Geometry2D.PointInOrientedRectangle(A, B);
}

public void Render()
public override void Render()
{
const uint textColor = 0xFFFFFFFF;
const uint backgroundColor = 0xFF000000;
uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF;
uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF;

Vector2 origin = ImGui.GetCursorScreenPos();

ImDrawListPtr drawList = ImGui.GetWindowDrawList();
drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor);
drawList.AddCircleFilled(origin + _point, 3, foregroundColor);
Buffer4<Vector2> vertices = _orientedRectangle.GetVertices();
drawList.AddCircleFilled(origin + A, 3, foregroundColor);
Buffer4<Vector2> vertices = B.GetVertices();
drawList.AddQuad(origin + vertices[0], origin + vertices[1], origin + vertices[2], origin + vertices[3], foregroundColor);

drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}"));
drawList.AddText(origin + _orientedRectangle.Center, textColor, Inline.Span($"Rectangle center: {_orientedRectangle.Center.X:0.00} {_orientedRectangle.Center.Y:0.00}"));
drawList.AddText(origin + _orientedRectangle.Center + _orientedRectangle.HalfExtents, textColor, Inline.Span($"Rectangle half extents: {_orientedRectangle.HalfExtents.X:0.00} {_orientedRectangle.HalfExtents.Y:0.00}"));
drawList.AddText(origin + _orientedRectangle.Center + _orientedRectangle.HalfExtents with { X = 0 }, textColor, Inline.Span($"Rectangle rotation: {_orientedRectangle.RotationInRadians:0.00}"));
drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}"));
drawList.AddText(origin + B.Center, textColor, Inline.Span($"Rectangle center: {B.Center.X:0.00} {B.Center.Y:0.00}"));
drawList.AddText(origin + B.Center + B.HalfExtents, textColor, Inline.Span($"Rectangle half extents: {B.HalfExtents.X:0.00} {B.HalfExtents.Y:0.00}"));
drawList.AddText(origin + B.Center + B.HalfExtents with { X = 0 }, textColor, Inline.Span($"Rectangle rotation: {B.RotationInRadians:0.00}"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,45 +5,41 @@

namespace Detach.Demos.Collisions.Services.CollisionScenes;

public sealed class PointInRectangle : ICollisionScene
public sealed class PointInRectangle : CollisionScene<Vector2, Rectangle>
{
private const float _pointOffset = 64;
private const float _rectangleOffset = 128;

private float _totalTime;
private Vector2 _point;
private Rectangle _rectangle;
private bool _collision;

public void Update(float dt)
public override void Update(float dt)
{
_totalTime += dt;
float doubleTime = _totalTime * 2;
base.Update(dt);

float doubleTime = TotalTime * 2;

_point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);
A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);

Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _rectangleOffset, MathF.Sin(_totalTime) * _rectangleOffset);
Vector2 size = new(160 + MathF.Sin(_totalTime) * 32);
_rectangle = Rectangle.FromCenter(center, size);
Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _rectangleOffset, MathF.Sin(TotalTime) * _rectangleOffset);
Vector2 size = new(160 + MathF.Sin(TotalTime) * 32);
B = Rectangle.FromCenter(center, size);

_collision = Geometry2D.PointInRectangle(_point, _rectangle);
HasCollision = Geometry2D.PointInRectangle(A, B);
}

public void Render()
public override void Render()
{
const uint textColor = 0xFFFFFFFF;
const uint backgroundColor = 0xFF000000;
uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF;
uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF;

Vector2 origin = ImGui.GetCursorScreenPos();

ImDrawListPtr drawList = ImGui.GetWindowDrawList();
drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor);
drawList.AddCircleFilled(origin + _point, 3, foregroundColor);
drawList.AddRect(origin + _rectangle.Position, origin + _rectangle.Position + _rectangle.Size, foregroundColor);
drawList.AddCircleFilled(origin + A, 3, foregroundColor);
drawList.AddRect(origin + B.Position, origin + B.Position + B.Size, foregroundColor);

drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}"));
drawList.AddText(origin + _rectangle.Position, textColor, Inline.Span($"Rectangle position: {_rectangle.Position.X:0.00} {_rectangle.Position.Y:0.00}"));
drawList.AddText(origin + _rectangle.Position + _rectangle.Size, textColor, Inline.Span($"Rectangle size: {_rectangle.Size.X:0.00} {_rectangle.Size.Y:0.00}"));
drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}"));
drawList.AddText(origin + B.Position, textColor, Inline.Span($"Rectangle position: {B.Position.X:0.00} {B.Position.Y:0.00}"));
drawList.AddText(origin + B.Position + B.Size, textColor, Inline.Span($"Rectangle size: {B.Size.X:0.00} {B.Size.Y:0.00}"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,48 +5,44 @@

namespace Detach.Demos.Collisions.Services.CollisionScenes;

public sealed class PointInTriangle : ICollisionScene
public sealed class PointInTriangle : CollisionScene<Vector2, Triangle2D>
{
private const float _pointOffset = 96;
private const float _triangleSize = 128;

private float _totalTime;
private Vector2 _point;
private Triangle2D _triangle;
private bool _collision;

public void Update(float dt)
public override void Update(float dt)
{
_totalTime += dt;
float doubleTime = _totalTime * 2;
base.Update(dt);

float doubleTime = TotalTime * 2;

_point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);
A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset);

Vector2 triangleOffset = new(48, 24);
Vector2 a = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(_totalTime) * _triangleSize, MathF.Sin(_totalTime) * _triangleSize);
Vector2 b = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(_totalTime + MathF.PI * 2 / 3) * _triangleSize, MathF.Sin(_totalTime + MathF.PI * 2 / 3) * _triangleSize);
Vector2 c = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(_totalTime + MathF.PI * 4 / 3) * _triangleSize, MathF.Sin(_totalTime + MathF.PI * 4 / 3) * _triangleSize);
_triangle = new Triangle2D(a, b, c);
Vector2 a = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(TotalTime) * _triangleSize, MathF.Sin(TotalTime) * _triangleSize);
Vector2 b = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(TotalTime + MathF.PI * 2 / 3) * _triangleSize, MathF.Sin(TotalTime + MathF.PI * 2 / 3) * _triangleSize);
Vector2 c = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(TotalTime + MathF.PI * 4 / 3) * _triangleSize, MathF.Sin(TotalTime + MathF.PI * 4 / 3) * _triangleSize);
B = new Triangle2D(a, b, c);

_collision = Geometry2D.PointInTriangle(_point, _triangle);
HasCollision = Geometry2D.PointInTriangle(A, B);
}

public void Render()
public override void Render()
{
const uint textColor = 0xFFFFFFFF;
const uint backgroundColor = 0xFF000000;
uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF;
uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF;

Vector2 origin = ImGui.GetCursorScreenPos();

ImDrawListPtr drawList = ImGui.GetWindowDrawList();
drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor);
drawList.AddCircleFilled(origin + _point, 3, foregroundColor);
drawList.AddTriangle(origin + _triangle.A, origin + _triangle.B, origin + _triangle.C, foregroundColor);
drawList.AddCircleFilled(origin + A, 3, foregroundColor);
drawList.AddTriangle(origin + B.A, origin + B.B, origin + B.C, foregroundColor);

drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}"));
drawList.AddText(origin + _triangle.A, textColor, Inline.Span($"Triangle A: {_triangle.A.X:0.00} {_triangle.A.Y:0.00}"));
drawList.AddText(origin + _triangle.B, textColor, Inline.Span($"Triangle B: {_triangle.B.X:0.00} {_triangle.B.Y:0.00}"));
drawList.AddText(origin + _triangle.C, textColor, Inline.Span($"Triangle C: {_triangle.C.X:0.00} {_triangle.C.Y:0.00}"));
drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}"));
drawList.AddText(origin + B.A, textColor, Inline.Span($"Triangle A: {B.A.X:0.00} {B.A.Y:0.00}"));
drawList.AddText(origin + B.B, textColor, Inline.Span($"Triangle B: {B.B.X:0.00} {B.B.Y:0.00}"));
drawList.AddText(origin + B.C, textColor, Inline.Span($"Triangle C: {B.C.X:0.00} {B.C.Y:0.00}"));
}
}
36 changes: 16 additions & 20 deletions src/Detach.Demos.Collisions/Services/CollisionScenes/PointOnLine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,45 +5,41 @@

namespace Detach.Demos.Collisions.Services.CollisionScenes;

public sealed class PointOnLine : ICollisionScene
public sealed class PointOnLine : CollisionScene<Vector2, LineSegment2D>
{
private const float _pointOffset = 64;
private const float _linePointOffset = 128;

private float _totalTime;
private Vector2 _point;
private LineSegment2D _line;
private bool _collision;

public void Update(float dt)
public override void Update(float dt)
{
_totalTime += dt;
_point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _pointOffset, MathF.Sin(_totalTime) * _pointOffset);
base.Update(dt);

A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _pointOffset, MathF.Sin(TotalTime) * _pointOffset);

float halfTime = _totalTime / 2;
float quarterTime = _totalTime / 4;
_line = new LineSegment2D(
float halfTime = TotalTime / 2;
float quarterTime = TotalTime / 4;
B = new LineSegment2D(
CollisionSceneConstants.Origin + new Vector2(MathF.Cos(halfTime) * _linePointOffset, MathF.Sin(halfTime) * _linePointOffset),
CollisionSceneConstants.Origin + new Vector2(MathF.Cos(quarterTime) * _linePointOffset, MathF.Sin(quarterTime) * _linePointOffset));

_collision = Geometry2D.PointOnLine(_point, _line, 1f);
HasCollision = Geometry2D.PointOnLine(A, B, 1f);
}

public void Render()
public override void Render()
{
const uint textColor = 0xFFFFFFFF;
const uint backgroundColor = 0xFF000000;
uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF;
uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF;

Vector2 origin = ImGui.GetCursorScreenPos();

ImDrawListPtr drawList = ImGui.GetWindowDrawList();
drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor);
drawList.AddCircleFilled(origin + _point, 3, foregroundColor);
drawList.AddLine(origin + _line.Start, origin + _line.End, foregroundColor);
drawList.AddCircleFilled(origin + A, 3, foregroundColor);
drawList.AddLine(origin + B.Start, origin + B.End, foregroundColor);

drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}"));
drawList.AddText(origin + _line.Start, textColor, Inline.Span($"Line start: {_line.Start.X:0.00} {_line.Start.Y:0.00}"));
drawList.AddText(origin + _line.End, textColor, Inline.Span($"Line end: {_line.End.X:0.00} {_line.End.Y:0.00}"));
drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}"));
drawList.AddText(origin + B.Start, textColor, Inline.Span($"Line start: {B.Start.X:0.00} {B.Start.Y:0.00}"));
drawList.AddText(origin + B.End, textColor, Inline.Span($"Line end: {B.End.X:0.00} {B.End.Y:0.00}"));
}
}

0 comments on commit 1bf4a5e

Please sign in to comment.