Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void stampajVektor(PVector v){
- println("(" + v.x + ", " + v.y + ")");
- }
- void arrow(float x1, float y1, float x2, float y2, int r, int g, int b) {
- fill(r, g, b);
- stroke(r, g, b);
- strokeWeight(2);
- line(x1, y1, x2, y2);
- pushMatrix();
- translate(x2, y2);
- float a = atan2(x1-x2, y2-y1);
- rotate(a);
- line(0, 0, -10, -10);
- line(0, 0, 10, -10);
- popMatrix();
- text(vecToString(new PVector(x1, x2)), x2, y2);
- }
- String vecToString(PVector v){
- return "(" + v.x + ", " + v.y + ")";
- }
- // Klasa za loptu
- class Lopta{
- PVector polozaj; // Vektor polozaja
- float duzina0; // Pocetna duzina
- float duzina; // Trenutna duzina opruge
- float koef; // Koeficijent elasticnosti
- float masa; // Masa lopte, kao i precnik
- float alfa; // Ugao izmedju ravnoteznog i trenutnog polozaja
- PVector opruznaSila; // Vektor opruzne sile
- PVector brzina; // Vektor brzine
- PVector ubrzanje; // Vektor ubrzanja
- PVector gravitacija; // Gravitaciona sila
- Lopta(float mas, float duz, float koeff){
- brzina = new PVector(0, 0); // Brzina je na pocetku 0
- ubrzanje = new PVector(0, 0); // Kao i ubrzanje
- masa = mas;
- duzina0 = duz;
- duzina = duzina0; // Trenutna duzina je jednaka pocetnoj
- polozaj = new PVector(0, duzina); // Vektor polozaja
- koef = koeff;
- alfa = 0; // Ugao je na pocetku 0
- opruznaSila = new PVector(0, 0); // U ravnoteznom polozaju ne deluje sila
- gravitacija = new PVector(0, 9);
- };
- // Racuna i postavlja opruznu silu
- void izrOpruznuSilu(){
- if(duzina < duzina0){
- opruznaSila.set(0, 0);
- } else {
- //if(duzina < 330) {
- // x komponenta opruzne sile
- float ox = -koef*(duzina-duzina0)*sin(alfa);
- // y komponenta opruzne sile
- float oy = -koef*(duzina-duzina0)*cos(alfa);
- opruznaSila.set(ox, oy);
- }
- }
- // F-ja koja prikazuje klatno i jos par stvari
- void prikazi(){
- // Prikazivanje lopte
- stroke(0);
- fill(255, 255, 255, 100);
- ellipse(polozaj.x, polozaj.y, 5*masa, 5*masa);
- // Prikazivanje opruge
- stroke(255, 0, 72);
- strokeWeight(2);
- line(0, 0, polozaj.x, polozaj.y);
- // Iscrtavanje vektora brzine
- if(prikaziBrzinu){
- arrow(polozaj.x, polozaj.y, polozaj.x + brzina.x, polozaj.y + brzina.y, 0, 0, 255);
- }
- };
- void prikaziHUD() {
- // Ispis ugla i duzine
- stroke(0);
- fill(0);
- strokeWeight(2);
- text("Duzina: ", 100, 100);
- strokeWeight(1);
- text(duzina, 150, 100);
- strokeWeight(2);
- text("Ugao: ", 250, 100);
- strokeWeight(1);
- text(degrees(alfa), 300, 100);
- }
- void promeniUgao(){
- alfa = atan2(polozaj.x, polozaj.y);
- };
- // Funkcija koja pomera klatno u novi polozaj,
- // racuna duzinu opruge u tom polozaju, ugao i
- // izracunava opruznu silu
- void pomeri(PVector novi){
- polozaj = novi;
- duzina = polozaj.mag();
- promeniUgao();
- izrOpruznuSilu();
- };
- // Funkcija koja update-uje brzinu, polozaj i ubrzanje
- void update(float delta){
- // Dodajemo sile koje deluju na klatno
- primeniSilu(PVector.mult(gravitacija, masa));
- primeniSilu(opruznaSila);
- brzina.add(PVector.mult(ubrzanje, delta));
- pomeri(PVector.add(polozaj, PVector.mult(brzina, delta)));
- ubrzanje.mult(0);
- }
- void primeniSilu(PVector sila){
- ubrzanje.add(PVector.div(sila, masa));
- }
- // Postavlja brzinu i ubrzanje na 0
- void resetuj() {
- ubrzanje.set(0, 0);
- brzina.set(0, 0);
- }
- };
- Lopta l; // Nasa lopta
- boolean prikaziBrzinu = false;
- void setup(){
- size(1024, 1000); // Dimenzije ekrana
- l = new Lopta(10, 300, 20);
- frameRate(1000);
- lastTime = millis();
- };
- int lastTime = 0;
- int delta = 0;
- class Dugme{
- float xpos, ypos;
- float wd, ht;
- String caption;
- color c;
- boolean status;
- Dugme(float _xpos, float _ypos, float _wd, float _ht, String _caption){
- xpos = _xpos;
- ypos = _ypos;
- wd = _wd;
- ht = _ht;
- c = color(255, 255, 255);
- caption = _caption;
- status = false;
- }
- void show(){
- fill(c);
- strokeWeight(0);
- rect(xpos, ypos, wd, ht);
- fill(0);
- text(caption, xpos+5, ypos+15);
- }
- void toggleColor(){
- if(!status){
- c = color(255, 255, 255);
- }else{
- c = color(200, 255, 255);
- };
- }
- boolean isClicked(float mX, float mY){
- if(mX >= xpos && mX <= xpos+wd && mY>=ypos && mY <= ypos+ht){
- status = !status;
- toggleColor();
- return true;
- }
- return false;
- }
- }
- color w = 255;
- Dugme dajBrzinu = new Dugme(100, 120, 100, 20, "Vektor brzine");
- void draw(){
- delta = millis() - lastTime;
- // Postavljanje novog koordinatnog pocetka
- translate(width/2, height/2);
- background(200, 255, 255);
- // Update-ujemo brzinu, polozaj i ubrzanje
- l.update(delta/100f);
- l.prikazi();
- translate(-width/2, -height/2);
- l.prikaziHUD();
- lastTime = millis();
- dajBrzinu.show();
- };
- // Na klik misa se klatno postavlja u zeljeni polozaj
- void mouseClicked(){
- if(dajBrzinu.isClicked(mouseX, mouseY)){
- prikaziBrzinu = !prikaziBrzinu;
- return;
- }
- l.pomeri(new PVector(mouseX-width/2, mouseY-height/2));
- l.resetuj();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement