Skip to content

Commit

Permalink
Implement circle projection and fix circle mtv.
Browse files Browse the repository at this point in the history
  • Loading branch information
d3rped committed Sep 3, 2024
1 parent d608c38 commit dbf04db
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions shape.go
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,12 @@ func (cp *ConvexPolygon) calculateMTV(contactSet *ContactSet, otherShape IShape)
smallest = Vector{center.X - verts[0].X, center.Y - verts[0].Y}
smallest = smallest.Unit().Scale(smallest.Magnitude() - other.radius)

// If the direction from target to source points opposite to the separation, invert the separation vector
// and set its magnitude to the diameter minus the original magnitude
if cp.Center().Sub(other.position).Dot(smallest.Unit()) < 0 {
smallest = smallest.Unit().Scale(-other.radius * 2 + smallest.Magnitude())
}

}

delta.X = smallest.X
Expand Down Expand Up @@ -835,6 +841,21 @@ func (circle *Circle) Bounds() (Vector, Vector) {
return Vector{circle.position.X - circle.radius, circle.position.Y - circle.radius}, Vector{circle.position.X + circle.radius, circle.position.Y + circle.radius}
}

func (circle *Circle) Project(axis Vector) Projection {
axis = axis.Unit()
projectedCenter := axis.Dot(circle.position)
projectedRadius := axis.Magnitude() * circle.radius * circle.scale

min := projectedCenter - projectedRadius
max := projectedCenter + projectedRadius

if min > max {
min, max = max, min
}

return Projection{min, max}
}

// Intersection tests to see if a Circle intersects with the other given Shape. dx and dy are delta movement variables indicating
// movement to be applied before the intersection check (thereby allowing you to see if a Shape would collide with another if it
// were in a different relative location). If an Intersection is found, a ContactSet will be returned, giving information regarding
Expand Down

0 comments on commit dbf04db

Please sign in to comment.