def __init__(self,
                 ilosc,
                 wspolczynnik_sprezystosci,
                 wspolczynnik_tlumienia=0.0,
                 wspolczynnik_tlumienia_oscylacji=0.0,
                 dlugosc=2.0):
        super(OscylatorySprzezone, self).__init__(ilosc)
        self.k = float(wspolczynnik_sprezystosci)
        self.l = float(dlugosc / float(ilosc - 1))
        # Jesli False - sprezyna. Odpycha sie gdy odleglosc < 1, przyciaga gdy wieksza
        # Jesli True - gumka, dziala tylko przyciaganie gdy odleglosc > 1
        self.sprezystoscTylkoPrzyRozciaganiu = False
        self.t = float(wspolczynnik_tlumienia)
        self.tt = float(wspolczynnik_tlumienia_oscylacji)

        for i in range(0, ilosc):
            punkt = self.pobierz_punkt_materialny(i)
            punkt.ustaw_polozenie(Wektor(-dlugosc / 2.0 + i * self.l, 0, 0))
            # punkt.ustaw_polozenie(Wektor(dlugosc*i, 0, 0))
            punkt.ustaw_predkosc(Wektor(0, 0, 0))
            punkt.ustaw_kolor(0, i / float(ilosc - 1), 1)

        self.pobierz_punkt_materialny(ilosc / 2).ustaw_predkosc(
            Wektor(0, 2.1, 0))
        self.zeruj_predkosc_srednia()
    def sila(self, indeks):
        sila = super(LinaOddzialywaniaZDalszymiSasiadami, self).sila(indeks)

        for n in range(2, self.ile_dodatkowych_oddzialywan + 2):
            sila_z_lewej = Wektor(0, 0, 0)
            sila_z_prawej = Wektor(0, 0, 0)

            if indeks >= n:
                od_lewego = self.pobierz_punkt_materialny(indeks).polozenie \
                            - self.pobierz_punkt_materialny(indeks - n).polozenie
                wychylenie = od_lewego.dlugosc() - n * self.l
                if not self.sprezystoscTylkoPrzyRozciaganiu or wychylenie > 0:
                    od_lewego.normuj()
                    sila_z_lewej = od_lewego * wychylenie * -self.k

            if indeks < self.liczba_punktow() - n:
                do_prawego = self.pobierz_punkt_materialny(indeks + n).polozenie \
                             - self.pobierz_punkt_materialny(indeks).polozenie
                wychylenie = do_prawego.dlugosc() - n * self.l
                if not self.sprezystoscTylkoPrzyRozciaganiu or wychylenie > 0:
                    do_prawego.normuj()
                    sila_z_prawej = do_prawego * wychylenie * self.k

        sila += sila_z_prawej
        sila += sila_z_lewej

        return sila
    def __init__(self, ilosc):
        super(PunktyUderzajaceWKule, self).__init__(ilosc)
        self.polozenie_x_min = -0.74
        self.polozenie_x_max = 0.74
        self.polozenie_y_min = 1.74
        self.polozenie_y_max = 2.74
        self.polozenie_z_min = -0.74
        self.polozenie_z_max = 0.74
        self.predkosc_x_min = 1.2
        self.predkosc_x_max = 2.4

        wspolczynnik_odbicia = 0.1
        wspolczynnik_tarcia = 0.2
        srodek = Wektor(2.5, 0, 0)
        promien = 1.0
        self.obszar_zabroniony = Kula(wspolczynnik_odbicia,
                                      wspolczynnik_tarcia, srodek, promien)

        for i in range(0, ilosc):
            polozenie_x = random.random() * (
                self.polozenie_x_max -
                self.polozenie_x_min) + self.polozenie_x_min
            polozenie_y = random.random() * (
                self.polozenie_y_max -
                self.polozenie_y_min) + self.polozenie_y_min
            polozenie_z = random.random() * (
                self.polozenie_z_max -
                self.polozenie_z_min) + self.polozenie_z_min
            predkosc_x = random.random() * (
                self.predkosc_x_max -
                self.predkosc_x_min) + self.predkosc_x_min
            punkt = self.pobierz_punkt_materialny(i)
            punkt.ustaw_polozenie(Wektor(polozenie_x, polozenie_y,
                                         polozenie_z))
            punkt.ustaw_predkosc(Wektor(predkosc_x, 0, 0))
    def stworz_nowa_iskre(self):
        iskra = PunktMaterialny()
        iskra.ustaw_promien(0.01)
        iskra.ustaw_kolor(0.9, 0.1, 0.1)
        iskra.ustaw_polozenie(Wektor(0, 0, 0))
        iskra.wiek = 0
        iskra.czas_zycia = random.random() * 3 + 1
        iskra.temperatura = random.random() * 600 + 400

        max_polozenie_na_boki = 0.3
        iskra.ustaw_polozenie(
            Wektor(
                random.random() * max_polozenie_na_boki -
                max_polozenie_na_boki / 2.0, 0,
                random.random() * max_polozenie_na_boki -
                max_polozenie_na_boki / 2.0))
        max_predkosc_na_boki = 0.6
        iskra.ustaw_predkosc(
            Wektor(
                random.random() * max_predkosc_na_boki -
                max_predkosc_na_boki / 2.0, 0.0,
                random.random() * max_predkosc_na_boki -
                max_predkosc_na_boki / 2.0))
        self.dodaj_punkt(iskra)
        return iskra
    def __init__(self, k=1.0):
        self.k = k
        super(Oscylator, self).__init__(1)

        punkt = self.pobierz_punkt_materialny(0)
        punkt.ustaw_polozenie(Wektor(-1, 0.5, 0))
        punkt.ustaw_predkosc(Wektor(1, 1, 0))
        punkt.ustaw_kolor(0, 0.5, 1)
        punkt.ustaw_promien(random.random() * 0.3)
    def __init__(self, ilosc, wspolczynnik_sprezystosci,
                 wspolczynnik_tlumienia, wpolczynnik_tlumienia_oscylacji,
                 wspolczynnik_sztywnosci, dlugosc):
        super(Lina, self).__init__(ilosc, wspolczynnik_sprezystosci,
                                   wspolczynnik_tlumienia,
                                   wpolczynnik_tlumienia_oscylacji,
                                   wspolczynnik_sztywnosci, dlugosc)

        self.g = Wektor(0, -9.81, 0)
        self.sprezystoscTylkoPrzyRozciaganiu = True
        for i in range(0, self.ilosc):
            punkt = self.pobierz_punkt_materialny(i)
            punkt.ustaw_predkosc(Wektor(0, 0, 0))

        self.ustaw_wiezy(0, True)
 def sila(self, i):
     p = self.pobierz_punkt_materialny(i)
     predkosc_przeplywu = Wektor(0, 0.9, 0)
     lepkosc = 3.9
     r = p.promien
     return (p.predkosc - predkosc_przeplywu) * (6 * 3.14 * lepkosc * r *
                                                 -1.0)
