public static double WheelTurnForEndZeroWheelTurn(this PCar car, double finalAngle, double sign)
        {
            PCar physicCar = new PCar(car);
            int  ticks     = (int)Math.Abs(Math.Round(physicCar.WheelTurn / game.CarWheelTurnChangePerTick));

            physicCar.setWheelTurn(0);
            physicCar.Iteration(ticks);

            double angleDeviation = finalAngle.AngleDeviation(physicCar.Angle);

            if (sign < 0)
            {
                Vector v = Vector.sincos(finalAngle + Math.PI);
                double inverse90Angle = Math.Abs(v.X) > Math.Abs(v.Y) ?
                                        ((Math.Sign(v.X) - 1) * Math.PI / 2) :
                                        (Math.Sign(v.Y) * Math.PI / 2);

                if (Math.Abs(Math.Abs(v.X) - Math.Abs(v.Y)) < 1.0e-3)//45
                {
                    inverse90Angle = v.Angle;
                }

                double angleSub = inverse90Angle.AngleDeviation(physicCar.Angle);
                angleDeviation = finalAngle.AngleDeviation(physicCar.Angle + 2 * angleSub);
            }

            if (Math.Abs(angleDeviation) < game.CarRotationFrictionFactor)
            {
                return(0);
            }

            return(car.WheelTurn + game.CarWheelTurnChangePerTick * Math.Sign(angleDeviation));
        }
        public static PCar GetZeroWheelTurnCar(this PCar car)
        {
            PCar physicCar = new PCar(car);
            int  ticks     = (int)Math.Abs(Math.Round(physicCar.WheelTurn / game.CarWheelTurnChangePerTick));

            physicCar.setWheelTurn(0);
            physicCar.Iteration(ticks);

            return(physicCar);
        }
        public static double WheelTurnForEndZeroWheelTurn(this PCar car, Vector finalPos, double sign)
        {
            PCar physicCar = new PCar(car);
            int  ticks     = (int)Math.Abs(Math.Round(physicCar.WheelTurn / game.CarWheelTurnChangePerTick));

            physicCar.setWheelTurn(0);
            physicCar.Iteration(ticks);

            double finalAngle = (finalPos - car.Pos).Angle;

            return(car.WheelTurnForEndZeroWheelTurn(finalAngle, sign));
        }
Ejemplo n.º 4
0
        public void Iteration(PCar car, int iterationCount)
        {
            for (int i = 0; i < iterationCount; i++)
            {
                if (intersecOildStickEvent.Check(car))
                {
                    car.traveledOnOil(intersecOildStickEvent.InfoForCheck as OilSlick);
                }

                double speedSign = Math.Sign(car.Dir.Dot(car.Speed));
                double wheelTurn = car.WheelTurnForEndZeroWheelTurn(angle, speedSign);
                car.setWheelTurn(wheelTurn);

                car.Iteration(1);
            }
        }
Ejemplo n.º 5
0
        public void Iteration(PCar car, int iterationCount)
        {
            for (int i = 0; i < iterationCount; i++)
            {
                if (intersecOildStickEvent.Check(car))
                {
                    car.traveledOnOil(intersecOildStickEvent.InfoForCheck as OilSlick);
                }

                double speedSign = Math.Sign(car.Dir.Dot(car.Speed));
                if (double.IsNaN(finalAngle))
                {
                    car.WheelTurnForEndZeroWheelTurn(point, speedSign);
                }
                else
                {
                    car.setWheelTurn(car.WheelTurnForEndZeroWheelTurnToPoint(point, finalAngle, speedSign));
                }

                car.Iteration(1);
            }
        }
Ejemplo n.º 6
0
 public void Iteration(PCar car, int iterationCount)
 {
     car.Iteration(iterationCount);
 }