// Recalculates the global center of the circle and the the bounding box. func (circle *CircleShape) update(xf transform.Transform) aabb.AABB { //global center of the circle center := xf.TransformVect(circle.Position) circle.Tc = center rv := vect.Vect{circle.Radius, circle.Radius} return aabb.AABB{ vect.Sub(center, rv), vect.Add(center, rv), } }
//Called to update N, Tn, Ta, Tb and the the bounding box. func (segment *SegmentShape) update(xf transform.Transform) aabb.AABB { a := xf.TransformVect(segment.A) b := xf.TransformVect(segment.B) segment.Ta = a segment.Tb = b segment.N = vect.Perp(vect.Normalize(vect.Sub(segment.B, segment.A))) segment.Tn = xf.RotateVect(segment.N) rv := vect.Vect{segment.Radius, segment.Radius} min := vect.Min(a, b) min.Sub(rv) max := vect.Max(a, b) max.Add(rv) return aabb.AABB{ min, max, } }
// Calculates the transformed vertices and axes and the bounding box. func (poly *PolygonShape) update(xf transform.Transform) aabb.AABB { //transform axes { src := poly.Axes dst := poly.TAxes for i := 0; i < poly.NumVerts; i++ { n := xf.RotateVect(src[i].N) dst[i].N = n dst[i].D = vect.Dot(xf.Position, n) + src[i].D } } //transform verts { inf := math.Inf(1) aabb := aabb.AABB{ Lower: vect.Vect{inf, inf}, Upper: vect.Vect{-inf, -inf}, } src := poly.Verts dst := poly.TVerts for i := 0; i < poly.NumVerts; i++ { v := xf.TransformVect(src[i]) dst[i] = v aabb.Lower.X = math.Min(aabb.Lower.X, v.X) aabb.Upper.X = math.Max(aabb.Upper.X, v.X) aabb.Lower.Y = math.Min(aabb.Lower.Y, v.Y) aabb.Upper.Y = math.Max(aabb.Upper.Y, v.Y) } return aabb } }
func DrawTransform(xf *transform.Transform, radius float64) { DrawCircle(xf.Position, radius, false) p := xf.RotateVect(vect.Vect{0, -radius}) p.Add(xf.Position) DrawLine(xf.Position, p) }