//Called to update N, Tn, Ta, Tb and the the bounding box. func (segment *SegmentShape) update(xf transform.Transform) 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{ min, max, } }
// Sets the vertices offset by the offset and calculates the PolygonAxes. func (poly *PolygonShape) SetVerts(verts Vertices, offset vect.Vect) { if verts == nil { log.Printf("Error: no vertices passed!") return } if verts.ValidatePolygon() == false { log.Printf("Warning: vertices not valid") } numVerts := len(verts) oldnumVerts := len(poly.Verts) poly.NumVerts = numVerts if oldnumVerts < numVerts { //create new slices poly.Verts = make(Vertices, numVerts) poly.TVerts = make(Vertices, numVerts) poly.Axes = make([]PolygonAxis, numVerts) poly.TAxes = make([]PolygonAxis, numVerts) } else { //reuse old slices poly.Verts = poly.Verts[:numVerts] poly.TVerts = poly.TVerts[:numVerts] poly.Axes = poly.Axes[:numVerts] poly.TAxes = poly.TAxes[:numVerts] } for i := 0; i < numVerts; i++ { a := vect.Add(offset, verts[i]) b := vect.Add(offset, verts[(i+1)%numVerts]) n := vect.Normalize(vect.Perp(vect.Sub(b, a))) poly.Verts[i] = a poly.Axes[i].N = n poly.Axes[i].D = vect.Dot(n, a) } }