using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Annulus; using Azimuth; using Slipstream.IdealFluid; namespace Slipstream.Testbed.Demos { public class TranslatingSquare : Demo { public Scalar cycleCount = 0; public AbstractBoundaryBody _body; public override void Start(FluidWorld world) { var square = new SimplePolygon(new Vector[] { new Vector(-15, -15), new Vector(-15, 15), new Vector(15, 15), new Vector(15, -15), }); _body = new IdealFluidBoundaryBody(square, Vector.Zero, 0.0, 40); world.AddBoundary(_body); Random rand = new Random(1); for (int i = 0; i < 1000; ++i) { world.AddTracerParticle(new Vector(2 * rand.NextDouble() - 1, 2 * rand.NextDouble() - 1) * 100); } } public override void Update(FluidWorld world) { cycleCount += 1.0 / 60.0; Scalar period = 10; Scalar angularVelocity = (1.0 / period) * (2 * Math.PI); var newPos = new Vector(100 * Math.Cos(angularVelocity * cycleCount), 0); var velocity = new Vector(100 * angularVelocity * -Math.Sin(angularVelocity * cycleCount), 0); _body.Position = newPos; _body.LinearVelocity = velocity; _body.Orientation = 0; _body.AngularVelocity = 0; { Scalar totalEnergyCount; // world.IntegrateVortonMotion(1.0 / 60.0); world.EnforceBoundaryConditions(); world.IntegrateTracerParticles(1.0 / 60.0, out totalEnergyCount); foreach (var bb in world.Boundaries) { var boundaryBody = bb as IdealFluid.IdealFluidBoundaryBody; boundaryBody._group.CalculatePressureAtControlPoints(); Vector netForce; Scalar netTorque; boundaryBody.CalculatePressureForces(1.0, out netForce, out netTorque); System.Console.WriteLine(netForce / 10000 + " " + netTorque); } } } public override void Reset(FluidWorld world) { cycleCount = 0; } } }