Example #1
0
    def srodek_masy(self):
        srodek_masy = Wektor(0.0, 0.0, 0.0)
        for i in range(self.ilosc):
            srodek_masy += self.punkty[i].polozenie

        srodek_masy /= self.ilosc
        return srodek_masy
Example #2
0
 def przygotuj_ruch_verlet(self, przyspieszenie=Wektor(), krok_czasowy=0.0):
     if self.numer_kroku == 0:
         self.przygotuj_ruch_euler(przyspieszenie, krok_czasowy)
     else:
         self.nastepne_polozenie = self.polozenie * 2.0 - self.poprzednie_polozenie + przyspieszenie * krok_czasowy**2
         self.nastepna_predkosc = (self.nastepne_polozenie -
                                   self.poprzednie_polozenie) / (
                                       2.0 * krok_czasowy)
Example #3
0
    def obsluz_klawiature(self):
        if scene.kb.keys:
            s = scene.kb.getkey()  # get keyboard info
            zpm = self.zpms[0]
            zmiana_polozenia = 0.1
            if s == 'e':
                self.trzymany_punkt.polozenie += Wektor(0, zmiana_polozenia, 0)
            if s == 'q':
                self.trzymany_punkt.polozenie += Wektor(
                    0, -zmiana_polozenia, 0)
            if s == 'a':
                self.trzymany_punkt.polozenie += Wektor(
                    -zmiana_polozenia, 0, 0)
            if s == 'd':
                self.trzymany_punkt.polozenie += Wektor(zmiana_polozenia, 0, 0)
            if s == 'w':
                self.trzymany_punkt.polozenie += Wektor(
                    0, 0, -zmiana_polozenia)
            if s == 's':
                self.trzymany_punkt.polozenie += Wektor(0, 0, zmiana_polozenia)
            if s == 'x':
                # skok
                self.trzymany_punkt.predkosc += Wektor(0, -200, 0)
            if s == 'm':
                zpm.ustaw_wiezy(self.trzymany_punkt.indeks,
                                not zpm.wiezy[self.trzymany_punkt.indeks])

            nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
            if s in nums:
                print(s)
                #zpm.ustaw_wiezy(int(s), not zpm.wiezy[int(s)])
                self.trzymany_punkt = zpm.pobierz_punkt_materialny(int(s))
                self.trzymany_punkt.indeks = int(s)
        pass
Example #4
0
    def zeruj_predkosc_srednia(self):
        ilosc_z_wiezami = 0
        predkosc_srednia = Wektor(0.0, 0.0, 0.0)
        for i in range(self.ilosc):
            if self.wiezy[i] is False:
                predkosc_srednia += self.pobierz_punkt_materialny(i).predkosc
            else:
                ilosc_z_wiezami += 1

        predkosc_srednia /= (self.ilosc - ilosc_z_wiezami)
Example #5
0
    def przygotuj_ruch(self,
                       sila=Wektor(),
                       krok_czasowy=0.0,
                       algorytm=Algorytm.EULER):

        przyspieszenie = sila / self.masa

        if algorytm == Algorytm.EULER:
            self.przygotuj_ruch_euler(przyspieszenie, krok_czasowy)
        elif algorytm == Algorytm.VERLET:
            self.przygotuj_ruch_verlet(przyspieszenie, krok_czasowy)
Example #6
0
    def __init__(self,
                 polozenie=Wektor(),
                 predkosc=Wektor(),
                 masa=1.0,
                 promien=0.1,
                 kolor=Kolor()):

        self.polozenie = polozenie
        self.predkosc = predkosc
        self.poprzednie_polozenie = Wektor()
        self.nastepne_polozenie = Wektor()
        self.nastepna_predkosc = Wektor()
        self.masa = masa
        self.promien = promien
        self.kolor = kolor

        self.sphere = sphere(
            radius=self.promien,
            pos=[self.polozenie.x, self.polozenie.y, self.polozenie.z],
            color=[self.kolor.r, self.kolor.g, self.kolor.b])

        self.do_usuniecia = False
Example #7
0
    def przygotuj_ruch_przy_kontakcie_z_obszarem_zabronionym(
            self, indeks, krok_czasowy):
        if self.obszar_zabroniony is None:
            return

        punkt = self.pobierz_punkt_materialny(indeks)
        normalna = Wektor()

        # Zakladamy, ze nastepne polozenie jest juz obliczone
        w_obszarze_zabronionym, normalna = self.obszar_zabroniony.czy_w_obszarze_zabronionym(
            punkt.nastepne_polozenie, punkt.polozenie, punkt.promien, normalna)

        if w_obszarze_zabronionym:
            # Eliminacja skladowej normalnej sily
            sila = self.sila(indeks)
            skladowa_normalna_sily = normalna * sila
            if skladowa_normalna_sily < 0:  # usuwanie skladowej sily skierowanej do powierzchni
                sila -= normalna * skladowa_normalna_sily  # dzialanie sily kontaktowej

            # uwzglednienie odbicia (zmiana aktualnego wektora predkosci)
            predkosc = punkt.predkosc
            skladowa_normalna_predkosci = normalna * predkosc
            if skladowa_normalna_predkosci < 0:  # usuwanie skladowej predkosci skierowanej do powierzchni
                predkosc -= normalna * (
                    (self.obszar_zabroniony.wspolczynnik_odbicia + 1) *
                    skladowa_normalna_predkosci)

            punkt.ustaw_predkosc(predkosc)

            #tarcie
            if skladowa_normalna_sily < 0 and predkosc.dlugosc() > 0:
                tarcie = predkosc * -1
                tarcie.normuj()
                tarcie *= math.fabs(
                    self.obszar_zabroniony.wspolczynnik_tarcia *
                    skladowa_normalna_sily)
                sila += tarcie

            # ponowne przygotowanie ruchu z nowymi sila i predkoscia
            # musi byc metoda Eulera, bo ta widzi zmiane predkosci
            punkt.przygotuj_ruch(sila, krok_czasowy, algorytm=Algorytm.EULER)
Example #8
0
 def ustaw_wiezy(self, indeks, ustalona_pozycja):
     if indeks >= 0 and indeks < self.ilosc:
         self.wiezy[indeks] = ustalona_pozycja
         self.punkty[indeks].ustaw_predkosc(Wektor(0, 0, 0))
Example #9
0
 def ustaw_predkosc(self, predkosc=Wektor()):
     self.predkosc = predkosc
Example #10
0
 def ustaw_polozenie(self, polozenie=Wektor()):
     self.polozenie = polozenie
Example #11
0
 def sila(self, i):
     return Wektor()
Example #12
0
 def przygotuj_ruch_euler(self, przyspieszenie=Wektor(), krok_czasowy=0.0):
     self.nastepna_predkosc = self.predkosc + przyspieszenie * krok_czasowy
     self.nastepne_polozenie = self.polozenie + self.nastepna_predkosc * krok_czasowy