• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PROCESSING Bład poczas dodawania planet

Object Storage Arubacloud
0 głosów
209 wizyt
pytanie zadane 13 grudnia 2016 w Java przez DarthBartek Początkujący (480 p.)

Witam, zrobiłem symulator grawitacji, cała mechanika działa...  Tylko po ostatnim "updatecie" obiekty nie chcą się dodawać. Myśle że problem siedzi w usuwaniu obiektów 

///główny program 

ArrayList<Planet> b;
float G=0.667;
PVector mouse= new PVector(0,0);
void setup(){
  size(displayWidth,displayHeight,OPENGL);
  b= new ArrayList<Planet>();
}
void draw(){
 background(255);
 for(int i = b.size()-1 ; i>=0;i--){
   for(int j = b.size()-1 ; j>=0;j--){
     if(j!=i){ 
       b.get(j).applyForce(b.get(i));
       if(b.get(j).collision(b.get(i)) ==true){
         b.remove(b.get(i));
       }
     }    
   }
 } 
for(int k = b.size()-1;k>=0 ; k--){
  b.get(k).update();
  b.get(k).show();
  b.get(k).ForceReset();
 } 
}
void mousePressed(){
  b.add(new Planet(random(10,30),mouseX,mouseY));
}


///KLASA 
class Planet{
  float radius;
  float mass;
  
  PVector loc,vel,acc,buf;

  Planet(float r, float x,float y){
    radius= r;
    loc = new PVector(x,y);
    vel = new PVector(random(-5,5),random(-5,5));
    acc = new PVector(0,0);
    buf = new PVector(0,0);
  }
  void update(){
    mass=radius*radius*3.23;
    vel.add(acc);
    loc.add(vel);
    acc.mult(0);
  }
  void show(){
    fill(0);
    ellipse(loc.x,loc.y,radius*2,radius*2);
  }
 void applyForce(Planet h){
   float f;
   f=(G*mass*h.mass)/pow(PVector.dist(loc,h.loc),2);
    buf.set(h.loc);
    buf.sub(loc);
    acc.add(buf);
    acc.setMag(f/mass);
    acc.limit(40); 
  }
  void ForceReset(){
    acc.setMag(0);;
  }
  boolean collision(Planet q){
    if(PVector.dist(loc,q.loc)<radius+q.radius){
      radius=sqrt(((radius*radius*PI)+(q.radius*q.radius*PI))/PI);
      return true;
    }
    else{
       return false;
    }
  }
}

 

komentarz 18 grudnia 2016 przez DarthBartek Początkujący (480 p.)
(jakby ci się nie wyświetliło to na dole napisałem odpowiedź(nie wiem czemu ale nie moge dać ci najlepszej odpowiedzi ;/)) Dzięki tobie naprawiłem już błąd :D Teraz już mogę dodawać wszystkie usprawnienia i dodatki do mojej aplikacji, dzięki :)

2 odpowiedzi

0 głosów
odpowiedź 18 grudnia 2016 przez niezalogowany
wybrane 18 grudnia 2016 przez DarthBartek
 
Najlepsza

Nie znam się za bardzo na PROCESSING, ale mam kilka mniej, lub bardziej istotnych uwag (właściwie 1 jest najważniejsza):

1) Tą samą pętlą liczysz przyśpieszenia i następnie ustawiasz prędkość, nowe położenie... Lepiej jakbyś jedną pętlą obliczył (zsumował) wypadkową siłę od oddziaływań wszystkich planet, a następnie kolejną pętlą zmieniał prędkość i położenie i zerowanie przyśpieszeń. Ewentualnie w i-tej pętli zaraz po zakończeniu j-tej. Ale ogólnie sam algorytm ładnie pomyślany :)

2) Siła to wektor, a deklarujesz ją jak liczbę. Wzór na siłę jest skalarny... Najłatwiej to zrobić tak:
 

EDIT1: x na obrazku to różnice odległości we wspólrzednej x czyli x pierwszego ciala odjac x drugiego ciala

EDIT2: x drugiego minus x pierwszego (tego dla, którego liczymy). Bo źle dając znak tutaj możemy przypadkiem dać antygrawitację :D

 

3) Liczenie sił jest z prawa grawitacji i 2 prawa Newtona jest super, ale może by tak zrobić to z przyśpieszeń? Generalnie chodzi o to, że licząc siły robisz coś takiego mniej więcej:
mass - masa tej planety, która się porusza
sila = mass*a1 + mass*a2+mass*a3 + ... (gdzie a to przyśpieszenia od kolejnych wpływających obiektów)

Następnie liczysz przyśpieszenie a z II prawa Newtona
 

a = sila/mass

a=(mass*a1 + mass*a2+mass*a3+...)/mass = a1+a2+a3+... (jako wektory)