Exemple #8
0
def zbuduj_wlos(x=0.0,
                y=0.0,
                z=0.0,
                ilosc=10,
                sprezystosc=10,
                tlumienie=0.1,
                tlumienie_oscylacji=0.0,
                sztywnosc=100.0,
                dlugosc=10,
                grawitacja_y=-0.1):
    ilosc = int(ilosc)
    wspolczynnik_sprezystosci = float(sprezystosc)
    wspolczynnik_tlumienia = float(tlumienie)
    wspolczynnik_tlumienia_oscylacji = float(tlumienie_oscylacji)
    wspolczynnik_sztywnosci = float(sztywnosc)
    dlugosc = float(dlugosc)

    zpm = Wlos(ilosc, wspolczynnik_sprezystosci, wspolczynnik_tlumienia,
               wspolczynnik_tlumienia_oscylacji, wspolczynnik_sztywnosci,
               dlugosc)

    zpm.g.y = float(grawitacja_y)

    l = dlugosc / float(ilosc)  # odleglosc miedzy punktami
    # wlos, czy trawa, zacznie sie w punkcie 0,0,0 i idzie do gory pionowo, troche pod katem
    max_range = 0.5
    x_dir = max_range * random.random() - max_range / 2
    z_dir = max_range * random.random() - max_range / 2
    for i in range(0, zpm.ilosc):
        punkt = zpm.pobierz_punkt_materialny(i)
        polozenie = Wektor(x + x_dir * i, y + i * l, z + z_dir * i)
        punkt.ustaw_polozenie(polozenie)

    return zpm
 def __init__(self,
              wspolczynnik_odbicia,
              wspolczynnik_tarcia,
              srodek=Wektor(),
              promien=0.1):
     super(Kula, self).__init__(wspolczynnik_odbicia, wspolczynnik_tarcia)
     self.srodek = srodek
     self.promien = promien
    def czy_w_obszarze_zabronionym(self, polozenie, poprzednie_polozenie,
                                   margines, normalna):
        _minX = self.minX - margines
        _maxX = self.maxX + margines
        _minY = self.minY - margines
        _maxY = self.maxY + margines

        wynik = _minX < polozenie.x < _maxX and _minY < polozenie.y < _maxY

        if wynik and (not normalna is None):

            przemieszczenie = polozenie - poprzednie_polozenie
            if przemieszczenie.x != 0:
                normalna = Wektor(0, 0, 0)

                # prosta y=ax + b
                a = przemieszczenie.y / przemieszczenie.x
                b = polozenie.y - a * polozenie.x
                # przeciecie z lewa krawedzia
                y_minX = a * _minX + b
                if _minY <= y_minX < _maxY and poprzednie_polozenie.x < _minX:
                    normalna.x = -1

                # przeciecie z prawa krawedzia
                y_maxX = a * _maxX + b
                if _minY <= y_maxX <= _maxY and poprzednie_polozenie.x > _maxX:
                    normalna.x = 1

                # przeciecie z gorna krawedzia
                x_maxY = (_maxY - b) / a
                if _minX <= x_maxY <= _maxX and poprzednie_polozenie.y > _maxY:
                    normalna.y = 1

                # przeciecie z dolna krawedzia
                x_minY = (_minY - b) / a
                if _minX <= x_minY <= _maxX and poprzednie_polozenie.y < _minY:
                    normalna.y = -1
            else:
                if przemieszczenie.y > 0:
                    normalna = Wektor(0, -1, 0)
                else:
                    normalna = Wektor(0, 1, 0)

            return wynik, normalna

        return wynik
    def __init__(self):
        super(Iskry, self).__init__(1)

        self.WYMAGANY_CZAS = 1 / 30.0
        self.czas_do_stworzenia_nowej_iskry = self.WYMAGANY_CZAS  # raz na sekunde

        iskra = self.pobierz_punkt_materialny(0)
        iskra.ustaw_promien(0.05)
        iskra.ustaw_kolor(0.9, 0.3, 0.1)
        iskra.ustaw_polozenie(Wektor(0, 0, 0))
        iskra.wiek = 0
        iskra.czas_zycia = 0.001
        iskra.sphere.visible = False
        iskra.temperatura = random.random() * 600 + 400
        iskra.ustaw_predkosc(
            Wektor(random.random() * 0.4 - 0.2, 0.4,
                   random.random() * 0.4 - 0.2))
 def __init__(self,
              wspolczynnik_odbicia,
              wspolczynnik_tarcia,
              srodek=Wektor(),
              promien=0.1):
     super(WalecNieograniczonyWKierunkuZ,
           self).__init__(wspolczynnik_odbicia, wspolczynnik_tarcia)
     self.srodek = srodek
     self.promien = promien
    def czy_w_obszarze_zabronionym(self, polozenie, poprzednie_polozenie,
                                   margines, normalna):
        wynik = (polozenie.y + margines < self.poziom_y)

        if not normalna == None:
            normalna = Wektor(0, 1, 0)
            return wynik, normalna

        return wynik
    def __init__(self, k=1.0, ilosc_punktow=10):
        self.k = k

        super(Oscylatory, self).__init__(ilosc_punktow)

        for i in range(0, ilosc_punktow):
            punkt = self.pobierz_punkt_materialny(i)
            polozenie = Wektor(random.random() * 2.0 - 1,
                               random.random() * 2.0 - 1,
                               random.random() * 2.0 - 1)
            punkt.ustaw_polozenie(polozenie)

            predkosc = Wektor(random.random(), random.random(),
                              random.random())
            punkt.ustaw_predkosc(predkosc)

            punkt.ustaw_kolor(random.random(), random.random(),
                              random.random())
            punkt.ustaw_promien(random.random() * 0.3)
    def __init__(self,
                 nx,
                 ny,
                 wspolczynnik_sprezystosci,
                 wspolczynnik_tlumienia,
                 wspolczynnik_tlumienia_oscylacji,
                 wspolczynnik_sztywnosci,
                 przyspieszenie_ziemskie,
                 dlugosc_x,
                 dlugosc_y,
                 obszar_zabroniony=None):

        super(Siatka, self).__init__(nx * ny)
        self.co_ktory_sasiad = 1  # 1 - takze po przekatnych (8)
        # 2- tylko na siatce pion poziom(4)

        self.nx = nx
        self.ny = ny
        self.k = wspolczynnik_sprezystosci
        self.t = wspolczynnik_tlumienia
        self.tt = wspolczynnik_tlumienia_oscylacji
        self.s = wspolczynnik_sztywnosci
        self.lx = float(dlugosc_x) / (nx - 1)
        self.ly = float(dlugosc_y) / (ny - 1)
        self.g = przyspieszenie_ziemskie
        self.obszar_zabroniony = obszar_zabroniony
        self.sily_sztywnosci = []

        self.sprezystosc_tylko_przy_rozciaganiu = True

        for ix in range(0, nx):
            for iy in range(0, ny):
                i = ix + nx * iy
                self.sily_sztywnosci.append(Wektor(0, 0, 0))
                punkt = self.pobierz_punkt_materialny(i)
                punkt.ustaw_polozenie(
                    Wektor(-dlugosc_x / 2 + ix * self.lx,
                           -dlugosc_y / 2 + iy * self.ly, 0))
                punkt.ustaw_predkosc(Wektor(0, 0, 0))
                punkt.ustaw_kolor(1, ix / (nx - 1), iy / (ny - 1))

        self.zeruj_predkosc_srednia()
    def __init__(self, ilosc, wspolczynnik_sprezystosci,
                 wspolczynnik_tlumienia, wspolczynnik_tlumienia_oscylacji,
                 wspolczynnik_sztywnosci, dlugosc):
        super(UsztywnioneOscylatorySprzezone,
              self).__init__(ilosc, wspolczynnik_sprezystosci,
                             wspolczynnik_tlumienia,
                             wspolczynnik_tlumienia_oscylacji, dlugosc)
        self.s = float(wspolczynnik_sztywnosci)
        self.sily_sztywnosci = []
        for i in range(0, ilosc):
            self.sily_sztywnosci.append(Wektor(0, 0, 0))

        wielkosc_sily = 0.3
        self.pobierz_punkt_materialny(0).ustaw_predkosc(
            Wektor(0, wielkosc_sily, 0))
        self.pobierz_punkt_materialny(
            (ilosc - 1) / 2).ustaw_predkosc(Wektor(0, -wielkosc_sily, 0))
        self.pobierz_punkt_materialny((ilosc - 1) / 2 + 1).ustaw_predkosc(
            Wektor(0, -wielkosc_sily, 0))
        self.pobierz_punkt_materialny(ilosc - 1).ustaw_predkosc(
            Wektor(0, wielkosc_sily, 0))
    def przed_krokiem_naprzod(self, krok_czasowy):
        super(Siatka, self).przed_krokiem_naprzod(krok_czasowy)
        for i in range(0, self.liczba_punktow()):
            self.sily_sztywnosci[i] = Wektor(0, 0, 0)

        if self.s == 0:
            return

        for ix in range(1, self.nx - 1):
            for iy in range(1, self.ny - 1):
                indeks = ix + self.nx * iy
                wektor_wypadkowy_sasiadow = Wektor(0, 0, 0)

                kierunek = 0
                while kierunek < 8:
                    nx_sasiada = ix + wersory_kierunkowe_2D[kierunek].x
                    ny_sasiada = iy + wersory_kierunkowe_2D[kierunek].y

                    if 0 <= nx_sasiada < self.nx and 0 <= ny_sasiada < self.ny:
                        do_sasiada = self.pobierz_punkt_materialny(
                            indeks + wersory_kierunkowe_2D[kierunek].x
                            + self.nx * wersory_kierunkowe_2D[kierunek].y).polozenie \
                                     - self.pobierz_punkt_materialny(indeks).polozenie
                        wektor_wypadkowy_sasiadow += do_sasiada

                    kierunek += self.co_ktory_sasiad

                wektor_wypadkowy_sasiadow /= (8.0 / self.co_ktory_sasiad)
                sila_sztywnosci = wektor_wypadkowy_sasiadow * self.s

                self.sily_sztywnosci[indeks] += sila_sztywnosci

                kierunek = 0
                while kierunek < 8:
                    self.sily_sztywnosci[indeks + wersory_kierunkowe_2D[kierunek].x
                                         + self.nx * wersory_kierunkowe_2D[kierunek].y] \
                        -= sila_sztywnosci / (8.0 / self.co_ktory_sasiad)

                    kierunek += self.co_ktory_sasiad
    def sila(self, indeks):
        Nx = self.nx
        Ny = self.nx
        nx = indeks % Nx
        ny = (indeks - nx) / Nx

        sila = Wektor(0, 0, 0)
        kierunek = 0
        while kierunek < 8:
            nx_sasiada = nx + WersoryKierunkowe.wersory_kierunkowe_2D[
                kierunek].x
            ny_sasiada = ny + WersoryKierunkowe.wersory_kierunkowe_2D[
                kierunek].y

            if 0 <= nx_sasiada < Nx and 0 <= ny_sasiada < Ny:
                doSasiada = self.pobierz_punkt_materialny(
                    indeks + WersoryKierunkowe.wersory_kierunkowe_2D[kierunek].x + Nx
                    * WersoryKierunkowe.wersory_kierunkowe_2D[kierunek].y).polozenie \
                            - self.pobierz_punkt_materialny(indeks).polozenie

                odlegloscSpoczynkowa = sqrt(
                    (WersoryKierunkowe.wersory_kierunkowe_2D[kierunek].x *
                     self.lx)**2 +
                    (WersoryKierunkowe.wersory_kierunkowe_2D[kierunek].y *
                     self.ly)**2)

                wychylenie = doSasiada.dlugosc() - odlegloscSpoczynkowa

                if not self.sprezystosc_tylko_przy_rozciaganiu or wychylenie > 0:
                    doSasiada.normuj()
                    sila += doSasiada * (self.k * wychylenie)

                    roznica_predkosci = self.pobierz_punkt_materialny(
                        indeks + WersoryKierunkowe.wersory_kierunkowe_2D[kierunek].x + Nx
                        * WersoryKierunkowe.wersory_kierunkowe_2D[kierunek].y).predkosc \
                                        - self.pobierz_punkt_materialny(indeks).predkosc

                    sila += doSasiada * (doSasiada *
                                         roznica_predkosci) * self.tt
            kierunek += self.co_ktory_sasiad

        if self.t != 0:
            sila -= self.pobierz_punkt_materialny(
                indeks).predkosc * self.t  # tlumienie

        if self.s != 0:
            sila += self.sily_sztywnosci[indeks]

        sila += self.g * self.pobierz_punkt_materialny(indeks).masa

        return sila
    def sila(self, indeks):
        sila_z_lewej = Wektor(0, 0, 0)
        sila_z_prawej = Wektor(0, 0, 0)

        if indeks > 0:
            do_lewego = self.pobierz_punkt_materialny(indeks - 1).polozenie \
                        - self.pobierz_punkt_materialny(indeks).polozenie

            wychylenie = do_lewego.dlugosc() - self.l
            if not self.sprezystoscTylkoPrzyRozciaganiu or wychylenie > 0:
                do_lewego.normuj()
                sila_z_lewej = do_lewego * self.k * wychylenie
                roznica_predkosci = self.pobierz_punkt_materialny(indeks - 1).predkosc \
                                    - self.pobierz_punkt_materialny(indeks).predkosc
                sila_z_lewej += do_lewego * (do_lewego *
                                             roznica_predkosci) * self.tt

        if indeks < self.liczba_punktow() - 1:
            do_prawego = self.pobierz_punkt_materialny(indeks + 1).polozenie \
                         - self.pobierz_punkt_materialny(indeks).polozenie
            wychylenie = do_prawego.dlugosc() - self.l

            if not self.sprezystoscTylkoPrzyRozciaganiu or wychylenie > 0:
                do_prawego.normuj()
                sila_z_prawej = do_prawego * self.k * wychylenie
                roznica_predkosci = self.pobierz_punkt_materialny(
                    indeks + 1).predkosc - self.pobierz_punkt_materialny(
                        indeks).predkosc
                sila_z_prawej += do_prawego * (do_prawego *
                                               roznica_predkosci) * self.tt

        sila = sila_z_lewej + sila_z_prawej
        if self.t != 0:
            sila -= self.pobierz_punkt_materialny(indeks).predkosc * (self.t *
                                                                      2.0)

        return sila
    def __init__(self, ilosc, wspolczynnik_sprezystosci,
                 wspolczynnik_tlumienia, wpolczynnik_tlumienia_oscylacji,
                 wspolczynnik_sztywnosci, dlugosc):
        super(LinaZWalcemNieograniczonymWKierunkuZ,
              self).__init__(ilosc, wspolczynnik_sprezystosci,
                             wspolczynnik_tlumienia,
                             wpolczynnik_tlumienia_oscylacji,
                             wspolczynnik_sztywnosci, dlugosc)

        wspolczynnik_tarcia = 0.1
        wspolczynnik_odbicia = 0.1
        srodek_walca = Wektor(0.1, -3, -3)
        promien = 1.0
        self.obszar_zabroniony = WalecNieograniczonyWKierunkuZ(
            wspolczynnik_tarcia, wspolczynnik_odbicia, srodek_walca, promien)
        self.ustaw_wiezy(0, false)
    def przed_krokiem_naprzod(self, krok_czasowy):
        super(UsztywnioneOscylatorySprzezone,
              self).przed_krokiem_naprzod(krok_czasowy)
        for i in range(0, self.liczba_punktow()):
            self.sily_sztywnosci[i] = Wektor(0, 0, 0)
            if self.s == 0:
                return

        for i in range(1, self.liczba_punktow() - 1):
            do_lewego = self.pobierz_punkt_materialny(
                i - 1).polozenie - self.pobierz_punkt_materialny(i).polozenie
            do_prawego = self.pobierz_punkt_materialny(
                i + 1).polozenie - self.pobierz_punkt_materialny(i).polozenie
            sila_sztywnosci = (do_lewego + do_prawego) * (self.s / 2.0)
            self.sily_sztywnosci[i] += sila_sztywnosci
            self.sily_sztywnosci[i - 1] -= sila_sztywnosci / 2.0
            self.sily_sztywnosci[i + 1] -= sila_sztywnosci / 2.0
    def __init__(self, k1=4, k2=9.0, punkt_poczatkowy=Wektor(-1, -1, 0)):
        self.k1 = k1
        self.k2 = k2
        super(KrzywaLissajous, self).__init__(1)

        punkt = self.pobierz_punkt_materialny(0)
        punkt.ustaw_promien(0.1)
        punkt.ustaw_polozenie(punkt_poczatkowy)
        # punkt.ustaw_predkosc(Wektor(1, 2, 0))
        punkt.ustaw_kolor(0, 0.5, 1)
        punkt.ustaw_promien(random.random() * 0.3)

        punkt.sphere.visible = False
        punkt.promien = 0.1
        punkt.sphere = sphere(
            radius=punkt.promien,
            pos=[punkt.polozenie.x, punkt.polozenie.y, punkt.polozenie.z],
            color=[punkt.kolor.r, punkt.kolor.g, punkt.kolor.b],
            make_trail=True,
            trail_type="curve",
            interval=1,
            retain=500)
