diff --git a/geometric_separators.pde b/geometric_separators.pde index 169c56f..f408aa7 100644 --- a/geometric_separators.pde +++ b/geometric_separators.pde @@ -1,3 +1,5 @@ +import java.util.*; + // Reset button coordinates int reset_x = 140; int reset_y = 460; @@ -11,9 +13,11 @@ int calc_h = 25; // Button Shapes PShape reset; PShape calculate; -// Input list +// Input lists ArrayList input = new ArrayList(); - +ArrayList inputX, inputY; +// Misc +Comparator pointComparator; // Setup void setup() { background(255); @@ -22,24 +26,47 @@ void setup() { reset = createShape(RECT, reset_x, reset_y, reset_w, reset_h); calculate = createShape(RECT, calc_x, calc_y, calc_w, calc_h); noLoop(); + // Define new comparator + pointComparator = new Comparator() { + public int compare(Float p1, Float p2) { + if (p1 < p2) { + return -1; + } + else if (p2 < p1) { + return 1; + } + else { + return 0; + } + } + }; } // On mouse press void mousePressed() { // If mouse presses reset button if ((mouseX >= reset_x && mouseX <= (reset_x + reset_w)) && - (mouseY >= reset_y && mouseY <= (reset_y + reset_h))) { - // Reset input and background - input.clear(); + (mouseY >= reset_y && mouseY <= (reset_y + reset_h))) { + // Reset input and background + input.clear(); } // If mouse presses calculate button - else if ((mouseX >= reset_x && mouseX <= (reset_x + reset_w)) && - (mouseY >= reset_y && mouseY <= (reset_y + reset_h))) { - // Get sorted input points + else if ((mouseX >= calc_x && mouseX <= (calc_x + calc_w)) && + (mouseY >= calc_y && mouseY <= (calc_y + calc_h))) { + // Build component lists + inputX = new ArrayList(); + inputY = new ArrayList(); + for (PVector point : input) { + inputX.add(point.x); + inputY.add(point.y); + } + // Sort lists + Collections.sort(inputX, pointComparator); + Collections.sort(inputY, pointComparator); } else { - PVector new_point = new PVector(mouseX, mouseY); - input.add(new_point); + PVector new_point = new PVector(mouseX, mouseY); + input.add(new_point); } redraw(); } @@ -47,26 +74,45 @@ void mousePressed() { // Estimate centerpoint void approxCenter(ArrayList input) { if (input.size() == 1) { - // Do nothing + // Do nothing } else { - // Sample points - + // Do nothing } } // Estimate the geometric median - dynamic programming void geomMedian() { // Memoization hash tables - HashMap left = new HashMap(); - HashMap right = new HashMap(); - HashMap up = new HashMap(); - HashMap down = new HashMap(); - // Sum of squares values - ArrayList leftSq = new ArrayList(); - ArrayList rightSq = new ArrayList(); - ArrayList upSq = new ArrayList(); - ArrayList downSq = new ArrayList(); + HashMap xMemoize = new HashMap(); + HashMap yMemoize = new HashMap(); + // Calculate for x-axis + // For each point + for (int i = 0; i < inputX.size(); i++) { + float currentPoint = inputX.get(i); + ArrayList leftSquares = new ArrayList(); + ArrayList rightSquares = new ArrayList(); + ArrayList upSquares = new ArrayList(); + ArrayList downSquares = new ArrayList(); + // Get distance to every previous point + } +} + +// Calculate the distance with the input, memoization +void calcDist(float point, ArrayList input, HashMap memoize) { + if (memoize.contains(currentPoint)) { + // Reuse solution + return memoize.get(currentPoint); + } + else { + int dist = point - prevPoint; + for (int j = 0; j < i; j++) { + float prevPoint = input.get(j); + sum += currentPoint - prevPoint; + } + memoize.put(currentPoint, sum); + return sum; + } } // Draw @@ -78,7 +124,7 @@ void draw() { text("Reset.", reset_x + 30, reset_y + 15); text("Calculate.", calc_x + 25, calc_y + 15); for (PVector point : input) { - strokeWeight(4); - point(point.x, point.y); + strokeWeight(4); + point(point.x, point.y); } }