Advertisement
Guest User

Untitled

a guest
May 25th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.88 KB | None | 0 0
  1. void stampajVektor(PVector v){
  2. println("(" + v.x + ", " + v.y + ")");
  3. }
  4. void arrow(float x1, float y1, float x2, float y2, int r, int g, int b) {
  5. fill(r, g, b);
  6. stroke(r, g, b);
  7. strokeWeight(2);
  8. line(x1, y1, x2, y2);
  9. pushMatrix();
  10. translate(x2, y2);
  11. float a = atan2(x1-x2, y2-y1);
  12. rotate(a);
  13. line(0, 0, -10, -10);
  14. line(0, 0, 10, -10);
  15. popMatrix();
  16.  
  17. text(vecToString(new PVector(x1, x2)), x2, y2);
  18. }
  19. String vecToString(PVector v){
  20. return "(" + v.x + ", " + v.y + ")";
  21. }
  22. // Klasa za loptu
  23. class Lopta{
  24. PVector polozaj; // Vektor polozaja
  25. float duzina0; // Pocetna duzina
  26. float duzina; // Trenutna duzina opruge
  27. float koef; // Koeficijent elasticnosti
  28. float masa; // Masa lopte, kao i precnik
  29. float alfa; // Ugao izmedju ravnoteznog i trenutnog polozaja
  30.  
  31. PVector opruznaSila; // Vektor opruzne sile
  32. PVector brzina; // Vektor brzine
  33. PVector ubrzanje; // Vektor ubrzanja
  34.  
  35. PVector gravitacija; // Gravitaciona sila
  36.  
  37. Lopta(float mas, float duz, float koeff){
  38. brzina = new PVector(0, 0); // Brzina je na pocetku 0
  39. ubrzanje = new PVector(0, 0); // Kao i ubrzanje
  40. masa = mas;
  41. duzina0 = duz;
  42. duzina = duzina0; // Trenutna duzina je jednaka pocetnoj
  43. polozaj = new PVector(0, duzina); // Vektor polozaja
  44. koef = koeff;
  45. alfa = 0; // Ugao je na pocetku 0
  46. opruznaSila = new PVector(0, 0); // U ravnoteznom polozaju ne deluje sila
  47. gravitacija = new PVector(0, 9);
  48. };
  49.  
  50. // Racuna i postavlja opruznu silu
  51. void izrOpruznuSilu(){
  52. if(duzina < duzina0){
  53. opruznaSila.set(0, 0);
  54. } else {
  55. //if(duzina < 330) {
  56. // x komponenta opruzne sile
  57. float ox = -koef*(duzina-duzina0)*sin(alfa);
  58. // y komponenta opruzne sile
  59. float oy = -koef*(duzina-duzina0)*cos(alfa);
  60.  
  61. opruznaSila.set(ox, oy);
  62. }
  63. }
  64.  
  65. // F-ja koja prikazuje klatno i jos par stvari
  66. void prikazi(){
  67. // Prikazivanje lopte
  68. stroke(0);
  69. fill(255, 255, 255, 100);
  70. ellipse(polozaj.x, polozaj.y, 5*masa, 5*masa);
  71.  
  72. // Prikazivanje opruge
  73. stroke(255, 0, 72);
  74. strokeWeight(2);
  75. line(0, 0, polozaj.x, polozaj.y);
  76.  
  77. // Iscrtavanje vektora brzine
  78. if(prikazivektore){
  79. arrow(polozaj.x, polozaj.y, polozaj.x + brzina.x, polozaj.y + brzina.y, 0, 0, 255);
  80. arrow(polozaj.x, polozaj.y, polozaj.x + gravitacija.x, polozaj.y + gravitacija.y, 0, 255, 0);
  81. }
  82.  
  83.  
  84. };
  85.  
  86. void prikaziHUD() {
  87. // Ispis ugla i duzine
  88. stroke(0);
  89. fill(0);
  90.  
  91. strokeWeight(2);
  92. text("Duzina: ", 100, 100);
  93. strokeWeight(1);
  94. text(duzina, 150, 100);
  95.  
  96. strokeWeight(2);
  97. text("Ugao: ", 250, 100);
  98. strokeWeight(1);
  99. text(degrees(alfa), 300, 100);
  100. }
  101.  
  102. void promeniUgao(){
  103. alfa = atan2(polozaj.x, polozaj.y);
  104. };
  105.  
  106. // Funkcija koja pomera klatno u novi polozaj,
  107. // racuna duzinu opruge u tom polozaju, ugao i
  108. // izracunava opruznu silu
  109. void pomeri(PVector novi){
  110. polozaj = novi;
  111. duzina = polozaj.mag();
  112. promeniUgao();
  113. izrOpruznuSilu();
  114. };
  115.  
  116. // Funkcija koja update-uje brzinu, polozaj i ubrzanje
  117. void update(float delta){
  118. // Dodajemo sile koje deluju na klatno
  119. primeniSilu(PVector.mult(gravitacija, masa));
  120. primeniSilu(opruznaSila);
  121. brzina.add(PVector.mult(ubrzanje, delta));
  122. pomeri(PVector.add(polozaj, PVector.mult(brzina, delta)));
  123.  
  124. ubrzanje.mult(0);
  125. }
  126.  
  127. void primeniSilu(PVector sila){
  128. ubrzanje.add(PVector.div(sila, masa));
  129. }
  130.  
  131. // Postavlja brzinu i ubrzanje na 0
  132. void resetuj() {
  133. ubrzanje.set(0, 0);
  134. brzina.set(0, 0);
  135. }
  136.  
  137. };
  138.  
  139. Lopta l; // Nasa lopta
  140. boolean prikazivektore = false;
  141.  
  142.  
  143. void setup(){
  144. size(1024, 1000); // Dimenzije ekrana
  145. l = new Lopta(10, 300, 20);
  146. frameRate(1000);
  147. lastTime = millis();
  148.  
  149. };
  150.  
  151. int lastTime = 0;
  152. int delta = 0;
  153.  
  154. class Dugme{
  155. float xpos, ypos;
  156. float wd, ht;
  157. String caption;
  158. color c;
  159. boolean status;
  160. Dugme(float _xpos, float _ypos, float _wd, float _ht, String _caption){
  161. xpos = _xpos;
  162. ypos = _ypos;
  163. wd = _wd;
  164. ht = _ht;
  165. c = color(255, 255, 255);
  166. caption = _caption;
  167. status = false;
  168. }
  169.  
  170. void show(){
  171. fill(c);
  172. strokeWeight(0);
  173.  
  174. rect(xpos, ypos, wd, ht);
  175. fill(0);
  176. text("Prikazi vektore", xpos+5, ypos+15);
  177.  
  178. }
  179.  
  180. void toggleColor(){
  181. if(!status){
  182. c = color(255, 255, 255);
  183. }else{
  184. c = color(200, 255, 255);
  185. };
  186. }
  187.  
  188. boolean isClicked(float mX, float mY){
  189.  
  190. if(mX >= xpos && mX <= xpos+wd && mY>=ypos && mY <= ypos+ht){
  191. status = !status;
  192. toggleColor();
  193. return true;
  194. }
  195. return false;
  196. }
  197.  
  198. }
  199.  
  200. color w = 255;
  201. Dugme prikazi = new Dugme(100, 120, 100, 20, "Prikazi vektore");
  202. Dugme dajBrzinu = new Dugme(100, 120, 100, 20, "Vektor brzine");
  203. void draw(){
  204.  
  205. delta = millis() - lastTime;
  206.  
  207. // Postavljanje novog koordinatnog pocetka
  208. translate(width/2, height/2);
  209. background(200, 255, 255);
  210.  
  211. // Update-ujemo brzinu, polozaj i ubrzanje
  212. l.update(delta/100f);
  213. l.prikazi();
  214.  
  215. translate(-width/2, -height/2);
  216. l.prikaziHUD();
  217.  
  218. lastTime = millis();
  219.  
  220. prikazi.show();
  221.  
  222. };
  223.  
  224. // Na klik misa se klatno postavlja u zeljeni polozaj
  225. void mouseClicked(){
  226.  
  227. if(prikazi.isClicked(mouseX, mouseY)){
  228. prikazivektore = !prikazivektore;
  229. return;
  230. }
  231.  
  232. l.pomeri(new PVector(mouseX-width/2, mouseY-height/2));
  233. l.resetuj();
  234.  
  235.  
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement