Пример #1
0
 public Länge Y(Länge x)
 {
     return(Länge.FromMeter(
                Wurfparabel.Y(
                    x: x.Meter / Scale,
                    v0: AbsprungGeschwindigkeit.MeterProSekunde,
                    alpha: AbsprungWinkel.Rad,
                    y0: _absprungHöhe.Meter) * Scale));
 }
Пример #2
0
        public static Schanze Create(Länge höhe, Winkel absprungwinkel)
        {
            var radius = höhe.Meter / (1 - Math.Cos(absprungwinkel.Rad));
            var länge  = radius * Math.Sin(absprungwinkel.Rad);

            return(new Schanze(
                       länge: Länge.FromMeter(länge),
                       höhe: höhe,
                       absprungwinkel: absprungwinkel,
                       radius: Länge.FromMeter(radius),
                       scale: 1
                       ));
        }
Пример #3
0
        public static Flugbahn Create(
            Schanze schanze,
            Geschwindigkeit absprungGeschwindigkeit)
        {
            var weite = Wurfparabel.Weite(
                v0: absprungGeschwindigkeit.MeterProSekunde,
                y0: schanze.Höhe.Meter,
                alpha: schanze.Absprungwinkel.Rad);

            var scheitelpunktX = Wurfparabel.ScheitelpunktX(
                v0: absprungGeschwindigkeit.MeterProSekunde,
                y0: schanze.Höhe.Meter,
                alpha: schanze.Absprungwinkel.Rad
                );

            var höhe = Wurfparabel.ScheitelpunktY(
                v0: absprungGeschwindigkeit.MeterProSekunde,
                y0: schanze.Höhe.Meter,
                alpha: schanze.Absprungwinkel.Rad);

            var aufprallWinkel = Wurfparabel.AufprallWinkel(
                v0: absprungGeschwindigkeit.MeterProSekunde,
                y0: schanze.Höhe.Meter,
                alpha: schanze.Absprungwinkel.Rad
                );

            var aufprallGeschwindigkeit = Wurfparabel.AufprallGeschwindigkeit(
                v0: absprungGeschwindigkeit.MeterProSekunde,
                y0: schanze.Höhe.Meter,
                alpha: schanze.Absprungwinkel.Rad
                );

            return(new Flugbahn(
                       absprungHöhe: schanze.Höhe,
                       absprungWinkel: schanze.Absprungwinkel,
                       absprungGeschwindigkeit: absprungGeschwindigkeit,
                       sprungWeite: Länge.FromMeter(weite),
                       scheitelpunktX: Länge.FromMeter(scheitelpunktX),
                       scheitelpunktY: Länge.FromMeter(höhe),
                       aufprallWinkel: Winkel.FromRad(aufprallWinkel),
                       aufprallGeschwindigkeit: Geschwindigkeit.FromMeterProSekunde(aufprallGeschwindigkeit),
                       scale: 1));
        }
Пример #4
0
        public FlugbahnViewModel(Schanze schanze, Flugbahn flugbahn)
        {
            _flugbahn = flugbahn ?? throw new ArgumentNullException(nameof(flugbahn));

            var punkte   = new List <Point>();
            var segments = 100;
            var step     = (int)flugbahn.SprungWeite.Meter / segments;

            // Horizontaler Offset, wenn Schanze vorhanden
            var x0 = schanze?.Länge ?? Länge.Empty;

            // Absprungpunkt
            var x = Länge.Empty;
            var y = flugbahn.Y(x);

            StartPunkt = ToPoint(x0 + x, y);
            punkte.Add(StartPunkt);

            // Bahnpunkte
            for (int i = 1; i <= segments; i++)
            {
                x = Länge.FromMeter(i * step);
                y = flugbahn.Y(x);

                punkte.Add(ToPoint(x0 + x, y));
            }

            // Aufprallpunkt
            x = flugbahn.SprungWeite;
            y = flugbahn.Y(x);

            EndPunkt = ToPoint(x0 + x, y);
            punkte.Add(EndPunkt);

            Punkte = new PointCollection(punkte);

            Scheitelpunkt = ToPoint(x0 + flugbahn.ScheitelpunktX, flugbahn.ScheitelpunktY);

            var winkelSize     = flugbahn.Scale * 0.2;
            var tangentenLänge = flugbahn.Scale;
            // Absprung
            var m = Matrix.Identity;

            m.Rotate(flugbahn.AbsprungWinkel.Deg);

            var v = new Vector(tangentenLänge, 0);

            AbsprungTangentenKontrollpunkt1 = StartPunkt + v;
            AbsprungTangentenKontrollpunkt2 = StartPunkt + v * m;

            v = new Vector(winkelSize, 0);

            AbsprungWinkelPunkt1 = StartPunkt + v;
            AbsprungWinkelPunkt2 = StartPunkt + v * m;
            AbsprungWinkelSize   = new Size(winkelSize, winkelSize);

            // Aufprall
            m = Matrix.Identity;
            m.Rotate(-flugbahn.AufprallWinkel.Deg);

            v = new Vector(-tangentenLänge, 0);

            AufprallTangentenKontrollpunkt1 = EndPunkt + v;
            AufprallTangentenKontrollpunkt2 = EndPunkt + v * m;

            v = new Vector(-winkelSize, 0);

            AufprallWinkelPunkt1 = EndPunkt + v;
            AufprallWinkelPunkt2 = EndPunkt + v * m;
            AufprallWinkelSize   = new Size(winkelSize, winkelSize);
        }