Added some new pixel density preview styles.

And removed a couple of useless buttons.
This commit is contained in:
Sandy Noble 2014-08-01 02:29:43 +01:00
parent f61d9c4a47
commit 554f9e5651
4 changed files with 157 additions and 20 deletions

View File

@ -710,13 +710,27 @@ class DisplayMachine extends Machine
switch (getDensityPreviewStyle()) switch (getDensityPreviewStyle())
{ {
case DENSITY_PREVIEW_ROUND: case DENSITY_PREVIEW_ROUND:
previewRoundPixel(scaledPos, pixelSize, pixelSize); previewRoundPixel(scaledPos, pixelSize);
break;
case DENSITY_PREVIEW_ROUND_SIZE:
fill(0);
previewRoundPixel(scaledPos, map(cartesianPos.z, 1, 255, pixelSize, 1));
break; break;
case DENSITY_PREVIEW_DIAMOND: case DENSITY_PREVIEW_DIAMOND:
previewDiamondPixel(scaledPos, pixelSize, pixelSize, cartesianPos.z); previewDiamondPixel(scaledPos, pixelSize, pixelSize, cartesianPos.z);
break; break;
case DENSITY_PREVIEW_NATIVE:
previewNativePixel(scaledPos, pixelSize, cartesianPos.z);
break;
case DENSITY_PREVIEW_NATIVE_SIZE:
previewNativePixel(scaledPos, map(cartesianPos.z, 1, 255, pixelSize, 1), 0);
break;
case DENSITY_PREVIEW_NATIVE_ARC:
previewRoundPixel(scaledPos, pixelSize*0.8);
previewNativeArcPixel(scaledPos, pixelSize, cartesianPos.z);
break;
default: default:
previewRoundPixel(scaledPos, pixelSize, pixelSize); previewRoundPixel(scaledPos, pixelSize);
break; break;
} }
} }
@ -736,17 +750,131 @@ class DisplayMachine extends Machine
quad(pos.x, pos.y-halfHeight, pos.x+halfWidth, pos.y, pos.x, pos.y+halfHeight, pos.x-halfWidth, pos.y); quad(pos.x, pos.y-halfHeight, pos.x+halfWidth, pos.y, pos.x, pos.y+halfHeight, pos.x-halfWidth, pos.y);
} }
void previewNativePixel(PVector pos, float wide, float high)
void previewNativePixel(PVector pos, float size, float brightness)
{ {
// shall I try and draw a diamond here instead? OK! I'll do it! Ha! float half = size / 2.0;
float halfWidth = wide / 2.0; fill(0,0,0, 255-brightness);
float halfHeight = high / 2.0; beginShape();
quad(pos.x, pos.y-halfHeight, pos.x+halfWidth, pos.y, pos.x, pos.y+halfHeight, pos.x-halfWidth, pos.y);
// arcs from the left-hand corner
float distFromPointA = getOutline().getTopLeft().dist(pos);
float distFromPointB = getOutline().getTopRight().dist(pos);
List<PVector> int1 = findIntersections(getOutline().getLeft(), distFromPointA-half, getOutline().getRight(), distFromPointB-half, size);
List<PVector> int2 = findIntersections(getOutline().getLeft(), distFromPointA+half, getOutline().getRight(), distFromPointB-half, size);
// plot out the vertexes
vertex(int1.get(0).x, int1.get(0).y);
vertex(int2.get(0).x, int2.get(0).y);
vertex(int2.get(1).x, int2.get(1).y);
vertex(int1.get(1).x, int1.get(1).y);
vertex(int1.get(0).x, int1.get(0).y);
endShape();
} }
void previewRoundPixel(PVector pos, float wide, float high)
void previewNativeArcPixel(PVector pos, float size, float brightness)
{ {
ellipse(pos.x, pos.y, wide*1.1, high*1.1); float half = size / 2.0;
// fill(0,0,0, 255-brightness);
beginShape();
// arcs from the left-hand corner
float distFromPointA = getOutline().getTopLeft().dist(pos);
float distFromPointB = getOutline().getTopRight().dist(pos);
List<PVector> int1 = findIntersections(getOutline().getLeft(), distFromPointA-half, getOutline().getRight(), distFromPointB-half, size);
List<PVector> int2 = findIntersections(getOutline().getLeft(), distFromPointA+half, getOutline().getRight(), distFromPointB-half, size);
// plot out the vertexes
noFill();
stroke(0,0,0, 255-brightness);
float i1Angle1 = atan2(int1.get(0).y-getOutline().getTop(), int1.get(0).x-getOutline().getLeft());
float i1Angle2 = atan2(int1.get(1).y-getOutline().getTop(), int1.get(1).x-getOutline().getLeft());
arc(getOutline().getLeft(), getOutline().getTop(), (distFromPointA-half)*2, (distFromPointA-half)*2, i1Angle1, i1Angle2);
i1Angle1 = atan2(int2.get(0).y-getOutline().getTop(), int2.get(0).x-getOutline().getLeft());
i1Angle2 = atan2(int2.get(1).y-getOutline().getTop(), int2.get(1).x-getOutline().getLeft());
arc(getOutline().getLeft(), getOutline().getTop(), (distFromPointA+half)*2, (distFromPointA+half)*2, i1Angle1, i1Angle2);
i1Angle1 = atan2( int1.get(0).y-getOutline().getTop(), int1.get(0).x-getOutline().getRight());
i1Angle2 = atan2( int2.get(0).y-getOutline().getTop(), int2.get(0).x-getOutline().getRight());
arc(getOutline().getRight(), getOutline().getTop(), (distFromPointB-half)*2, (distFromPointB-half)*2, i1Angle2, i1Angle1);
i1Angle1 = atan2( int1.get(1).y-getOutline().getTop(), int1.get(1).x-getOutline().getRight());
i1Angle2 = atan2( int2.get(1).y-getOutline().getTop(), int2.get(1).x-getOutline().getRight());
arc(getOutline().getRight(), getOutline().getTop(), (distFromPointB+half)*2, (distFromPointB+half)*2, i1Angle2, i1Angle1);
endShape();
}
void previewRoundPixel(PVector pos, float dia)
{
ellipse(pos.x, pos.y, dia*1.1, dia*1.1);
}
// compute and draw intersections
/**
circle1 = c1x is the centre, and r1 is the radius of the arc to be drawn.
circle2 = c2x, r2 describe the arc that is used to calculate the start and
end point of the drawn arc.
circle3 = c2x, r3 is calculated by adding size to r2.
The drawn arc should start at the intersection with the circle1,
and end at the intersection with circle3.
The clever bits of this are nicked off http://processing.org/discourse/beta/num_1223494826.html
*/
List<PVector> findIntersections(float c1x, float r1, float c2x, float r2, float pixelSize)
{
float c1y = getOutline().getTop();
float c2y = getOutline().getTop();
float d=getOutline().getWidth(); // distance between centers
float base1, h1, base2, h2; // auxiliary distances
// p, middle point between q1 and q2
// q1 dn q2 intersection points
float p1x,p1y,p2x,p2y, q1x,q1y,q2x,q2y;
if(d<abs(r1-r2) || d>r1+r2)
{
println("C1 and C2 do not intersect");
return new ArrayList();
}
else if(d==r1+r2)
{ // outside each other, intersect in one point
return new ArrayList();
}
else
{
// intersect in two points
base1 = (r1*r1-r2*r2+d*d) / (2*d);
h1 = sqrt(r1*r1-base1*base1);
p1x = c1x+base1*(c2x-c1x)/d;
p1y = c1y+base1*(c2y-c1y)/d;
q1x=abs(p1x-h1*(c2y-c1y)/d);
q1y=abs(p1y+h1*(c2x-c1x)/d);
float r3 = r2+pixelSize;
base2 = (r1*r1-r3*r3+d*d) / (2*d);
h2 = sqrt(r1*r1-base2*base2);
p2x = c1x+base2*(c2x-c1x)/d;
p2y = c1y+base2*(c2y-c1y)/d;
q2x=abs(p2x-h2*(c2y-c1y)/d);
q2y=abs(p2y+h2*(c2x-c1x)/d);
List<PVector> l = new ArrayList<PVector>(2);
l.add(new PVector(q1x, q1y));
l.add(new PVector(q2x, q2y));
return l;
}
} }
color getPixelAtScreenCoords(PVector pos) color getPixelAtScreenCoords(PVector pos)

