Ovaj deo vodiča prikazuje kako da, nakon što ste podesili IntelliJ IDEA i integrisali OSP biblioteke, napravite jednostavnu simulaciju matematičkog klatna koristeći Open Source Physics (.jar) pakete. Proći ćemo kroz strukturu projekta, neophodne import-e, i objasniti kako da prikažete oscilacije klatna u realnom vremenu.
org.opensourcephysics.*
paketa u IntelliJ IDEA.src
direktorijumu smestiti glavnu klasu i kako organizovati package.SimulationControl
,
PlotFrame
i drugih klasa iz OSP-a za postavljanje slike klatna.PlotFrame
ili custom DrawingPanel
u petlji.Nakon ovog uvoda, bićete spremni da implementirate i detaljnije prilagodite simulaciju—dodate kontrolne elemente, promenljive parametre ili čak proširite klatno u 3D koristeći WebEJS ili p5.js port OSP-a.
Pre nego što se upustite u razvoj vaših simulacija ili drugih Java projekata, neophodno je da pravilno podesite razvojno okruženje. Sledeći koraci će vas provesti kroz osnovna podešavanja IntelliJ IDEA: od integracije JDK-a, preko instalacije dodatnih plugin-ova, do prilagođavanja tastaturskih prečica i teme.
Prvi i najvažniji korak je dodavanje lokalno instaliranog Java Development Kita (JDK) u IntelliJ IDEA. Ovo omogućava kompajliranje i pokretanje vaših Java aplikacija.
File → Settings → Build, Execution, Deployment → SDKs
IntelliJ IDEA → Preferences → Build, Execution, Deployment → SDKs
+ → Add SDK → JDK
.bin
, lib
itd.):
C:\Program Files\Java\jdk-11.0.12
(Windows)/usr/lib/jvm/java-11-openjdk
(Linux)Project Structure → Project
i u polju Project SDK izaberite upravo dodat JDK.Da biste radili sa drugim jezicima i alatima unutar IntelliJ IDEA, potrebno je da instalirate odgovarajuće plugin-ove.
File → Settings → Plugins
(ili IntelliJ IDEA → Preferences → Plugins
).IntelliJ IDEA omogućava izbor između više preddefinisanih keymap-ova i grafičkih tema, kako bi radno okruženje bilo što prijatnije.
Settings → Keymap
– izaberite “Default”, “Eclipse”, “Visual Studio” ili drugi layout.Settings → Appearance & Behavior → Theme
– odaberite “Darcula” (tamna) ili “IntelliJ Light”.
Ako ste instalirali IntelliJ IDEA iz .tar.gz
paketa, prilikom prvog pokretanja IDE će vam ponuditi da kreira
desktop entry za brže pokretanje sa GUI menija.
U slučaju da IDE ne ponudi automatski:
sudo tee /usr/local/bin/idea << 'EOF'
#!/usr/bin/env bash
/opt/idea-community/bin/idea.sh "$@"
EOF
sudo chmod +x /usr/local/bin/idea
idea
ili ga pronađite u aplikacijama vašeg desktop okruženja.Trenutno je stabilna verzija OSP biblioteka 6.3.0 (februar 2025). Ranije često korišćene verzije su 6.2.x i 6.1.x (npr. 6.1.7 iz juna 2024).
Kompletni korisnički priručnici i tehnička dokumentacija dostupni su na sajtu ComPADRE. Takođe je objavljen online JavaDoc za sve OSP pakete i klase u okviru OpenSourcePhysics domena. Za početak pogledajte odeljak ComPADRE Programming – Documentation i “OSP User’s Guide”.
Dovoljno je uključiti jedan arhiv – osp.jar
ili osp-guide.jar
– u projekat.
osp_guide.jar
nije već na računaru, preuzmite ga sa ComPADRE:libs/
unutar vašeg projekta. File → Project Structure…
(ili Ctrl+Alt+Shift+S
).libs/osp-guide.jar
,
potvrdite i izaberite opseg Compile.Da biste istu OSP JAR arhivu koristili u više projekata bez dupliranja, možete je registrovati kao globalnu biblioteku:
File → Project Structure… → Platform Settings → Global Libraries
.osp-guide.jar
.osp-guide
.Nakon ovoga, IntelliJ će smestiti OSP klase na classpath projekta, pa je moguće koristiti:
import org.opensourcephysics.controls.*;
import org.opensourcephysics.display.*;
U sledećim koracima je opisano kako se u IntelliJ IDEA kreira novi Java projekat, zatim kako se u njega dodaju Open Source Physics (.jar) biblioteke, i na kraju prikazuje primer simulacije matematičkog klatna.
Preuzeti .jar fajlovi iz OSP distribucije (npr. osp.jar
ili osp-guide.jar
) mogu se uključiti u projekat na sledeći način:
F4
). Preporučuje se da se u okviru src
kreira paket, npr. klatno
,
u kojem će se nalaziti sve klase vezane za simulaciju.
package klatno;
import org.opensourcephysics.display.Circle;
import org.opensourcephysics.display.Trail;
import org.opensourcephysics.display.DrawingFrame;
import org.opensourcephysics.display.DrawingPanel;
import org.opensourcephysics.numerics.ODE;
import org.opensourcephysics.numerics.ODESolver;
import org.opensourcephysics.numerics.Euler;
public class AnimiranoKlatno implements ODE {
private double[] state = new double[3]; // [theta, omega, time]
private final double g = 9.81;
private final double L = 1.0;
public AnimiranoKlatno() {
state[0] = Math.PI / 4; // initial angle
state[1] = 0; // initial angular velocity
state[2] = 0; // initial time
}
@Override
public double[] getState() {
return state;
}
@Override
public void getRate(double[] s, double[] r) {
r[0] = s[1];
r[1] = -(g / L) * Math.sin(s[0]);
r[2] = 1;
}
public static void main(String[] args) {
AnimiranoKlatno model = new AnimiranoKlatno();
ODESolver solver = new Euler(model);
// 1) Create panel and frame
DrawingPanel panel = new DrawingPanel();
DrawingFrame frame = new DrawingFrame("Pendulum Animation", panel);
frame.setDefaultCloseOperation(DrawingFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// 2) Prepare rod and bob
Trail rod = new Trail();
rod.setConnected(true);
Circle bob = new Circle(0, 0, 5);
panel.addDrawable(rod);
panel.addDrawable(bob);
// 3) Initialize solver and run loop
double dt = 0.02;
solver.initialize(dt);
while (true) {
solver.step();
double theta = model.state[0];
double x = model.L * Math.sin(theta);
double y = -model.L * Math.cos(theta);
rod.clear();
rod.addPoint(0, 0);
rod.addPoint(x, y);
bob.setX(x);
bob.setY(y);
frame.render();
try {
Thread.sleep((int)(dt * 1000));
} catch (InterruptedException ex) {
break;
}
}
}
}
Klasa AnimiranoKlatno implementira interfejs ODE. Da bismo razumeli šta to znači, prvo ćemo se osvrnuti na sam interfejs ODE:
U Open Source Physics (OSP) biblioteci, ODE predstavlja interfejs koji se koristi za modelovanje dinamičkih sistema pomoću običnih diferencijalnih jednačina (eng. Ordinary Differential Equations).
On zahteva implementaciju sledećih metoda:
U klasi AnimiranoKlatno nalazi se niz state dužine 3, koji čuva vrednosti ugla θ, ugaone brzine ω i vremena t. Početni ugao postavljen je na π / 4 radijana, brzina na 0, a početno vreme takođe na 0.
U glavnoj metodi (main) se kreiraju sledeći objekti:
Na panel se dodaju dva grafička objekta:
U beskonačnoj petlji poziva se solver da izračuna sledeće stanje sistema, zatim se grafika ažurira tako da se pozicije kuglice i linije prikažu u skladu sa novim izračunatim koordinatama. Linija se crta od koordinatnog početka do trenutne pozicije kuglice, a kuglica se pozicionira na odgovarajuću tačku. Svaki korak se zatim prikazuje korisniku pomoću metode frame.render().
Ovaj princip omogućava simulaciju fizičkog sistema koji se menja u realnom vremenu u skladu sa diferencijalnim jednačinama koje opisuju njegovo ponašanje.