*enumerate*through a set of points so as to choose just

*which*points we are interested in.

## LineDDA For Java

While the technique pre-dates Microsoft Windows, the idea of using a Digital Differential Analyzer (DDA) might seem easy enough to write. Once we account for slope management however, the algorithm can get a little more complex:

public static boolean Enumerate(int x1, int y1, int x2, int y2, int step, PointCallback result) {

if (result == null) {

return false;

}

if (step == 0) {

step = 1; // avoid "divide by zero" possibility

}

if ((x1 * y1) > x2 * y2) {

int h = x1;

x1 = x2;

x2 = h;

h = y1;

y1 = y2;

y2 = h;

}

int base = (x2 - x1);

if (base == 0) {

base = 1; // avoid "divide by zero" possibility

}

double m = (double) (y2 - y1) / base;

double y = (double) y1;

if(x1 == x2) {

// No Slope

int iy;

while (y <= y2) {

if (y % step == 0) {

iy = (int) Math.round(y);

result.onPoint(x1, iy);

}

y++;

}

return true;

}

if (x1 > x2) {

// Negative Slope

y = (double) y2;

int iy;

for (int x = x2; x <= x1; x++) {

if (x % step == 0) {

iy = (int) Math.round(y);

result.onPoint(x, iy);

}

y += m;

}

} else {

// Positive & zero Slope

int iy;

for (int x = x1; x <= x2; x++) {

if (x % step == 0) {

iy = (int) Math.round(y);

result.onPoint(x, iy);

}

y += m;

}

}

return true;

}

In the above, we have cobbled together a point enumerator. One that also has a 'step' capability:

Note that testing has verified the support of positive slope, negative slope, zero slope, no slope, as well as the need for point inversion.

Graphics gr = jpDrawing.getGraphics();

gr.drawLine(300, 15, 300, 200);

boolean br = false;

LineDDA.PointPlotter plotter = new PointPlotter(gr, 5, 1);

// Slope Tesitng

gr.setColor(Color.YELLOW);

LineDDA.Enumerate(10, 100, 10, 200, 0, plotter); // No Slope & div by zero

LineDDA.Enumerate(20, 200, 20, 100, 0, plotter); // No Slope & point swap

LineDDA.Enumerate(10, 100, 300, 100, 0, plotter); // Zero Slope & div by zero

gr.setColor(Color.ORANGE);

LineDDA.Enumerate(3, 100, 300, 0, 2, plotter); // Negative Slope

// Positive Slope

gr.setColor(Color.CYAN);

LineDDA.Enumerate(15, 20, 300, 200, 7, plotter); // standard point

LineDDA.Enumerate(300, 200, 0, 0, 3, plotter); // point swap

// Picket Testing

Point p1 = new Point(20, 200);

Point p2 = new Point(300, 20);

plotter.setHeight(9);

gr.setColor(Color.RED);

LineDDA.Enumerate(p1, p2, 20, plotter);

plotter.setWidth(15);

gr.setColor(Color.CYAN);

LineDDA.Enumerate(p2, p1, 40, plotter);

Here is the source code & test. --Hope you will find it useful!

[ add comment ] ( 2305 views ) | permalink | related link

Here are two single-line scripts to save + restore the date & times of files + directories under Linux:

Save:

find / -mount -print0 | perl -ne 'INIT{ $/ = "\0"; use File::stat;} chomp; my $s = stat($_); next unless $s; print $s->ctime . "/" . $s->mtime . "/" . $s->atime ."/$_\0"; ' > dates.dat

Restore:

cat dates.dat | perl -ne 'INIT{ $/ = "\0";} chomp; m!^([0-9]+)/([0-9]+)/([0-9]+)/(.*)!s or next; my ($ct, $mt, $at, $f) = ($1, $2, $3, $4); utime $at, $mt, $f;'

I did not write them - got them from somewhere else - but I used them today. They worked great: We use them to save + restore the dates & times from a backup over to a server where a few gig of files were intermixed.

Wanted to keep it here for future use!

[ add comment ] ( 2246 views ) | permalink | related link

<<First <Back | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | Next> Last>>