// Calculates the transformed vertices and axes and the bounding box. func (poly *PolygonShape) update(xf transform.Transform) 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 } /* fmt.Println("") fmt.Println("Started Axes") fmt.Println(xf.Rotation, xf.Position) for i:=0;i<poly.NumVerts;i++ { fmt.Println(src[i], dst[i]) } */ } //transform verts { inf := vect.Float(math.Inf(1)) 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 = vect.FMin(aabb.Lower.X, v.X) aabb.Upper.X = vect.FMax(aabb.Upper.X, v.X) aabb.Lower.Y = vect.FMin(aabb.Lower.Y, v.Y) aabb.Upper.Y = vect.FMax(aabb.Upper.Y, v.Y) } /* fmt.Println("Verts") for i:=0;i<poly.NumVerts;i++ { fmt.Println(src[i], dst[i]) } */ return aabb } }
func (arb *Arbiter) preStep2(inv_dt, slop, bias vect.Float) { a := arb.ShapeA.Body b := arb.ShapeB.Body for i := 0; i < arb.NumContacts; i++ { con := arb.Contacts[i] // Calculate the offsets. con.r1 = vect.Sub(con.p, a.p) con.r2 = vect.Sub(con.p, b.p) //con.Normal = vect.Vect{-1,0} // Calculate the mass normal and mass tangent. con.nMass = 1.0 / k_scalar(a, b, con.r1, con.r2, con.n) con.tMass = 1.0 / k_scalar(a, b, con.r1, con.r2, vect.Perp(con.n)) // Calculate the target bias velocity. con.bias = -bias * inv_dt * vect.FMin(0.0, con.dist+slop) con.jBias = 0.0 //con.jtAcc = 0 //con.jnAcc = 0 //fmt.Println("con.dist", con.dist) // Calculate the target bounce velocity. con.bounce = normal_relative_velocity(a, b, con.r1, con.r2, con.n) * arb.e } }
func (poly *PolygonShape) ValueOnAxis(n vect.Vect, d vect.Float) vect.Float { verts := poly.TVerts min := vect.Dot(n, verts[0]) for i := 1; i < poly.NumVerts; i++ { min = vect.FMin(min, vect.Dot(n, verts[i])) } return min - d }
func (tree *BBTree) GetBB(obj Indexable) AABB { v, ok := obj.Velocity() if ok { bb := obj.AABB() coef := vect.Float(0.1) l := bb.Lower.X b := bb.Lower.Y r := bb.Upper.X t := bb.Upper.Y x := (r - l) * coef y := (t - b) * coef v = vect.Mult(v, 0.1) return NewAABB(l+vect.FMin(-x, v.X), b+vect.FMin(-y, v.Y), r+vect.FMax(x, v.X), t+vect.FMax(y, v.Y)) } return obj.AABB() }
func segValueOnAxis(seg *SegmentShape, n vect.Vect, d vect.Float) vect.Float { a := vect.Dot(n, seg.Ta) - seg.Radius b := vect.Dot(n, seg.Tb) - seg.Radius return vect.FMin(a, b) - d }
func MergedAreaPtr(a, b *AABB) vect.Float { return (vect.FMax(a.Upper.X, b.Upper.X) - vect.FMin(a.Lower.X, b.Lower.X)) * (vect.FMax(a.Upper.Y, b.Upper.Y) - vect.FMin(a.Lower.Y, b.Lower.Y)) }