Exemple #23
0
    def test_multiply_vector_with_number(self):
        v = Wektor(1.0, 0.0, 0.0)
        v = v * 3.0

        self.assertEqual([v.x, v.y, v.z], [3.0, 0.0, 0.0])
 def sila(self, i):
     return Wektor(
         self.pobierz_punkt_materialny(0).polozenie.x * -self.k1,
         self.pobierz_punkt_materialny(0).polozenie.y * -self.k2, 0)
 def pobierz_srodek(self):
     return Wektor((self.maxX + self.minX) / 2, (self.maxY + self.minY) / 2,
                   0)
 def pobierz_rozmiar(self):
     return Wektor(self.maxX - self.minX, self.maxY - self.minY, 0)
Exemple #27
0
 def test_sub_vector_with_vector(self):
     v1 = Wektor(2.0, -1.0, 1.0)
     v2 = Wektor(3.0, 4.0, 5.0)
     expected = [-1.0, -5.0, -4.0]
     result = (v1 - v2)
     self.assertEqual([result.x, result.y, result.z], expected)
Exemple #28
0
from visual import *
from Fizyka.Symulacja import Symulacja
from Fizyka.MyMath import Wektor
from Fizyka.UkladyPunktowMaterialnych import Wlos

ilosc = 5
wspolczynnik_sprezystosci = 10
wspolczynnik_tlumienia = 0.1
wspolczynnik_tlumienia_oscylacji = 0
wspolczynnik_sztywnosci = 100
dlugosc = 2.0

