MrMusAddict

Satisfactory Graph Theory Proof-Of-Concept

Oct 22nd, 2024
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.46 KB | None | 0 0
  1. NHandler nodeHandler;
  2.  
  3. Node test;
  4.  
  5. void setup() {
  6.   size(1920, 1080);
  7.   nodeHandler = new NHandler();
  8. }
  9.  
  10. void draw() {
  11.   background(51);
  12.  
  13.   if(frameCount % 30 == 0) nodeHandler.pulseQTYs();
  14.  
  15.   nodeHandler.render();
  16.  
  17. }
  18.  
  19.  
  20.  
  21.  
  22. class Node {
  23.   PVector pos;
  24.   color col;
  25.  
  26.   color ringCol;
  27.   float ringSize;
  28.  
  29.   int nodeID;
  30.  
  31.   NHandler handler;
  32.  
  33.   ArrayList<Integer> parents;
  34.   ArrayList<Integer> children;
  35.  
  36.   boolean valid;
  37.  
  38.   int trueQTY;
  39.   int infiniteRate;
  40.   int reserveQTY1;
  41.   int reserveQTY2;
  42.  
  43.   int pulseCount;
  44.  
  45.   Node(NHandler nh, int posx, int posy) {
  46.     handler = nh;
  47.     nodeID = handler.NodeIDsCreated;
  48.     valid = true;
  49.     parents = new ArrayList<Integer>();
  50.     children = new ArrayList<Integer>();
  51.     pos = new PVector(posx, posy);
  52.     trueQTY = 0;
  53.     reserveQTY1 = 0;
  54.     reserveQTY2 = 0;
  55.     infiniteRate = 15;
  56.   }
  57.  
  58.   void setValid(boolean b) {
  59.     valid = b;
  60.   }
  61.  
  62.   void addParent(int parentID) {
  63.     parents.add(parentID);
  64.   }
  65.  
  66.   void addChild(int childID) {
  67.     children.add(childID);
  68.   }
  69.  
  70.   void tryRemoveParent(int parentID) {
  71.     for (int i = parents.size()-1; i >= 0; i--) {
  72.       if (parents.get(i) == parentID) {
  73.         parents.remove(i);
  74.       }
  75.     }
  76.   }
  77.  
  78.   void tryRemoveChild(int childID) {
  79.     for (int i = children.size()-1; i >= 0; i--) {
  80.       if (children.get(i) == childID) {
  81.         children.remove(i);
  82.       }
  83.     }
  84.   }
  85.  
  86.   void show(color f) {
  87.     stroke(0);
  88.     fill(f);
  89.     circle(pos.x, pos.y, handler.nodeSize);
  90.     fill(0);
  91.     stroke(0);
  92.     textSize(handler.textSize);
  93.     if (parents.size()==0) {
  94.       text(infiniteRate, pos.x, pos.y);
  95.     } else {
  96.       text(trueQTY, pos.x, pos.y);
  97.     }
  98.   }
  99.  
  100.   void pulseToChildren() {
  101.     if (parents.size() == 0) {
  102.       trueQTY = infiniteRate;
  103.     }
  104.     if (children.size()>0) {
  105.       for (int i = trueQTY; i > 0; i--) {
  106.         pulseCount++;
  107.         handler.getNodeByID(children.get(pulseCount % (children.size()))).reserveQTY1++;
  108.         trueQTY--;
  109.       }
  110.     } else {
  111.       trueQTY = 0;
  112.       reserveQTY2 = 0;
  113.     }
  114.   }
  115. }
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122. class NHandler {
  123.   int NodeIDsCreated;
  124.   ArrayList<Node> nodes;
  125.   ArrayList<PVector> relationships;
  126.  
  127.   Node selected;
  128.   Node moving;
  129.  
  130.   float nodeSize;
  131.   float textSize;
  132.  
  133.   boolean deleting;
  134.  
  135.   NHandler() {
  136.     nodes = new ArrayList<Node>();
  137.     NodeIDsCreated = 0;
  138.     relationships = new ArrayList<PVector>();
  139.     nodeSize = 75.0;
  140.     textSize = nodeSize / 4.0;
  141.     deleting = false;
  142.   }
  143.  
  144.   void addNode(int numToAdd) {
  145.     for (int i = 0; i < numToAdd; i++) {
  146.       NodeIDsCreated++;
  147.       nodes.add(new Node(this, 0, 0));
  148.     }
  149.   }
  150.  
  151.   void addNode(int numToAdd, int posx, int posy) {
  152.     for (int i = 0; i < numToAdd; i++) {
  153.       NodeIDsCreated++;
  154.       nodes.add(new Node(this, posx, posy));
  155.     }
  156.   }
  157.  
  158.   boolean validID(int id) {
  159.     boolean temp = false;
  160.     for (Node n : nodes) {
  161.       if (n.nodeID == id && n.valid) {
  162.         temp = true;
  163.         break;
  164.       }
  165.     }
  166.     return temp;
  167.   }
  168.  
  169.   void createRelationship(Node parent, Node child) {
  170.     int pID = parent.nodeID;
  171.     int cID = child.nodeID;
  172.     if (pID != cID) {
  173.  
  174.  
  175.       parent.children.add(cID);
  176.       child.parents.add(pID);
  177.       relationships.add(new PVector(pID, cID));
  178.     }
  179.   }
  180.  
  181.   void createOrRemoveRelationship(int parentID, int childID) {
  182.     if (parentID != childID) {
  183.       if (!containsRelationship(parentID, childID)) {
  184.         getNodeByID(parentID).children.add(childID);
  185.         getNodeByID(childID).parents.add(parentID);
  186.         relationships.add(new PVector(parentID, childID));
  187.       } else {
  188.         breakSpecificRelationship(parentID, childID);
  189.       }
  190.     } else {
  191.       println("Same ID (" + parentID + ", " + childID);
  192.     }
  193.   }
  194.  
  195.   Node getNodeByID(int nID) {
  196.     Node temp = null;
  197.  
  198.     for (Node n : nodes) {
  199.       if (n.nodeID == nID) return n;
  200.     }
  201.  
  202.     return temp;
  203.   }
  204.  
  205.   boolean containsRelationship(int parID, int chiID) {
  206.     for (PVector r : relationships) {
  207.       if (r.x == parID && r.y == chiID) {
  208.         return true;
  209.       }
  210.     }
  211.     return false;
  212.   }
  213.  
  214.   void breakAllRelationshipsOfNode(Node n) {
  215.     for (int i = relationships.size()-1; i >= 0; i--) {
  216.       if (relationships.get(i).x == n.nodeID || relationships.get(i).y == n.nodeID) {
  217.         int parID = int(relationships.get(i).x);
  218.         int chiID = int(relationships.get(i).y);
  219.  
  220.         getNodeByID(parID).tryRemoveChild(chiID);
  221.         getNodeByID(chiID).tryRemoveParent(parID);
  222.         relationships.remove(i);
  223.       }
  224.     }
  225.   }
  226.  
  227.   void breakAllRelationshipsOfNodeID(int nID) {
  228.     for (int i = relationships.size()-1; i >= 0; i--) {
  229.       if (relationships.get(i).x == nID || relationships.get(i).y == nID) {
  230.         int parID = int(relationships.get(i).x);
  231.         int chiID = int(relationships.get(i).y);
  232.  
  233.         getNodeByID(parID).tryRemoveChild(chiID);
  234.         getNodeByID(chiID).tryRemoveParent(parID);
  235.         relationships.remove(i);
  236.       }
  237.     }
  238.   }
  239.  
  240.   void breakSpecificRelationship(int pID, int cID) {
  241.     getNodeByID(pID).tryRemoveChild(cID);
  242.     getNodeByID(cID).tryRemoveParent(pID);
  243.     for (int i = relationships.size()-1; i >= 0; i--) {
  244.       if (relationships.get(i).x == pID && relationships.get(i).y == cID) {
  245.         relationships.remove(i);
  246.       }
  247.     }
  248.   }
  249.  
  250.   void clearAllRelationships() {
  251.     for (Node n : nodes) {
  252.       breakAllRelationshipsOfNode(n);
  253.     }
  254.   }
  255.  
  256.   Node checkLeftClickingNode() {
  257.     Node temp = null;
  258.  
  259.     float distance = width*height;
  260.     int nID = 0;
  261.  
  262.     for (Node n : nodes) {
  263.       if (dist(mouseX, mouseY, n.pos.x, n.pos.y) < distance) {
  264.         distance = dist(mouseX, mouseY, n.pos.x, n.pos.y);
  265.         nID = n.nodeID;
  266.       }
  267.     }
  268.  
  269.     if (distance <= nodeSize/2.0) {
  270.       temp = getNodeByID(nID);
  271.     }
  272.  
  273.     return temp;
  274.   }
  275.  
  276.   void selectNode() {
  277.     float distance = width*height;
  278.     int nID = 0;
  279.  
  280.     for (Node n : nodes) {
  281.       if (dist(mouseX, mouseY, n.pos.x, n.pos.y) < distance) {
  282.         distance = dist(mouseX, mouseY, n.pos.x, n.pos.y);
  283.         nID = n.nodeID;
  284.       }
  285.     }
  286.  
  287.     if (distance <= nodeSize/2.0) {
  288.       selected = getNodeByID(nID);
  289.     }
  290.   }
  291.  
  292.   void processSelection() {
  293.     if (selected == null) {
  294.       selectNode();
  295.     } else {
  296.       tryStartRelationship();
  297.       selected = null;
  298.     }
  299.   }
  300.  
  301.   void tryStartRelationship() {
  302.     float distance = width*height;
  303.     int nID = 0;
  304.  
  305.     for (Node n : nodes) {
  306.       if (dist(mouseX, mouseY, n.pos.x, n.pos.y) < distance) {
  307.         distance = dist(mouseX, mouseY, n.pos.x, n.pos.y);
  308.         nID = n.nodeID;
  309.       }
  310.     }
  311.  
  312.     if (distance <= nodeSize/2.0) {
  313.       createOrRemoveRelationship(selected.nodeID, nID);
  314.       println(relationships);
  315.     }
  316.   }
  317.  
  318.   void render() {
  319.  
  320.     update();
  321.  
  322.     stroke(255);
  323.     fill(0,0);
  324.     for (PVector r : relationships) {
  325.       PVector p1 = getNodeByID(int(r.x)).pos;
  326.       PVector p2 = getNodeByID(int(r.y)).pos;
  327.       PVector deltaP1 = new PVector(p2.x - p1.x, p2.y-p1.y).normalize().mult(nodeSize/2.0);
  328.       PVector p1f = new PVector(p1.x+deltaP1.x, p1.y+deltaP1.y);
  329.       float disty = dist(p1.x, p1.y, p2.x, p2.y)/2.0;
  330.       float yOff = max(log(abs(p2.y - p1.y)+1)*disty,200);
  331.       curve(p1f.x - deltaP1.x*5,  p1f.y - deltaP1.y*5, p1f.x, p1f.y, p2.x, p2.y-nodeSize/2.0, p2.x, p2.y + yOff);
  332.     }
  333.  
  334.     stroke(0);
  335.     for (Node n : nodes) {
  336.       color fColor;
  337.       if (n == selected) {
  338.         fColor = color(0, 0, 255);
  339.       } else {
  340.         fColor = color(255);
  341.       }
  342.       n.show(fColor);
  343.     }
  344.  
  345.     stroke(0);
  346.     for (PVector r : relationships) {
  347.       PVector p1 = getNodeByID(int(r.x)).pos;
  348.       PVector p2 = getNodeByID(int(r.y)).pos;
  349.  
  350.       PVector arrow = new PVector(p2.x-p1.x, p2.y-p1.y).normalize().mult(nodeSize/2.0);
  351.  
  352.       line(p1.x, p1.y, p1.x+arrow.x, p1.y+arrow.y);
  353.     }
  354.   }
  355.  
  356.   void update() {
  357.     if (deleting){
  358.      deleteSelected();
  359.     }
  360.     if (moving != null) {
  361.       moving.pos = new PVector(mouseX - (mouseX % (nodeSize/2.0)), mouseY - (mouseY % (nodeSize/2.0)));
  362.     }
  363.   }
  364.  
  365.   void pulseQTYs() {
  366.     for (Node n : nodes) {
  367.       n.pulseToChildren();
  368.     }
  369.  
  370.     for (Node n : nodes) {
  371.       n.trueQTY = n.reserveQTY1 + n.reserveQTY2;
  372.       n.reserveQTY1 = 0;
  373.       n.reserveQTY2 = 0;
  374.     }
  375.   }
  376.  
  377.   void clearQTYs() {
  378.     for (Node n : nodes) {
  379.       n.trueQTY = 0;
  380.     }
  381.   }
  382.  
  383.   void deleteSelected() {
  384.     if (selected != null) {
  385.       for (int i = nodes.size()-1; i>=0; i--) {
  386.         if (selected.nodeID == nodes.get(i).nodeID) {
  387.           println("deleting");
  388.           breakAllRelationshipsOfNodeID(selected.nodeID);
  389.           selected = null;
  390.           nodes.remove(i);
  391.           deleting = false;
  392.           break;
  393.         }
  394.       }
  395.     }
  396.   }
  397.  
  398.   void scheduleDelete(){
  399.     deleting = true;
  400.   }
  401. }
  402.  
  403. void mousePressed() {
  404.   if (mouseButton == LEFT) {
  405.     if (nodeHandler.checkLeftClickingNode() == null) {
  406.       nodeHandler.addNode(1, mouseX, mouseY);
  407.     } else {
  408.       nodeHandler.moving = nodeHandler.checkLeftClickingNode();
  409.     }
  410.   }
  411.  
  412.   if (mouseButton == RIGHT) {
  413.     nodeHandler.processSelection();
  414.   }
  415. }
  416.  
  417. void mouseReleased() {
  418.   if (mouseButton == LEFT) {
  419.     nodeHandler.moving = null;
  420.   }
  421. }
  422.  
  423. void keyPressed() {
  424.   if (key == ' ') {
  425.     nodeHandler.pulseQTYs();
  426.   }
  427.   if (key == 'c') {
  428.     nodeHandler.clearQTYs();
  429.   }
  430.  
  431.   if (key == DELETE) {
  432.       println("Attempting Delete");
  433.       nodeHandler.scheduleDelete();
  434.    
  435.   }
  436. }
  437.  
Add Comment
Please, Sign In to add comment