[linux-l] [OT] Gewichtete Wahrscheinlichkeit, Random

Olaf Radicke olaf_rad at gmx.de
So Feb 25 09:05:44 CET 2007


Am Sonntag, 25. Februar 2007 schrieb Roland Penzin:
[...]
> (ich weiss nicht,  ob die idee was bringt, also ..)

Ich habe mich jetzt für ein sehr stark vereinfachtes Model entschieden. Aber
im Resultat (für den Spieler) scheint das Verhalten sehr plausibel.

    /// <param name="_id">Mitglied- bzw. Boot-ID</param>
    /// <returns>Berechnet die Geschwindigkeit in Knoten</returns>
    public static int get_geschwindigkeit(string _id)
    {
        Double kraft_prozent = get_segelkraefte(_id);
        Double winkel_alpha = 90 - get_segelstellung(_id);
        Double vortrieb_prozent = 0.0f;

        vortrieb_prozent = kraft_prozent * (Math.Cos((winkel_alpha * Math.PI)/180));
	// Umrechnung in Knoten mit Auf und Abrundung.
        return Convert.ToInt32((20f/100f)*vortrieb_prozent);
    }

    /// <param name="_id">Mitglied- bzw. Boot-ID</param>
    /// <returns>Berechnet die Krängung in Grad</returns>
    public static int get_kraengung(string _id)
    {
        Double kraft_prozent = get_segelkraefte(_id);
	// Umrechnung in Grad mit Auf und Abrundung.
        return Convert.ToInt32((90f/100f)*kraft_prozent);
    }

    /// <param name="_id">Mitglied- bzw. Boot-ID</param>
    /// <returns>Berechnet die Kraft in Prozent, die auf das Segel wirkt.</returns>
    public static Double get_segelkraefte(string _id)
    {
        A23.MyConfig conf_class = new A23.MyConfig();
        // Wie viel Prozent des maximalen Wirkungsgrads
        Double wikungsgrad_prozent = 0.0f;
        // Fahrtrichtung des Bootes in Grad, Nord ist 0/360°.
        Double kurs_grad = get_kurs(conf_class.vorgangsbearbeiter_id);
        // Windrichtung in Grad, Nord ist 0/360°.
        Double windrichtung_grad = Weather.get_windrichtung();
        // Windstärke 0-12
        int windstaerke = Weather.get_windstaerke();
        // Segelstellung in Grad zur Fahrtrichtung, mitschiffs ist 0°
        int segelstellung_grad = get_segelstellung(conf_class.vorgangsbearbeiter_id);
        // In prozent
        int segelflaeche = get_segelflaeche(conf_class.vorgangsbearbeiter_id);
        // Winkel in dem der Wind auf das Segel trifft.
        Double windeinfallswinkel = 0.0f;
        // Die Kraft in Prozent, die auf Segel/Mast wirkt.
        Double kraft_prozent = 0.0f;

        if(kurs_grad > windrichtung_grad)
        {
            windeinfallswinkel = kurs_grad - windrichtung_grad;
        }
        if(windrichtung_grad > kurs_grad)
        {
            windeinfallswinkel =  windrichtung_grad - kurs_grad;
        }
        // Windeinfallswinkel, Wind kommt genau von Vorn.
        if(windrichtung_grad == kurs_grad)
        {
            windeinfallswinkel =  0.0f;
        }
        // Windeinfallswinkel, der Einfachheit halber wird nur 0°-180° gerechnet...
        if(windeinfallswinkel > 180)
        {
            windeinfallswinkel = 180 - (windeinfallswinkel - 180);
        }
        // Die Segelöffnung verringert den Einfallswinkel.
        // Kommt der Wind von Vorn...
        if(windeinfallswinkel <= 90)
        {
            windeinfallswinkel = windeinfallswinkel - segelstellung_grad;
            // Wenn das Segel zu weit geöffnet ist, flattert es.
            // Der Wind wird also genau von Vorne kommen...
            if(windeinfallswinkel < 0) windeinfallswinkel = 0;
        }else
        {
            windeinfallswinkel = 90 - (windeinfallswinkel - 90);
            windeinfallswinkel = windeinfallswinkel + segelstellung_grad;
            // Wenn das Segel zu weit geöffnet ist, verringert sich der
            // Winkel wieder...
            if(windeinfallswinkel > 90)
            {
                windeinfallswinkel = 90 - (windeinfallswinkel - 90);
            }
        }
        if(windeinfallswinkel < 5)
        {
            // Das Segel flatter im Wind und hat 0 Wirkungsgrad.
            // Die Krängung ist null.
            return 0;
        }

        // Einfallswinkel in den Wirkungsgrad einbeziehen...
        wikungsgrad_prozent = 100f * (Math.Sin((windeinfallswinkel * Math.PI)/180));
        // Segelfläche einbeziehen...
        wikungsgrad_prozent = (wikungsgrad_prozent/100.0f)*segelflaeche;
        if(windstaerke == 0)
        {
            // Flaute. Wirkungsgrad hat keine Auswirkung.
            // Die Krängung ist null.
            return 0;
        }
        kraft_prozent = (wikungsgrad_prozent/12)*windstaerke;
        return kraft_prozent;
    }





Mehr Informationen über die Mailingliste linux-l