zpm = Wlos(ilosc, wspolczynnik_sprezystosci, wspolczynnik_tlumienia,
           wspolczynnik_tlumienia_oscylacji, wspolczynnik_sztywnosci, dlugosc)

zpm.g.y = -0.1

l = dlugosc / float(ilosc)  # odleglosc miedzy punktami
# wlos, czy trawa, zacznie sie w punkcie 0,0,0 i idzie do gory pionowo
for i in range(0, zpm.ilosc):
    punkt = zpm.pobierz_punkt_materialny(i)
    polozenie = Wektor(0.1 * i, i * l, 0.1 * i)
    punkt.ustaw_polozenie(polozenie)

box(pos=[0, 0, 0], height=0.5, width=5, length=10)

symulacja = Symulacja(zpm)
# symulacja.schowaj_punkty()
symulacja.kolor_linii([0.8, 0.2, 0.2])
symulacja.glowna_petla()
wspolczynnik_tlumienia = 0.2
wspolczynnik_tlumienia_oscylacji = 1
wspolczynnik_sztywnosci = 10
dlugosc = 5
poziom_podloza_y = -3

zpm = LinaZPodlozem2(ilosc,
                     wspolczynnik_sprezystosci,
                     wspolczynnik_tlumienia,
                     wspolczynnik_tlumienia_oscylacji,
                     wspolczynnik_sztywnosci,
                     dlugosc,
                     poziom_podloza_y=poziom_podloza_y)

# zpm.pobierz_punkt_materialny(0).ustaw_polozenie(Wektor(0, 0, 0))
zpm.pobierz_punkt_materialny(zpm.ilosc - 1).ustaw_polozenie(
    Wektor(1.2, 0.3, -0.1))

# Rysuj podloge
box_height = 0.5
box(pos=[0, poziom_podloza_y - box_height, 0],
    height=box_height,
    width=10,
    length=10)

symulacja = Symulacja([zpm])
# symulacja.schowaj_punkty()
symulacja.kolor_linii([0.6, 0.1, 0.2])
symulacja.grubosc_linii(0.05)
symulacja.glowna_petla()
 def sila(self, indeks):
     return Wektor(0, -1.81, 0)