Tam wszędzie wymnażałeś przez tą masę, a tu nagle ją usuwasz. Można zauważyć, że ruch naszego (v, a) ciała gdy mamy tylko siły grawitacyjne ZAWSZE nie zależy od jego własnej masy (patrz spadające 1kg żelaza 1kg pierza, które spadnie pierwsze?). Nie była potrzebna od samego początku. Tzn nic by się nie stało, ale wykonujesz ileś tam niepotrzebnych działań, które mogą powodować błędy numeryczne (patrz niedokładny zapis liczb w komputerze). Mniejszą prawdziwość danych, wraz z trwaniem symulacji od początku naliczane będą błędy. 

3) Ładny pomysł z łączeniem obiektów przy zderzeniu. Mniemam, że chodziło o to by pole powstałego obiektu było sumą pól dwóch pozostałych... W takim razie wszystkie liczby pi są zbędne, bo się skracają - tu się wkradł malutki błąd. W kolizjach ogólnie będzie bardzo dużo zagadnień np masz jeszcze usunięcie jednego obiektu, dodanie mas, co się dzieje z prędkością... Polecałbym na razie bym kolizje wyłączył i założył, że promienie planet to tylko promienie graficzne, a nie fizyczne. Najważniejsze by się prawidłowo ruszało, a to zagadnienie można ruszyć później :)

4) mass=radius*radius*3.23;   ??? :D

 

PS. Wziąłeś sobie bardzo ciekawą i nawet wymagającą symulację do zrobienia. W niej można wiele rzeczy zrobić, zauważyć, a widzę że masz jakiś tam plan i w miarę dobrze go realizujesz :)

0 głosów
odpowiedź 18 grudnia 2016 przez DarthBartek Początkujący (480 p.)
O kurcze, dzięki za odpowiedź :D

1) Przecież jedna (dwie) pętle właśnie liczą przyspieszenia dla każdej planety, a potem kolejna pętla ustawia prędkości tych planet :D

2) Wiem że siła to wektor, ale tam bardziej chodziło mi o wartość siły. "acc.setMag(f/mass);" deklaruje wartość tego wektora bo set Magnitude. W tym programie wektor acc to siła, ale to dopracuje później :D

3a) Tego też nie zauważyłem :D jednak warto pokazywać swój kod, bo samemu się takich rzeczy nie widzi:)

Nad punktami 2 i 3a zastanowie sie później, teraz najważniejsze jest naprawienie błędu

3b) Z tymi liczbami PI to faktycznie, nie zauważyłem :D zaraz po dodaniu kolizji aplikacja zaczęła się psuć więc ich dopracowanie zostawiłem na potem :)

4) To też małe nie dociągniecie, masę chciałem liczyć z pola powierchni i gęstości np: pi*r*r*gęstość, już to poprawiłem :D
komentarz 18 grudnia 2016 przez niezalogowany
edycja 18 grudnia 2016
Nie wiedziałem gdzie miałeś błąd dodawania planet, więc postanowiłem dać komentarz by ktoś mógł odpowiedzieć na główne pytanie. No, ale niech będzie - przeniosę do odpowiedzi ;)

1) No dobra zobaczmy, bo nie jestem pewien już. Jak będzie działała pierwsza prędkość kosmiczna itp to będzie ok :)
komentarz 18 grudnia 2016 przez niezalogowany
1) Ogólnie chodzi o to, że pętle robią to w trochę dziwny sposób wg mnie. Tzn najpierw liczą siłę dla pierwszego ciała i przestawiają to ciało.. Następnie liczą siłę dla kolejnego ciała... które zależy od położenia przesuniętego ciała, które jest jakby przesunięte w czasie. Nie jest w tym samym momencie jak wtedy gdy liczyliśmy przyśpieszenie dla tego pierwszego... jest trochę dalej. I tak samo gdy liczymy przyśpieszenie dla ostatniego ciała na podstawie przesuniętych innych. Nie wiem czy to duży błąd. Czy to ma znaczenie, ale sprawdzę to jeszcze :D

Pozdrawiam!
komentarz 18 grudnia 2016 przez DarthBartek Początkujący (480 p.)
W tej jednej pętli liczą się przyspieszenia wypadkowe, a dopiero w późniejszej pętli to przyspieszenie jest dodawane do prędkości i reset sił  :D
komentarz 18 grudnia 2016 przez niezalogowany
Dobra już widzę :D

Podobne pytania

0 głosów
0 odpowiedzi 111 wizyt
pytanie zadane 3 grudnia 2015 w Java przez gab123 Mądrala (5,230 p.)
0 głosów
0 odpowiedzi 1,245 wizyt
pytanie zadane 15 stycznia 2017 w Inne języki przez niezalogowany
0 głosów
1 odpowiedź 180 wizyt

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...