SHARE
TWEET

Untitled

a guest Dec 14th, 2019 80 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. float f = 1;
  2.  
  3. public class object{
  4.  
  5.   float x;
  6.   float y;
  7.   color c;
  8.   boolean t;
  9.   object line;
  10.  
  11.   object(float x1, float y1, color c1, boolean t1, object line1){
  12.     x = x1;
  13.     y = y1;
  14.     c = c1;
  15.     t = t1;
  16.     line = line1;
  17.   }
  18.  
  19.   float xt(){return (f*f*(x-y)+x+y)/2/f;}
  20.   float yt(){return -(f*f*(x-y)-x-y)/2/f;}
  21.  
  22.   float spacetime(){
  23.    
  24.     if(line != null)
  25.       return float(round(sqrt((this.yt()-line.yt())*(this.yt()-line.yt())-(this.xt()-line.xt())*(this.xt()-line.xt()))*100))/100;
  26.     else
  27.       return float(round(sqrt(this.yt()*this.yt()-this.xt()*this.xt())*100))/100;
  28.    
  29.   }
  30.  
  31.   void drawline(){
  32.    
  33.     if(line != null)
  34.       line(line.xt()*scale,-line.yt()*scale,this.xt()*scale,-this.yt()*scale);
  35.     else
  36.       line(0,0,this.xt()*scale,-this.yt()*scale);
  37.    
  38.   }
  39.  
  40.  
  41.  
  42. }
  43.  
  44. void setf(int a){
  45.  
  46.  
  47.   if(objects.get(a).line == null){
  48.     if(objects.get(a).y > 0 && objects.get(a).x/objects.get(a).y > -1 && objects.get(a).x/objects.get(a).y < 1)
  49.       ft = sqrt(objects.get(a).x+objects.get(a).y)/sqrt(objects.get(a).y-objects.get(a).x);
  50.   }else if(objects.get(a).y-objects.get(a).line.y > 0){
  51.     if((objects.get(a).x-objects.get(a).line.x)/(objects.get(a).y-objects.get(a).line.y) > -1 && (objects.get(a).x-objects.get(a).line.x)/(objects.get(a).y-objects.get(a).line.y) < 1)
  52.       ft = sqrt(-objects.get(a).line.x-objects.get(a).line.y+objects.get(a).x+objects.get(a).y)/sqrt(objects.get(a).line.x-objects.get(a).line.y-objects.get(a).x+objects.get(a).y);
  53.   }
  54.  
  55. }
  56.  
  57. ArrayList<object> objects = new ArrayList<object>();
  58. float ft = 1;
  59.  
  60. int sel = -1;
  61.  
  62. boolean selectingColor = false;
  63.  
  64. boolean placesnap = true;
  65. boolean hyperbolae = true;
  66. boolean hasTrail = true;
  67.  
  68. void keyPressed(){
  69.  
  70.   if(key == CODED){
  71.    
  72.     if(keyCode == RIGHT)
  73.       //sel++;
  74.       ft *= 1.1;
  75.     else if(keyCode == LEFT)
  76.       ft /= 1.1;
  77.       //sel--;
  78.        
  79.     if(sel < 0)
  80.       sel = objects.size()-1;
  81.     if(sel > objects.size()-1)
  82.       sel = 0;
  83.      
  84.     if(keyCode == UP)
  85.       scale /= 1.1;
  86.     else if(keyCode == DOWN)
  87.       scale *= 1.1;
  88.    
  89.   }
  90.  
  91.  
  92.   if(key == 32 && objects.size() > 0 && sel != -1 && objects.get(sel).t)
  93.     setf(sel);
  94.      
  95.   if(keyCode == 82){
  96.     ft = 1;
  97.     objects = new ArrayList<object>();
  98.     sel = -1;
  99.     currentColor = color(255,0,0);
  100.    
  101.   }
  102.   if(keyCode == 71)
  103.     placesnap = false;
  104.   if(keyCode == 70)
  105.     ft = 1;
  106.   if(keyCode == 72)
  107.     hyperbolae = !hyperbolae;
  108.   if(keyCode == 67)
  109.     selectingColor = true;
  110.   if(keyCode == 68 && sel != -1){
  111.    
  112.     objects.remove(sel);
  113.     sel = -1;
  114.    
  115.   }
  116.   if(keyCode == 83){
  117.    
  118.     boolean found = false;
  119.      
  120.       for(int i = 0; i < objects.size(); i++){
  121.        
  122.         if(mouseX-translatex > objects.get(i).xt()*scale-scale/2 && mouseX-translatex < objects.get(i).xt()*scale+scale/2 && -mouseY+translatey > objects.get(i).yt()*scale-scale/2 && -mouseY+translatey < objects.get(i).yt()*scale+scale/2){
  123.           sel = i;
  124.           found = true;
  125.         }
  126.        
  127.         if(found == false)
  128.           sel = -1;
  129.        
  130.       }
  131.    
  132.   }
  133.   if(keyCode == 84){
  134.    
  135.     hasTrail = false;
  136.    
  137.   }
  138.   if(keyCode == 73){
  139.    
  140.     if(sel != -1)
  141.       currentColor = objects.get(sel).c;
  142.    
  143.   }
  144.    
  145.  
  146.  
  147. }
  148.  
  149. void keyReleased(){
  150.  
  151.   if(keyCode == 71)
  152.     placesnap = true;
  153.   if(keyCode == 67)
  154.     selectingColor = false;
  155.   if(keyCode == 84){
  156.    
  157.     hasTrail = true;
  158.    
  159.   }
  160.  
  161. }
  162.  
  163. int translatex, translatey;
  164.  
  165.  
  166. void setup(){
  167.  
  168.   size(1200,800);
  169.   surface.setResizable(true);
  170.   currentColor = color(255,0,0);
  171.  
  172. }
  173.  
  174.  
  175.  
  176. int scale = 40;
  177.  
  178.  
  179.  
  180. void drawHyperbolae(){
  181.  
  182.   int acc = 60;
  183.  
  184.   for(int i = -1; i >= -height/1.2/scale; i--){
  185.     strokeWeight(2);
  186.    
  187.    
  188.     for(int j = -translatex; j <= translatex; j += acc){
  189.      
  190.       stroke(0,70,140);
  191.      
  192.       line(j,-sqrt(i*i*scale*scale+j*j),j+acc,-sqrt(i*i*scale*scale+(j+acc)*(j+acc)));
  193.      
  194.       stroke(86,40,140);
  195.       line(j,sqrt(i*i*scale*scale+j*j),j+acc,sqrt(i*i*scale*scale+(j+acc)*(j+acc)));
  196.       line(sqrt(i*i*scale*scale+j*j),j,sqrt(i*i*scale*scale+(j+acc)*(j+acc)),j+acc);
  197.       line(-sqrt(i*i*scale*scale+j*j),j,-sqrt(i*i*scale*scale+(j+acc)*(j+acc)),j+acc);
  198.      
  199.     }
  200.    
  201.    
  202.   }
  203.  
  204.  
  205. }
  206.  
  207. void drawObjects(){
  208.  
  209.   textAlign(LEFT);
  210.  
  211.   float xt, yt;
  212.  
  213.   stroke(255);
  214.   strokeWeight(2);
  215.  
  216.   line(-translatex,0,translatex,0);
  217.   line(0,-height,0,height/4);
  218.  
  219.   for(int i = 0; i < objects.size(); i++){
  220.    
  221.     stroke(objects.get(i).c);
  222.     strokeWeight(scale/8);
  223.    
  224.     if(objects.get(i).t)
  225.       objects.get(i).drawline();
  226.    
  227.   }
  228.  
  229.   for(int i = 0; i < objects.size(); i++){
  230.    
  231.     xt = objects.get(i).xt();
  232.     yt = objects.get(i).yt();
  233.    
  234.     fill(255);
  235.     stroke(255);
  236.     strokeWeight(0);
  237.    
  238.     if(i == sel){
  239.      
  240.       triangle(xt*scale,-yt*scale+20,xt*scale-10,-yt*scale+30,xt*scale+10,-yt*scale+30);
  241.       textSize(30);
  242.       text("(" + float(round(xt*100))/100 + "," + float(round(yt*100))/100 + ")",-translatex+10,-height/1.35+30);
  243.       textSize(15);
  244.      
  245.       if(objects.get(i).t)
  246.         text("Spacetime interval: " + objects.get(i).spacetime(),-translatex+10,-height/1.35+55);
  247.        
  248.       stroke(255,255,0,100);
  249.       strokeWeight(3);
  250.      
  251.       for(int j = 0; j < max(width,height); j += 20){
  252.    
  253.         line(j+xt*scale,-j-yt*scale,j+10+xt*scale,-j-10-yt*scale);
  254.         line(-j+xt*scale,-j-yt*scale,-j-10+xt*scale,-j-10-yt*scale);
  255.    
  256.       }
  257.      
  258.      
  259.     }
  260.    
  261.    
  262.    
  263.     fill(objects.get(i).c);
  264.     stroke(255);
  265.     strokeWeight(scale/20);
  266.    
  267.     textSize(15);
  268.     text("(" + float(round(xt*100))/100 + "," + float(round(yt*100))/100 + ")",xt*scale+15,-yt*scale+5);
  269.    
  270.    
  271.     ellipse(xt*scale,-yt*scale,scale/2,scale/2);
  272.    
  273.     fill(255);
  274.     strokeWeight(0);
  275.      
  276.    
  277.   }
  278.  
  279. }
  280.  
  281. float placex, placey;
  282.  
  283. void drawPreview(){
  284.  
  285.   float modx,mody;
  286.  
  287.   modx = translatex % scale;
  288.   mody = translatey % scale;
  289.  
  290.   float xx = mouseX-modx, yy = mouseY-mody;
  291.  
  292.   if(placesnap){
  293.    
  294.     placex = floor((xx+scale/2)/scale)*scale+modx;
  295.     placey = floor((yy+scale/2)/scale)*scale+mody;
  296.    
  297.   }
  298.   else{
  299.    
  300.     placex = mouseX;
  301.     placey = mouseY;
  302.    
  303.   }
  304.  
  305.   fill(255,255,255,100);
  306.   strokeWeight(0);
  307.   stroke(255,255,255,100);
  308.  
  309.   ellipse(placex,placey,10,10);
  310.   placex -= translatex;
  311.   placey -= translatey;
  312.   placey = -placey;
  313.  
  314.  
  315.  
  316.  
  317.  
  318. }
  319.  
  320. void mouseClicked(){
  321.  
  322.   if(selectingColor){
  323.    
  324.     if(mouseX < 200 && mouseY > height - 100){
  325.      
  326.       colorMode(HSB,200);
  327.      
  328.       currentColor = color(mouseX,200,200,200);
  329.       colorMode(RGB,255);
  330.      
  331.     }
  332.    
  333.   }else{
  334.  
  335.  
  336.     if(mouseButton == LEFT){
  337.    
  338.       placex /= float(scale);
  339.       placey /= float(scale);
  340.      
  341.       float g = 1/f;
  342.      
  343.       float ox = (placex*g*g+placex-placey*g*g+placey)/(2*g);
  344.       float oy = (-placex*g*g+placex+placey*g*g+placey)/(2*g);
  345.      
  346.       if(sel == -1)
  347.         objects.add(new object(ox,oy,currentColor,hasTrail,null));
  348.       else
  349.         objects.add(new object(ox,oy,currentColor,hasTrail,objects.get(sel)));
  350.      
  351.       sel = objects.size()-1;
  352.  
  353.  
  354.   }
  355.   }
  356. }
  357.  
  358. color currentColor;
  359.  
  360.  
  361. void colorSelect(){
  362.  
  363.   translate(0,height);
  364.   strokeWeight(8);
  365.  
  366.   colorMode(HSB,200);
  367.  
  368.   for(int i = 0; i < 200; i += 4){
  369.    
  370.     for(int j = 0; j < 100; j += 4){
  371.      
  372.       stroke(i,200,200,200);
  373.       point(i,-j);
  374.      
  375.     }
  376.    
  377.   }
  378.  
  379.   translate(0,-height);
  380.   colorMode(RGB, 255);
  381.  
  382.   stroke(255);
  383.   strokeWeight(2);
  384.  
  385.   line(mouseX-10,mouseY,mouseX-5,mouseY);
  386.   line(mouseX+10,mouseY,mouseX+5,mouseY);
  387.   line(mouseX,mouseY+10,mouseX,mouseY+5);
  388.   line(mouseX,mouseY-10,mouseX,mouseY-5);
  389.  
  390.  
  391. }
  392.  
  393.  
  394.  
  395. void draw(){
  396.  
  397.   translatex = width/2;
  398.   translatey = int(1.5*height/2);
  399.  
  400.   f = lerp(f, ft, 0.3);
  401.  
  402.   background(0,50,100);
  403.  
  404.   translate(translatex,translatey);
  405.  
  406.  
  407.   if(hyperbolae)
  408.     drawHyperbolae();
  409.  
  410.   stroke(255);
  411.   strokeWeight(2);
  412.  
  413.   for(float i = -height/scale; i <= height/4/scale; i++){
  414.     stroke(255);
  415.     strokeWeight(2);
  416.     line(-6,i*scale,6,i*scale);
  417.    
  418.     stroke(255,20);
  419.     line(-translatex,i*scale,translatex,i*scale);
  420.    
  421.    
  422.   }
  423.  
  424.   for(int i = -translatex/scale; i <= translatex/scale; i++){
  425.     stroke(255);
  426.     strokeWeight(2);
  427.     line(i*scale,-6,i*scale,6);
  428.    
  429.     stroke(255,20);
  430.     line(i*scale,-height,i*scale,height/4);
  431.    
  432.    
  433.   }
  434.  
  435.   stroke(255,255,0);
  436.   strokeWeight(3);
  437.      
  438.   for(int j = 0; j < max(width,height); j += 20){
  439.    
  440.     line(j,-j,j+10,-j-10);
  441.     line(-j,-j,-j-10,-j-10);
  442.    
  443.   }
  444.  
  445.  
  446.  
  447.   stroke(0,255,0,100);
  448.   strokeWeight(5);
  449.   line(0,0,-(f*f*100-100)/(2*f)*scale,-(f*f*100+100)/(2*f)*scale);
  450.  
  451.   drawObjects();
  452.  
  453.   translate(-translatex,-translatey);
  454.  
  455.   if(!selectingColor)
  456.     drawPreview();
  457.  
  458.   fill(255);
  459.  
  460.   textAlign(RIGHT);
  461.   textSize(25);
  462.  
  463.   text("CONTROLS",width-15,30);
  464.  
  465.   textSize(15);
  466.   text("Arrow keys to switch selected object\n Space to switch perspective to selected object\n R to reset\n G to toggle grid-snap\n F to reset perspective\n H to toggle hyperbolae\n D to delete an object\n Hold T to disable line connection\n I to copy selected color\n\n S to select an object\n (hover over it, otherwise it deselects)\n\n C to toggle color change mode\n (click on the palette)",width-15,50);
  467.  
  468.   if(selectingColor)
  469.     colorSelect();
  470.    
  471.   strokeWeight(0);
  472.  
  473.   fill(currentColor);
  474.   rect(width-60,height-60,40,40);
  475.  
  476.  
  477.  
  478.    
  479. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top