View File

@ -75,6 +75,10 @@ class Rectangle
{ {
return getPosition(); return getPosition();
} }
public PVector getTopRight()
{
return new PVector(this.size.x+this.position.x, this.position.y);
}
public PVector getBotRight() public PVector getBotRight()
{ {
return PVector.add(this.position, this.size); return PVector.add(this.position, this.size);

View File

@ -190,15 +190,15 @@ Set<String> buildControlsToLockIfBoxNotSpecified()
{ {
Set<String> result = new HashSet<String>(); Set<String> result = new HashSet<String>();
result.add(MODE_DRAW_OUTLINE_BOX); result.add(MODE_DRAW_OUTLINE_BOX);
result.add(MODE_DRAW_OUTLINE_BOX_ROWS); // result.add(MODE_DRAW_OUTLINE_BOX_ROWS);
result.add(MODE_DRAW_SHADE_BOX_ROWS_PIXELS); // result.add(MODE_DRAW_SHADE_BOX_ROWS_PIXELS);
result.add(MODE_RENDER_SQUARE_PIXELS); result.add(MODE_RENDER_SQUARE_PIXELS);
result.add(MODE_RENDER_SCALED_SQUARE_PIXELS); result.add(MODE_RENDER_SCALED_SQUARE_PIXELS);
result.add(MODE_RENDER_SAW_PIXELS); result.add(MODE_RENDER_SAW_PIXELS);
result.add(MODE_RENDER_CIRCLE_PIXELS); result.add(MODE_RENDER_CIRCLE_PIXELS);
result.add(MODE_RENDER_PIXEL_DIALOG); result.add(MODE_RENDER_PIXEL_DIALOG);
result.add(MODE_DRAW_GRID); // result.add(MODE_DRAW_GRID);
result.add(MODE_DRAW_TESTPATTERN); // result.add(MODE_DRAW_TESTPATTERN);
result.add(MODE_RENDER_SOLID_SQUARE_PIXELS); result.add(MODE_RENDER_SOLID_SQUARE_PIXELS);
result.add(MODE_RENDER_SCRIBBLE_PIXELS); result.add(MODE_RENDER_SCRIBBLE_PIXELS);
result.add(MODE_CONVERT_BOX_TO_PICTUREFRAME); result.add(MODE_CONVERT_BOX_TO_PICTUREFRAME);
@ -677,10 +677,10 @@ List<String> getControlNamesForInputPanel()
controlNames.add(MODE_CHANGE_PIXEL_SCALING); controlNames.add(MODE_CHANGE_PIXEL_SCALING);
controlNames.add(MODE_RENDER_PIXEL_DIALOG); controlNames.add(MODE_RENDER_PIXEL_DIALOG);
controlNames.add(MODE_DRAW_GRID); // controlNames.add(MODE_DRAW_GRID);
controlNames.add(MODE_DRAW_OUTLINE_BOX); controlNames.add(MODE_DRAW_OUTLINE_BOX);
controlNames.add(MODE_DRAW_OUTLINE_BOX_ROWS); // controlNames.add(MODE_DRAW_OUTLINE_BOX_ROWS);
controlNames.add(MODE_DRAW_SHADE_BOX_ROWS_PIXELS); // controlNames.add(MODE_DRAW_SHADE_BOX_ROWS_PIXELS);
controlNames.add(MODE_LOAD_VECTOR_FILE); controlNames.add(MODE_LOAD_VECTOR_FILE);
controlNames.add(MODE_RESIZE_VECTOR); controlNames.add(MODE_RESIZE_VECTOR);
@ -822,7 +822,7 @@ Map<String, String> buildControlLabels()
result.put(MODE_BEGIN, "Reset queue"); result.put(MODE_BEGIN, "Reset queue");
result.put(MODE_INPUT_BOX_TOP_LEFT, "Select Area"); result.put(MODE_INPUT_BOX_TOP_LEFT, "Select Area");
result.put(MODE_INPUT_BOX_BOT_RIGHT, "Select BotRight"); result.put(MODE_INPUT_BOX_BOT_RIGHT, "Select BotRight");
result.put(MODE_DRAW_OUTLINE_BOX, "Draw Outline box"); result.put(MODE_DRAW_OUTLINE_BOX, "Draw Outline selected");
result.put(MODE_DRAW_OUTLINE_BOX_ROWS, "Draw Outline rows"); result.put(MODE_DRAW_OUTLINE_BOX_ROWS, "Draw Outline rows");
result.put(MODE_DRAW_SHADE_BOX_ROWS_PIXELS, "Draw Outline pixels"); result.put(MODE_DRAW_SHADE_BOX_ROWS_PIXELS, "Draw Outline pixels");
result.put(MODE_DRAW_TO_POSITION, "Move pen to point"); result.put(MODE_DRAW_TO_POSITION, "Move pen to point");

View File

@ -51,8 +51,8 @@ import java.awt.event.KeyEvent;
import java.awt.event.*; import java.awt.event.*;
int majorVersionNo = 1; int majorVersionNo = 1;
int minorVersionNo = 7; int minorVersionNo = 8;
int buildNo = 1; int buildNo = 0;
String programTitle = "Polargraph Controller v" + majorVersionNo + "." + minorVersionNo + " build " + buildNo; String programTitle = "Polargraph Controller v" + majorVersionNo + "." + minorVersionNo + " build " + buildNo;
ControlP5 cp5; ControlP5 cp5;
@ -360,7 +360,12 @@ boolean displayingGuides = true;
static final int DENSITY_PREVIEW_ROUND = 0; static final int DENSITY_PREVIEW_ROUND = 0;
static final int DENSITY_PREVIEW_DIAMOND = 1; static final int DENSITY_PREVIEW_DIAMOND = 1;
static final int DEFAULT_DENSITY_PREVIEW_STYLE = DENSITY_PREVIEW_DIAMOND; static final int DENSITY_PREVIEW_NATIVE = 2;
static final int DENSITY_PREVIEW_NATIVE_ARC = 3;
static final int DENSITY_PREVIEW_ROUND_SIZE = 4;
static final int DENSITY_PREVIEW_NATIVE_SIZE = 5;
static final int DEFAULT_DENSITY_PREVIEW_STYLE = DENSITY_PREVIEW_NATIVE;
int densityPreviewStyle = DEFAULT_DENSITY_PREVIEW_STYLE; int densityPreviewStyle = DEFAULT_DENSITY_PREVIEW_STYLE;
static final byte COORD_MODE_NATIVE_STEPS = 0; static final byte COORD_MODE_NATIVE_STEPS = 0;