Recursive bisection of a square in Java
I'm basically trying to bisect a square on the bottom left square until zero, then with recursion bisect the remaining squares top left, top right, and bottom right until all squares are filled. However, my code executes the bottom square bisection but just stops when I add the new line trying to make the bottom right bisect. Any ideas why the draw stops? I can't seem to implement the drawing of a simple "+" shape after the first bisection to the bottom left.
package recursivepatterns;
import java.awt.Color;
import sedgewick.*;
public class PersianRug {
public static void subDiv(double S, Color C, double x, double y) {
//
StdDraw.line(x+S/2, y, x+S/2, y+S);
StdDraw.line(x, y+S/2, x+S, y+S/2);
}
/**
*
* @param palette an array of Colors to choose from
* @param llx lower left x coordinate of this rug square
* @param lly lower left y coordinate of this rug square
* @param size width (and therefore also height) of this rug square
* @param north color index of the north side of this rug square
* @param east color index of the east side of this rug square
* @param south color index of the south side of this rug square
* @param west color index of the west side of this rug square
*/
private static void persianRug(
Color[] palette,
double llx, double lly,
double size,
int north, int east, int south, int west){
//
int c = 0;
Color C = palette[c];
subDiv(size,C,llx,lly);
if (size>0){
// ll
persianRug(palette,llx,lly,size/2, c, c, south, west); // north and east are fixed
// lr
StdDraw.setPenColor(StdDraw.RED);
StdDraw.circle(0.5,0.5,size/2); // this tests that circles do in fact recursively get bigger
persianRug(palette,llx+size/2,lly,size/2, c, c, south, west); // this line does not work at all
}
else return;
}
public static void main(String args[]) {
//
// Leave the following line commented out, but once you
// have things working, uncomment it, and also uncomment
// the similar line at the end of this method.
// Uncommenting those lines will run the graphics code
// in double-buffering mode, so that your image will appear
// almost instantaneously, instead of being drawn one line
// at a time.
//
// Here is the line to uncomment:
//
//StdDraw.show(10); // don't forget to uncomment the other line at the end
//
//
// Generate a palette of colors
//
Color[] palette = { StdDraw.BLUE, StdDraw.CYAN, StdDraw.DARK_GRAY,
StdDraw.GRAY, StdDraw.GREEN, StdDraw.LIGHT_GRAY,
StdDraw.MAGENTA, StdDraw.ORANGE, StdDraw.PINK, StdDraw.RED,
StdDraw.WHITE, StdDraw.YELLOW };
//
// Draw the outermost square as a special case
// Use color 0 for that
//
StdDraw.setPenColor(palette[0]);
StdDraw.line(0, 0, 1, 0);
StdDraw.line(1, 0, 1, 1);
StdDraw.line(1, 1, 0, 1);
StdDraw.line(0, 1, 0, 0);
//
// Kick off the recursion
// Lower left is point (0,0)
// Size of the square is 1
// The color index of each surrounding side is 0
//
persianRug(palette, 0, 0, 1, 0, 0, 0, 0);
//
// Also uncomment this line when you have things working
// to speed up the drawing:
//
//StdDraw.show(10);
//
}
}
Result of fixing the tolerance to 0.005
package recursivepatterns;
import java.awt.Color; import sedgewick.*;
public class PersianRug {
public static int pickColor(Color[] palette, int n, int e, int s, int w) {
// USES MODULAR ARITHMETIC AND BOUNDS OF THE PALETTE RING TO ASSIGN A COLOR
if ((n+s+w+e+2)%palette.length<palette.length/2-1)
return (n+e+s+w+8)%palette.length; // VARYING MODULAR COLOR
else if ((n+s+w+e+2)%palette.length>=palette.length/2-1 && (n+s+w+e)%palette.length<palette.length-5){
return palette.length-8;} // FIXED COLOR OF PALETTE
else
return 0; // "BACKGROUND" COLOR
}
public static void subDiv(double S, double x, double y) {
// DRAWS A CROSS GIVEN THE LOWER LEFT CORNER COORDINATES
StdDraw.line(x+S/2, y, x+S/2, y+S); // vertical
StdDraw.line(x, y+S/2, x+S, y+S/2); // horizontal
}
/**
*
* @param palette an array of Colors to choose from
* @param llx lower left x coordinate of this rug square
* @param lly lower left y coordinate of this rug square
* @param size width (and therefore also height) of this rug square
* @param n color index of the north side of this rug square
* @param e color index of the east side of this rug square
* @param s color index of the south side of this rug square
* @param w color index of the west side of this rug square
*/
private static void persianRug(
Color[] palette,
double llx, double lly,
double size,
int n, int e, int s, int w){
//
int c = pickColor(palette,n,e,s,w);
StdDraw.setPenColor(palette[c]);
subDiv(size,llx,lly);
n = (n+1)%palette.length; // ITERATE THE PALETTE FOR DIFFERENT COLOR NEXT ITER
s = (s+1)%palette.length; //
e = (e+1)%palette.length; //
w = (w+1)%palette.length; //
if (size>.0025){ // THIS BOUND DICTATES HOW DETAILED AND HOW QUICKLY THE RUG IS DRAWN
lly = lly+size/2; // TOP LEFT
persianRug(palette,llx,lly,size/2, n, c, c, w);
llx = llx+size/2; // TOP RIGHT
persianRug(palette,llx,lly,size/2, n, e, c, c);
llx=llx-size/2; // BOTTOM LEFT
lly = lly-size/2;
persianRug(palette,llx,lly,size/2, c, c, s, w);
llx = llx+(size/2); // BOTTOM RIGHT
persianRug(palette,llx,lly,size/2, c, e, s, c);
}
else return;
}
public static void main(String args[]) {
//
// Leave the following line commented out, but once you
// have things working, uncomment it, and also uncomment
// the similar line at the end of this method.
// Uncommenting those lines will run the graphics code
// in double-buffering mode, so that your image will appear
// almost instantaneously, instead of being drawn one line
// at a time.
//
// Here is the line to uncomment:
//
StdDraw.show(10); // don't forget to uncomment the other line at the end
//
//
// Generate a palette of colors
Color[] palette = { StdDraw.BLACK, StdDraw.RED, StdDraw.ORANGE,
StdDraw.PINK, StdDraw.BLUE, StdDraw.YELLOW,
StdDraw.RED, StdDraw.ORANGE, StdDraw.ORANGE, StdDraw.RED,
StdDraw.PINK, StdDraw.RED};
//
// Draw the outermost square as a special case
// Use color 0 for that
//
StdDraw.setPenColor(palette[0]);
StdDraw.line(0, 0, 1, 0);
StdDraw.line(1, 0, 1, 1);
StdDraw.line(1, 1, 0, 1);
StdDraw.line(0, 1, 0, 0);
//
// Kick off the recursion
// Lower left is point (0,0)
// Size of the square is 1
// The color index of each surrounding side is 0
//
persianRug(palette, 0, 0, 1, 0, 0, 0, 0);
//
// Also uncomment this line when you have things working
// to speed up the drawing:
//
StdDraw.show(10);
//
}
}
链接地址: http://www.djcxy.com/p/80712.html上一篇: Python龟不会创建多个方块
下一篇: Java中正方形的递归平分