From d5846247917106e0d06040b6dc2cc5922e490721 Mon Sep 17 00:00:00 2001 From: Sandy Noble Date: Mon, 28 Mar 2016 15:37:20 +0100 Subject: [PATCH] Made polygonizer changeable, and polygonizerLength too. Also fixed the machine origin while zooming, yep - they said it couldn't be done. I done it. --- DisplayMachine.pde | 43 ++++++++++++++++-------- controlsActions.pde | 28 +++++++++++++++- controlsSetup.pde | 42 +++++++++++++++++++++--- drawing.pde | 12 ++++--- polargraphcontroller.pde | 71 +++++++++++++++++++++++++++++++++------- 5 files changed, 161 insertions(+), 35 deletions(-) diff --git a/DisplayMachine.pde b/DisplayMachine.pde index 1e770fc..b29b637 100644 --- a/DisplayMachine.pde +++ b/DisplayMachine.pde @@ -316,6 +316,10 @@ class DisplayMachine extends Machine { drawExtractedPixelCentres(); } + if (displayingGridSpots) + { + drawGridIntersections(); + } if (displayingDensityPreview) { drawExtractedPixelDensities(); @@ -532,10 +536,13 @@ class DisplayMachine extends Machine beginShape(); inShape = true; } +// PVector nativeCoords = asNativeCoords(inSteps(p)); +// println(j + "! Adding point " + nativeCoords); + p = scaleToScreen(p); stroke(strokeColour); vertex(p.x, p.y); -// ellipse(p.x, p.y, 3, 3); +// ellipse(p.x, p.y, 2, 2); } else { @@ -660,10 +667,18 @@ class DisplayMachine extends Machine */ public void drawRows() { - PVector mVect = getMouseVector(); - + float rowThickness = inMM(getGridSize()) * getScaling(); + rowThickness = (rowThickness < 1.0) ? 1.0 : rowThickness; + strokeWeight(rowThickness); + stroke(150, 200, 255, 50); + strokeCap(SQUARE); + drawRow(getMouseVector(), true, true); + noStroke(); + } + + public void drawRow(PVector mouse, boolean left, boolean right) { // scale it to find out the coordinates on the machine that the mouse is pointing at. - mVect = scaleToDisplayMachine(mVect); + PVector mVect = scaleToDisplayMachine(mouse); // convert it to the native coordinates system mVect = convertToNative(mVect); // snap it to the grid @@ -674,17 +689,15 @@ class DisplayMachine extends Machine // and finally, because scaleToScreen also allows for the machine position (offset), subtract it. mVect.sub(getOffset()); - float rowThickness = inMM(getGridSize()) * getScaling(); - rowThickness = (rowThickness < 1.0) ? 1.0 : rowThickness; - strokeWeight(rowThickness); - stroke(150, 200, 255, 50); - strokeCap(SQUARE); - float dia = mVect.x*2; - arc(getOutline().getLeft(), getOutline().getTop(), dia, dia, 0, 1.57079633); + if (left) { + arc(getOutline().getLeft(), getOutline().getTop(), dia, dia, 0, 1.57079633); + } dia = mVect.y*2; - arc(getOutline().getRight(), getOutline().getTop(), dia, dia, 1.57079633, 3.14159266); + if (right) { + arc(getOutline().getRight(), getOutline().getTop(), dia, dia, 1.57079633, 3.14159266); + } } @@ -701,7 +714,11 @@ class DisplayMachine extends Machine line(scaledPos.x-1, scaledPos.y+1, scaledPos.x+1, scaledPos.y-1); } } - + + void drawGridIntersections() + { +// println("oh"); + } int pixel_maxDensity(float penSize, float rowSizeInMM) { diff --git a/controlsActions.pde b/controlsActions.pde index bb71a5a..409c737 100644 --- a/controlsActions.pde +++ b/controlsActions.pde @@ -163,12 +163,17 @@ void button_mode_liveConfirmDraw() float scaling = getDisplayMachine().inMM(getDisplayMachine().getImageFrame().getWidth()) / captureShape.getWidth(); PVector position = new PVector(getDisplayMachine().inMM(getDisplayMachine().getImageFrame().getPosition().x), getDisplayMachine().inMM(getDisplayMachine().getImageFrame().getPosition().y)); - + + int oldPolygonizer = polygonizer; + polygonizer = RG.ADAPTATIVE; + setupPolygonizer(); sendVectorShapes(captureShape, scaling, position, PATH_SORT_CENTRE_FIRST); button_mode_penUp(); // save shape as SVG trace_saveShape(captureShape); + polygonizer = oldPolygonizer; + setupPolygonizer(); } } void toggle_mode_showWebcamRawVideo(boolean flag) @@ -750,4 +755,25 @@ void minitoggle_mode_previewPixelDensityRange(boolean flag) { println("previewPixelDensityRange: " + previewPixelDensityRange); } +void numberbox_mode_changePolygonizerLength(float value) { + polygonizerLength = value; + setupPolygonizer(); +} + + +void button_mode_cyclePolygonizer() +{ + + // this is a bit silly for only two choices + if (polygonizer == 1) { + polygonizer = 0; + } + else { + polygonizer++; + } + setupPolygonizer(); + Controller c = cp5.getController(MODE_CHANGE_POLYGONIZER); + c.setLabel(this.controlLabels.get(MODE_CHANGE_POLYGONIZER) + ": " + polygonizer); +} + diff --git a/controlsSetup.pde b/controlsSetup.pde index 0b759f6..ec7e22a 100644 --- a/controlsSetup.pde +++ b/controlsSetup.pde @@ -285,11 +285,34 @@ Map buildAllControls() } } + initialiseButtonValues(map); initialiseToggleValues(map); initialiseNumberboxValues(map); return map; } +Map initialiseButtonValues(Map map) +{ + for (String key : map.keySet()) + { + if (key.startsWith("button_")) + { + Button n = (Button) map.get(key); + + if (MODE_CYCLE_DENSITY_PREVIEW_STYLE.equals(key)) { + n.setValue(densityPreviewStyle); + n.setLabel(this.controlLabels.get(MODE_CYCLE_DENSITY_PREVIEW_STYLE) + ": " + densityPreviewStyle); + } + else if (MODE_CHANGE_POLYGONIZER.equals(key)) { + n.setValue(polygonizer); + n.setLabel(this.controlLabels.get(MODE_CHANGE_POLYGONIZER) + ": " + polygonizer); + } + } + } + + return map; +} + Map initialiseNumberboxValues(Map map) { for (String key : map.keySet()) @@ -517,10 +540,6 @@ Map initialiseNumberboxValues(Map map) n.setValue(0); n.setMultiplier(0.5); } - else if (MODE_CYCLE_DENSITY_PREVIEW_STYLE.equals(key)) - { - n.setValue(densityPreviewStyle); - } else if (MODE_CHANGE_DENSITY_PREVIEW_POSTERIZE.equals(key)) { n.setValue(densityPreviewPosterize); @@ -529,6 +548,13 @@ Map initialiseNumberboxValues(Map map) n.setDecimalPrecision(1); n.setMultiplier(0.1); } + else if (MODE_CHANGE_POLYGONIZER_LENGTH.equals(key)) { + n.setValue(polygonizerLength); + n.setMin(1.0); + n.setDecimalPrecision(1); + n.setMultiplier(0.1); + + } } } return map; @@ -723,6 +749,8 @@ List getControlNamesForInputPanel() controlNames.add(MODE_RENDER_VECTORS); controlNames.add(MODE_ADJUST_PREVIEW_CORD_OFFSET); + controlNames.add(MODE_CHANGE_POLYGONIZER); + controlNames.add(MODE_CHANGE_POLYGONIZER_LENGTH); controlNames.add(MODE_SHOW_IMAGE); controlNames.add(MODE_SHOW_VECTOR); @@ -1002,6 +1030,9 @@ Map buildControlLabels() result.put(MODE_CHANGE_DENSITY_PREVIEW_POSTERIZE, "Pixel posterize"); result.put(MODE_PREVIEW_PIXEL_DENSITY_RANGE, "Show density range"); + result.put(MODE_CHANGE_POLYGONIZER, "Cycle polygonizer"); + result.put(MODE_CHANGE_POLYGONIZER_LENGTH, "Polygonizer length"); + return result; } @@ -1151,6 +1182,9 @@ Set buildControlNames() result.add(MODE_CHANGE_DENSITY_PREVIEW_POSTERIZE); result.add(MODE_PREVIEW_PIXEL_DENSITY_RANGE); + result.add(MODE_CHANGE_POLYGONIZER_LENGTH); + result.add(MODE_CHANGE_POLYGONIZER); + return result; } diff --git a/drawing.pde b/drawing.pde index 817d184..a7c4072 100644 --- a/drawing.pde +++ b/drawing.pde @@ -684,7 +684,6 @@ void sendVectorShapes(RShape vec, float scaling, PVector position, int pathSorti if (pointPaths[i] != null) { boolean firstPointFound = false; - if (pointPaths[i].length > pathLengthHighPassCutoff) { List filteredPoints = filterPoints(pointPaths[i], VECTOR_FILTER_LOW_PASS, minimumVectorLineLength, scaling, position); @@ -701,7 +700,7 @@ void sendVectorShapes(RShape vec, float scaling, PVector position, int pathSorti if (liftToGetToNewPoint) addToCommandQueue(CMD_PENUP+"END"); // move to this point and put the pen down - command = CMD_CHANGELENGTHDIRECT+(int)p.x+","+(int)p.y+","+getMaxSegmentLength()+",END"; + command = CMD_CHANGELENGTHDIRECT+Math.round(p.x)+","+Math.round(p.y)+","+getMaxSegmentLength()+",END"; addToCommandQueue(command); if (liftToGetToNewPoint) addToCommandQueue(CMD_PENDOWN+"END"); @@ -712,7 +711,7 @@ void sendVectorShapes(RShape vec, float scaling, PVector position, int pathSorti for (int j=1; j filterPointsLowPass(RPoint[] points, long filterParam, float scali // scale and convert all the points first List scaled = new ArrayList(points.length); + println("a filterPointsLowPass: Scaled length: " + points.length); for (int j = 0; j filterPointsLowPass(RPoint[] points, long filterParam, float scali } } - if (scaled.size() > 1) + println("b filterPointsLowPass: Scaled length: " + scaled.size()); + if (scaled.size() > 1.0) { PVector p = scaled.get(0); result.add(p); @@ -918,12 +919,13 @@ List filterPointsLowPass(RPoint[] points, long filterParam, float scali if (abs(diffx) > filterParam || abs(diffy) > filterParam) { - //println("Adding point " + p + ", last: " + result.get(result.size()-1)); + println(j + ". Adding point " + p + ", last: " + result.get(result.size()-1)); result.add(p); } } } + println("c filterPointsLowPass: Scaled length: " + result.size()); if (result.size() < 2) result.clear(); diff --git a/polargraphcontroller.pde b/polargraphcontroller.pde index 80f6f5a..67c36d6 100644 --- a/polargraphcontroller.pde +++ b/polargraphcontroller.pde @@ -57,7 +57,7 @@ import java.awt.BorderLayout; import java.lang.reflect.Method; int majorVersionNo = 2; -int minorVersionNo = 3; +int minorVersionNo = 4; int buildNo = 0; String programTitle = "Polargraph Controller v" + majorVersionNo + "." + minorVersionNo + " build " + buildNo; @@ -343,6 +343,12 @@ static final String MODE_CYCLE_DENSITY_PREVIEW_STYLE = "button_mode_cycleDensity static final String MODE_CHANGE_DENSITY_PREVIEW_POSTERIZE = "numberbox_mode_changeDensityPreviewPosterize"; static final String MODE_PREVIEW_PIXEL_DENSITY_RANGE = "minitoggle_mode_previewPixelDensityRange"; +static final String MODE_CHANGE_POLYGONIZER = "button_mode_cyclePolygonizer"; +static final String MODE_CHANGE_POLYGONIZER_LENGTH = "numberbox_mode_changePolygonizerLength"; + + + + PVector statusTextPosition = new PVector(300.0, 12.0); @@ -369,6 +375,7 @@ boolean pixelTimerRunning = false; boolean displayingSelectedCentres = false; boolean displayingRowGridlines = false; boolean displayingInfoTextOnInputPage = false; +boolean displayingGridSpots = true; boolean displayingImage = true; boolean displayingVector = true; @@ -532,6 +539,10 @@ static PApplet parentPapplet = null; boolean rescaleDisplayMachine = true; +// Polygonization. It's a geomerative thing. +int polygonizer = 0; +float polygonizerLength = 0.0; + void setup() { println("Running polargraph controller"); @@ -539,9 +550,6 @@ void setup() initLogging(); parentPapplet = this; - RG.init(this); - RG.setPolygonizer(RG.UNIFORMLENGTH); -// RG.setPolygonizer(RG.ADAPTATIVE); try { @@ -551,6 +559,8 @@ void setup() { e.printStackTrace(); } + + RG.init(this); loadFromPropertiesFile(); size(windowWidth, windowHeight); @@ -639,10 +649,11 @@ void addEventListeners() { public void componentResized(ComponentEvent event) { - if (event.getSource()==frame) - { - windowResized(); - } + windowResized(); +// if (event.getSource()==frame) +// { +// windowResized(); +// } } } ); @@ -1625,7 +1636,7 @@ boolean mouseOverQueue() void changeMachineScaling(int delta) { boolean scalingChanged = true; - machineScaling += (delta * 0.1); + machineScaling += (delta * (machineScaling * 0.1)); if (machineScaling < MIN_SCALING) { machineScaling = MIN_SCALING; @@ -1791,6 +1802,7 @@ void machineDragged() lastMachineDragPosition = new PVector(currentPos.x, currentPos.y); PVector currentPosition = getDisplayMachine().getOutline().getPosition(); getDisplayMachine().getOffset().add(change); + cursor(MOVE); } } @@ -1893,7 +1905,25 @@ void leftButtonMachineClick() void mouseWheel(int delta) { + noLoop(); + // get the mouse position on the machine, before changing the machine scaling + PVector pos = getDisplayMachine().scaleToDisplayMachine(getMouseVector()); changeMachineScaling(delta); + + // now work out what the machine position needs to be to line the pos up with mousevector again + PVector scaledPos = getDisplayMachine().scaleToDisplayMachine(getMouseVector()); +// println("original pos: " + pos); +// println("scaled pos: " + scaledPos); + + PVector change = PVector.sub(scaledPos, pos); +// println("change: " + change); + + // and adjust for the new scaling factor + change.mult(machineScaling); + + // finally update the machine offset (position) + getDisplayMachine().getOffset().add(change); + loop(); } void setChromaKey(PVector p) @@ -1935,7 +1965,7 @@ boolean toggleShowConsole() { System.setOut(savedOut); } - println("Ow"); +// println("Ow"); return console == null; } @@ -2017,6 +2047,7 @@ void previewQueue(boolean forceRebuild) ellipse(p.x, p.y, 5,5); noFill(); } +// ellipse(p.x, p.y, 5,5); // Circle at each node } @@ -3021,6 +3052,11 @@ void loadFromPropertiesFile() } this.homePointCartesian = new PVector(getDisplayMachine().inSteps(homePointX), getDisplayMachine().inSteps(homePointY)); // println("home point loaded: " + homePointCartesian + ", " + getHomePoint()); + + // Geomerative stuff + polygonizer = getIntProperty("controller.geomerative.polygonizer", RG.ADAPTATIVE); + polygonizerLength = getFloatProperty("controller.geomerative.polygonizerLength", 1.0); + setupPolygonizer(); setVectorFilename(getStringProperty("controller.vector.filename", null)); if (getVectorFilename() != null) @@ -3048,8 +3084,7 @@ void loadFromPropertiesFile() getVectorPosition().x = getFloatProperty("controller.vector.position.x", 0.0); getVectorPosition().y = getFloatProperty("controller.vector.position.y", 0.0); this.minimumVectorLineLength = getIntProperty("controller.vector.minLineLength", 0); - - + println("Finished loading configuration from properties file."); } @@ -3122,6 +3157,9 @@ void savePropertiesFile() props.setProperty("controller.vector.position.x", df.format(getVectorPosition().x)); props.setProperty("controller.vector.position.y", df.format(getVectorPosition().y)); props.setProperty("controller.vector.minLineLength", new Integer(this.minimumVectorLineLength).toString()); + + props.setProperty("controller.geomerative.polygonizer", new Integer(polygonizer).toString()); + props.setProperty("controller.geomerative.polygonizerLength", df.format(polygonizerLength)); FileOutputStream propertiesOutput = null; @@ -3275,6 +3313,15 @@ Integer getBaudRate() return baudRate; } +void setupPolygonizer() { + RG.setPolygonizer(polygonizer); // http://www.polargraph.co.uk/forum/polargraphs-group2/troubleshooting-forum5/svg-differences-between-polargraphcontroller-2-1-1-2-3-0-thread523.0 + switch(polygonizer) { + case 1: RG.setPolygonizerLength(polygonizerLength); break; + } + println("Polygonizer: " + polygonizer); + println("PolygonizerLength: " + polygonizerLength); + +} void initLogging() { try