Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import javax.swing.*;
- import java.util.ArrayList;
- import java.awt.*;
- import java.awt.image.BufferStrategy;
- import static java.lang.Math.*;
- import java.awt.event.*;
- import java.awt.image.BufferedImage;
- class Spacetime {
- public static void main(String[] args) {
- MainClass mainClass = new MainClass();
- mainClass.start();
- }
- }
- class MainClass {
- public MainClass() {
- }
- public void start(){
- createFrameAndCanvases();
- generateEvents();
- generateEvents_p();
- render();
- jFrame.paintComponents(g2DjFrame);
- jFrame.repaint();
- mainLoop();
- }
- public void mainLoop() {
- do{
- updateState();
- render();
- try{Thread.sleep(20);} catch (Exception e){};
- } while(true);
- }
- int stage=1;
- boolean deletePaths=false;
- public void updateState(){
- here:
- if(!lock) {
- if (deletePaths==true){
- g2Dimg.setBackground(new Color(0,0,0,0));
- g2Dimg.clearRect(0,0,501,501);
- deletePaths=false;
- if (stage<6){stage+=1;}
- }
- if (stage==1){
- if ((round(v_rel*10000)/10000.0)<0.5) { accelerate();
- } else {
- lock=true;
- deletePaths=true;
- break here;
- }
- }
- if (stage==2) {
- if ((round(timePassed*10000)/10000.0)<10){letSomeTimePass();
- } else {
- turnAroundTime = timePassed;
- turnAroundPosition = v_rel*timePassed;
- lock=true;
- deletePaths=true;
- break here;
- }
- }
- if (stage==3) {
- if ((round(v_rel*10000)/10000.0)>0) {deccelerate();
- } else {
- lock=true;
- deletePaths=true;
- break here;
- }
- }
- if (stage==4) {
- if ((round(v_rel*10000)/10000.0)>-0.5) {deccelerate();
- } else {
- lock=true;
- deletePaths=true;
- break here;
- }
- }
- if (stage==5) {
- if((round(timePassed*10000)/10000.0)<20) {letSomeTimePass();
- } else {
- lock=true;
- deletePaths=true;
- break here;
- }
- }
- if (stage==6) {
- if ((round(v_rel*10000)/10000.0)<0) {accelerate();
- } else {
- lock=true;
- deletePaths=true;
- break here;
- }
- }
- }
- }
- public void accelerate() {
- v_rel+=0.002;
- }
- public void deccelerate() {
- v_rel-=0.002;
- }
- public void letSomeTimePass() {
- timePassed +=0.02;
- }
- public void render(){
- g2Dcanvas1 = (Graphics2D) strategyCanvas1.getDrawGraphics();
- g2Dcanvas2 = (Graphics2D) strategyCanvas2.getDrawGraphics();
- g2DjFrame = (Graphics2D) strategyJFrame.getDrawGraphics();
- g2Dcanvas1.setColor(backgroundColor);
- g2Dcanvas2.setColor(backgroundColor);
- g2DjFrame.setColor(backgroundColor);
- g2Dcanvas1.fillRect(0,0,501,501);
- g2Dcanvas2.fillRect(0,0,501,501);
- g2DjFrame.fillRect(0,0,1280,720);
- g2Dcanvas1.setColor(Color.WHITE);
- g2Dcanvas1.fillOval((int)(traveller_x*25-10+251),(int)(traveller_t*25-10+251),20,20);
- g2Dcanvas2.setColor(Color.BLUE);
- g2Dcanvas2.fillOval((int)(not_traveller_x_p*25-10+251),(int)(not_traveller_t_p*25-10+251),20,20);
- g2Dcanvas1.setColor(Color.BLUE);
- g2Dcanvas1.fillOval((int)(xPos*25-10+251),(int)(-tPos*25-10+251),20,20);
- if (showPaths) {
- g2Dcanvas2.drawImage(bufferedImage,0,0,501,501,null);}
- g2Dcanvas1.setStroke(new BasicStroke(2));
- g2Dcanvas2.setStroke(new BasicStroke(2));
- plotLightbeams();
- g2Dcanvas1.setStroke(new BasicStroke(1));
- g2Dcanvas2.setStroke(new BasicStroke(1));
- plotDiagrams();
- g2Dcanvas1.setStroke(new BasicStroke(3));
- g2Dcanvas2.setStroke(new BasicStroke(3));
- plotEvents();
- jFrame.paintComponents(g2DjFrame);
- g2DjFrame.setColor(Color.BLACK);
- g2DjFrame.setFont(stringFont3);
- g2DjFrame.drawString("Vrel "+(Double.toString(round(v_rel*10000)/10000.0)+"c"),610,100);
- g2DjFrame.setColor(Color.BLACK);
- g2DjFrame.drawString("stage "+stage,615,150);
- g2DjFrame.setColor(Color.BLUE);
- g2DjFrame.drawString("Observer clock count "+(Double.toString(round(timePassed*10000)/10000.0))+"s",50,570);
- g2DjFrame.drawString("x-Pos / t-Pos: 0ls / 0s",50,600);
- g2DjFrame.setColor(Color.WHITE);
- g2DjFrame.drawString("White clock count "+(Double.toString(round(timePassed_p*10000)/10000.0))+"s",330,570);
- g2DjFrame.drawString("x Position "+(Double.toString(round(traveller_x*10000)/10000.0))+"ls",330,600);
- g2DjFrame.drawString("t Position 0s",330,620);
- g2DjFrame.setColor(Color.WHITE);;
- g2DjFrame.drawString("Observer clock count "+(Double.toString(round(timePassed_p*10000)/10000.0))+"s",700,570);
- g2DjFrame.drawString("x-Pos / t-Pos: 0ls / 0s ",700,600);
- g2DjFrame.setColor(Color.BLUE);
- g2DjFrame.drawString("Blue clock count "+(Double.toString(round(clockTime*10000)/10000.0))+"s",1000,570);
- g2DjFrame.drawString("x Position "+(Double.toString(round(not_traveller_x_p*10000)/10000.0))+"ls",1000,600);
- g2DjFrame.drawString("t Position 0s",1000,620);
- g2DjFrame.drawString("Blue clock count "+(Double.toString(round(clockTime*10000)/10000.0))+"s",50,640);
- g2DjFrame.drawString("x Position 0ls",50,670);
- g2DjFrame.drawString("t Position "+(Double.toString(round(tPos*10000)/10000.0))+"s",50,690);
- strategyCanvas2.show();
- strategyCanvas1.show();
- strategyJFrame.show();
- g2Dcanvas1.dispose();
- g2Dcanvas2.dispose();
- g2DjFrame.dispose();
- }
- public void plotLightbeams() {
- g2Dcanvas1.setColor(Color.YELLOW);
- g2Dcanvas2.setColor(Color.YELLOW);
- g2Dcanvas1.drawLine(0,0,501,501);
- g2Dcanvas1.drawLine(0,501,501,0);
- g2Dcanvas2.drawLine(0,0,501,501);
- g2Dcanvas2.drawLine(0,501,501,0);
- }
- public void plotEvents( ){
- g2Dcanvas1.setFont(stringFont);
- g2Dcanvas2.setFont(stringFont);
- max_gamma = 1/(sqrt(1-pow(0.5,2)));
- temporary_gamma = 1/(sqrt(1-pow(v_rel,2)));
- timePassed_p = timePassed/max_gamma;
- if (stage==1 || stage == 2 ) { traveller_x = v_rel*timePassed; clockTime = timePassed_p/max_gamma;}
- if (stage==3 || stage==4 || stage==5) { traveller_x = v_rel*(timePassed - turnAroundTime) + turnAroundPosition;}
- if (stage==2) { not_traveller_x_p = - v_rel*timePassed_p; rest_length =- v_rel*timePassed_p*max_gamma; }
- if (stage==3 || stage==4) {
- not_traveller_x_p = rest_length/temporary_gamma;
- turnAroundPosition_p = not_traveller_x_p;
- turnAroundTime_p = timePassed_p;
- }
- if (stage==5) { not_traveller_x_p = -v_rel*(timePassed_p - turnAroundTime_p) + turnAroundPosition_p;}
- xPos = 0;
- tPos = temporary_gamma*v_rel*not_traveller_x_p;
- clockTime = tPos + timePassed;
- for (int i=0; i<eventsArraylist.size();i++){
- x=eventsArraylist.get(i).xPosInLightSeconds;
- t=eventsArraylist.get(i).timeInSeconds-timePassed;
- clockCounter = eventsArraylist.get(i).clockCounter;
- x_p = temporary_gamma*(x-traveller_x - v_rel * t);
- t_p = temporary_gamma*(t - (v_rel*(x-traveller_x)));
- if ((x<11 && x >-11) && (t <11 && t>-11)){
- g2Dcanvas1.setColor(Color.BLACK);
- if (x==5 || x==-5) { g2Dcanvas1.setColor(Color.GREEN);}
- if (x==0 ) { g2Dcanvas1.setColor(Color.BLUE);}
- g2Dcanvas1.drawString(Integer.toString((int)clockCounter),(int)(x*25+251-4),(int)(251+4-t*25));
- g2Dimg.setColor(Color.BLACK);
- if (x==5 || x==-5) { g2Dcanvas2.setColor(Color.GREEN); g2Dimg.setColor(Color.GREEN);}
- if (x==0 ) { g2Dcanvas2.setColor(Color.BLUE); g2Dimg.setColor(Color.BLUE);}
- g2Dcanvas2.drawString(Integer.toString((int)clockCounter),(int)(x_p*25+251-4),(int)(251+4-t_p*25));
- g2Dcanvas2.setColor(Color.BLACK);
- g2Dimg.setStroke(new BasicStroke(2));
- g2Dimg.drawLine((int)(x_p*25+251),(int)(251-t_p*25),(int)(x_p*25+251),(int)(251-t_p*25));
- }
- }
- for (int i=0; i<events_pArraylist.size();i++){
- x=events_pArraylist.get(i).xPosInLightSeconds;
- t=events_pArraylist.get(i).timeInSeconds-timePassed_p;
- if ((x<11 && x >-11) && (t <11 && t>-11) && (showWorldline==true)){
- clockCounter = events_pArraylist.get(i).clockCounter;
- g2Dcanvas2.setColor(Color.WHITE);
- g2Dcanvas2.drawString(Integer.toString((int)clockCounter),(int)(x*25+251-4),(int)(251+4-t*25));
- x_p = temporary_gamma*(x + v_rel * t)+traveller_x;
- t_p = temporary_gamma*(t + v_rel*x);
- g2Dcanvas1.setColor(Color.WHITE);
- g2Dcanvas1.drawString(Integer.toString((int)clockCounter),(int)(x_p*25+251-4),(int)(251+4-t_p*25));
- }
- }
- }
- public void createFrameAndCanvases(){
- jFrame = new JFrame();
- jFrame.setLayout(null);
- jFrame.setSize(1280,720);
- jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- jFrame.getContentPane().setBackground(new Color(110,110,111));
- jFrame.setResizable(true);
- jFrame.setIgnoreRepaint(true);
- button1 = new JButton("start/stop");
- button1.setBounds(500,580,100,100);
- button1.addActionListener(actionListener);
- button1.setActionCommand("start/stop");
- jFrame.add(button1);
- button2 = new JButton("reset");
- button2.setBounds(620,580,100,100);
- button2.addActionListener(actionListener);
- button2.setActionCommand("reset");
- button2.setVisible(true);
- jFrame.add(button2);
- canvas1 = new Canvas();
- canvas1.setSize(501,501);
- canvas1.setLocation(75,0);
- canvas1.setIgnoreRepaint(true);
- canvas1.setBackground(new Color(222,222,222));
- jFrame.add(canvas1);
- canvas2 = new Canvas();
- canvas2.setSize(501,501);
- canvas2.setLocation(1280-501-75,0);
- canvas2.setIgnoreRepaint(true);
- canvas2.setBackground(new Color(222,222,222));
- jFrame.add(canvas2);
- checkBox = new JCheckBox("show/hide paths",false);
- checkBox.addActionListener(actionListener);
- checkBox.setActionCommand("show/hide paths");
- checkBox.setBounds(750,580,200,20);
- jFrame.add(checkBox);
- checkBox2 = new JCheckBox("white clock (est.)worldline",true);
- checkBox2.addActionListener(actionListener);
- checkBox2.setActionCommand("white clock (est.)worldline");
- checkBox2.setBounds(750,600,200,20);
- jFrame.add(checkBox2);
- jFrame.setVisible(true);
- jFrame.createBufferStrategy(2);
- canvas1.createBufferStrategy(2);
- canvas2.createBufferStrategy(2);
- strategyCanvas1 = canvas1.getBufferStrategy();
- strategyCanvas2 = canvas2.getBufferStrategy();
- strategyJFrame = jFrame.getBufferStrategy();
- g2DjFrame = (Graphics2D) strategyJFrame.getDrawGraphics();
- g2Dcanvas1 = (Graphics2D) strategyCanvas1.getDrawGraphics();
- g2Dcanvas2 = (Graphics2D) strategyCanvas2.getDrawGraphics();
- }
- public void plotDiagrams() {
- g2Dcanvas1.setFont(stringFont2);
- g2Dcanvas2.setFont(stringFont2);
- g2Dcanvas1.setColor(Color.BLACK);
- g2Dcanvas2.setColor(Color.BLACK);
- g2Dcanvas1.drawLine(0,250,500,250);
- g2Dcanvas1.drawLine(250,0,250,500);
- g2Dcanvas2.drawLine(0,250,500,250);
- g2Dcanvas2.drawLine(250,0,250,500);
- int x,t;
- for (x=0; x<21;x++){
- if (x!=10) {
- g2Dcanvas1.drawLine(x*(500/20),245, x*(500/20),255);
- g2Dcanvas1.drawString(Integer.toString(x-10),x*(500/20)-5,268);
- g2Dcanvas2.drawLine(x*(500/20),245, x*(500/20),255);
- g2Dcanvas2.drawString(Integer.toString(x-10),x*(500/20)-5,268);
- }
- }
- for (t=0; t<21;t++){
- if (t!=10) {
- g2Dcanvas1.drawLine(245,t*(500/20), 255,t*(500/20));
- g2Dcanvas1.drawString(Integer.toString(10-t),258,t*(500/20)+5);
- g2Dcanvas2.drawLine(245,t*(500/20), 255,t*(500/20));
- g2Dcanvas2.drawString(Integer.toString(10-t),258,t*(500/20)+5);
- }
- }
- }
- public void generateEvents(){
- int i=0;
- int x,t,clockCounter;
- for (x=-40; x<41;x++){
- for (t=-40; t<41;t++){
- clockCounter = t;
- eventsArraylist.add( new Event(x,t,clockCounter));
- }
- }
- }
- public void generateEvents_p(){
- int i=0;
- int x,t,clockCounter;
- x=0;
- for (t=-40; t<41;t++){
- clockCounter = t;
- events_pArraylist.add( new Event_p(x,t,clockCounter));
- }
- }
- class Event_p {
- double xPosInLightSeconds;
- double timeInSeconds;
- double clockCounter;
- public Event_p(int x, int t, int cc) {
- xPosInLightSeconds = x;
- timeInSeconds = t;
- clockCounter = cc;
- }
- }
- class Event {
- double xPosInLightSeconds;
- double timeInSeconds;
- double clockCounter;
- public Event(int x, int t, int cc) {
- xPosInLightSeconds = x;
- timeInSeconds = t;
- clockCounter = cc;
- }
- }
- public void resetAll(){
- v_rel=0;
- timePassed=0;
- not_traveller_x_p = 0;
- traveller_x=0;
- deletePaths=false;
- stage = 1;
- g2Dimg.setBackground(new Color(0,0,0,0));
- g2Dimg.clearRect(0,0,501,501);
- lock = true;
- }
- JFrame jFrame;
- Canvas canvas1,canvas2;
- double turnAroundTime, turnAroundPosition;
- double traveller_x,traveller_t, not_traveller_x_p, not_traveller_t_p;
- double x,t,x_p,t_p,clockCounter;
- double rest_length;
- double timePassed_p, turnAroundPosition_p,turnAroundTime_p;
- double max_gamma, clockTime;
- double xPos, tPos;
- boolean lock=true, showPaths=false, showWorldline=true;
- BufferedImage bufferedImage = new BufferedImage(501, 501,BufferedImage.TYPE_INT_ARGB);
- Color backgroundColor = new Color(211,222,222);
- BufferStrategy strategyCanvas1,strategyCanvas2,strategyJFrame;
- Graphics2D g2Dcanvas1, g2Dcanvas2, g2DjFrame, g2Dimg = bufferedImage.createGraphics();;
- JButton button1,button2;
- JCheckBox checkBox, checkBox2;
- ArrayList<Event> eventsArraylist = new ArrayList<Event>();
- ArrayList<Event_p> events_pArraylist = new ArrayList<Event_p>();
- double temporary_gamma,v_rel,timePassed;
- Font stringFont = new Font( "SansSerif", Font.BOLD, 14 );
- Font stringFont2 = new Font( "SansSerif", Font.PLAIN, 10 );
- Font stringFont3 = new Font( "SansSerif", Font.PLAIN, 20 );
- ActionListener actionListener = new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- String str=e.getActionCommand();
- if (str.equals("show/hide paths")) {
- if (showPaths) {showPaths=false;} else {showPaths=true;};
- }
- if (str.equals("white clock (est.)worldline")) {
- if (showWorldline) {showWorldline=false;} else {showWorldline=true;};
- }
- if (str.equals("reset")) {
- resetAll();
- }
- if (str.equals("start/stop")){
- if (lock){lock=false;} else {lock=true;};
- }
- }
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement