public ParticleType(IParticle p, Point3d emittionPt, Vector3d initialVelocity, AbstractEnvironmentType environment) : this(p.Up, p.Acceleration3D, p.Lifespan, p.Mass, p.BodySize, p.HistoryLength) { Environment = environment; Position3D = emittionPt; Position = Environment.MapTo2D(emittionPt); Velocity3D = initialVelocity; Velocity = MapTo2D(Velocity3D); Acceleration = MapTo2D(Acceleration3D); Orientation = SetOrientation(); Position3DHistory = new PositionHistoryAsCircularArray(HistoryLength); //Position3DHistory = new PositionHistoryAsDataTree(HistoryLength); Position3DHistory.Add(Position3D, false); }
protected override Vector3d CalculateDesiredVelocity() { Vector3d nrml = environment.ClosestNormal(particle.Position3D); Vector3d drainVec = Vector3d.CrossProduct(nrml, Vector3d.ZAxis); drainVec.Unitize(); drainVec.Transform(Transform.Rotation(Math.PI * angle, nrml, particle.Position3D)); drainVec = drainVec * stepDistance; if (environment.GetType() == typeof(SurfaceEnvironmentType)) { Point3d pt2D = particle.Position3D; pt2D.Transform(Transform.Translation(drainVec)); pt2D = environment.MapTo2D(pt2D); drainVec = Util.Vector.Vector2Point(particle.Position, pt2D); } return(drainVec); }