Example #1
0
 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);
        }