» »

Java simulacija.. premikanje objektov na risalni plošči

Java simulacija.. premikanje objektov na risalni plošči

i33a ::

Pozdravljeni, narediti moram simulacijo v Javi.. in imam kar nekaj težav. Javo sicer delno znam z simulacijami pa se še nisem ukvarjal. Zato bi potreboval pomoč. Ustvaril sem neke objekte na risalni plošči.. z g.fillOval(), g.fillRect(), ...
Ti objekti se bodo morali premikati v horitzontalni smeri glede na neke enačbe. Zanima pa ne kako ustvariti to gibanje?
Gibanje ne bo samo linearno ampak tudi eksponentno, sinusno, ...

Lep pozdrav, in že vnaprej hvala za pomoč :)

videc ::

Narišeš objekte, pobrišeš vse, ponovno narišeš.
Za to kje objekt narišeš, lokacijo, uporabiš funkcijo, v tvojem primeru glede na enačbo, ki ti določi začetne koordinate objekta.

GnuceLee ::

Naredi simulacijo z diskretnim premikom časa, kar pomeni da imaš neko centralno "uro", kjer ti diskretno teče čas simulacije in ob vsaki spremembi ta čas posreduj objektom. Objekti pa naj svojo pozicijo izračunajo kot funkcijo tega časa. Ob vsakem impulzu časa naj se objekt sam izriše.
Naslednja možnost je, da objekti uporabljajo sistemski čas in se izrisujejo samodejno, v naprej določenih časovnih intervalih.
V obeh primerih lahko vsak simulacijski objekt teče v svoji niti.

Randomness ::

V obeh primerih lahko vsak simulacijski objekt teče v svoji niti.
Mogoče bi še šlo, če bi šlo za le nekaj "simulacijskih objektov". Ali pa če si mislil t.i. Javine "zelene niti", ki pa jih JVM že lep čas ne uporablja več. Drugače pa je tak koncept bolj no go.

i33a ::

Nekaj sem uspel.. a imam še vedno precej težav.
Bi lahko kdo na hitro pregledal kodo, ker pomoje je neka taka začetniška napaka, ki pa jo jaz ne najdem :S
Zaenkrat bi rad vsaj, to, da žogica odleti z platforme v navpičnem metu in pade v prostem padu.

import javax.swing.*;
import java.awt.*;

public class Fizika2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Simulacija");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 800);
        frame.setLocationRelativeTo(null);
        frame.add(new Simulacija());
        frame.setVisible(true);

    }

}

class Simulacija extends JComponent {

    //NEKATERi PODATKI IN VHODI
    public double gravitacija = 9.81;
    public double pi = 3.14;

    public double tPlosce = 0;

    //podatki, ki jih lahko spreminjamo... 
    private double y0 = 0.3;
    private double faktor = 30;


    //izracun podatkov
    private double omegaKr = Math.sqrt(gravitacija/y0);
    private double t0 = 2*pi / omegaKr;
    private double omega = omegaKr * faktor;
    private double k = 1 / (faktor*faktor);

    
    private double zadnjiY = 0;

    private double zadnjiYZoge = 0;
    private double tZoge = 0;


    public Simulacija() {
        Thread animationThread = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    repaint();
                    try {Thread.sleep(20);} catch (Exception ex) {}
                }
            }
        });

        animationThread.start();
    }

    public void paintComponent(Graphics g) {
        Graphics2D gg = (Graphics2D) g;


    
        double st = 0.0002; //sprememba casa
        tPlosce += st;
        

        // plosca je zamaknjena 100px desno.. in ima izračunano višino
        int x = 100;
        int y = (int)(120*  y0* Math.cos(omega * tPlosce));
        


        gg.setColor(Color.BLACK);
        gg.fillRect(x, y+600, 100, 2);


        //ZOGA

        // izračun podatkov za čas, ko se žoga odlepi
        double t1 = Math.acos(-k)/omega;
        double v1 = y0*omega * Math.sin(omega * t1);
        double y1 = k*y0;

        int yZoge = 0;

        //treba bo izracunati se stvari za zogo... zdaj niha skupaj z ploščo
        if(tPlosce < t1){
            yZoge =(int)(120*  y0* Math.cos(omega * tPlosce));
        }else{
            //ko se žoga odbije

           yZoge = -(int)((y1 + v1*tZoge - gravitacija*tZoge*tZoge/2)*120 );
           tZoge+= st; 
           
        }


        gg.setColor(Color.BLUE);
        gg.fillOval(x+30,yZoge+585,15,15);

        zadnjiY = (int)y1;

        zadnjiYZoge = yZoge; 
    }

}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# - domača naloga

Oddelek: Programiranje
162208 (1749) IceBoX
»

[Java] System.out.print = null

Oddelek: Programiranje
6752 (674) Spura
»

Java Objekti

Oddelek: Programiranje
102248 (1942) Mavrik
»

[C#]Analogna ura

Oddelek: Programiranje
152731 (2368) cekr
»

[c#]4 v vrsto - padanje krogov

Oddelek: Programiranje
81988 (1820) VASkO

Več podobnih tem