10 |
*/ |
*/ |
11 |
static private void wipe(float[] d, int[] mx, int[] my, int x, int y, int dx, int dy, int n, int w) { |
static private void wipe(float[] d, int[] mx, int[] my, int x, int y, int dx, int dy, int n, int w) { |
12 |
int cmx = -10000, cmy = -10000; |
int cmx = -10000, cmy = -10000; |
13 |
|
int clx = -10000, cly = -10000; |
14 |
for(int i = 0; i<n; i++) { |
for(int i = 0; i<n; i++) { |
15 |
int cx = x + i*dx; |
int cx = x + i*dx; |
16 |
int cy = y + i*dy; |
int cy = y + i*dy; |
17 |
int ind = cx + w * cy; |
int ind = cx + w * cy; |
18 |
|
|
19 |
float dix = cx - cmx; |
if(d[ind] < 0) { |
20 |
float diy = cy - cmy; |
float dix = cx - clx; |
21 |
float dcur = (float)Math.sqrt(dix*dix + diy*diy); |
float diy = cy - cly; |
22 |
|
float dcur = - (float)Math.sqrt(dix*dix + diy*diy); |
23 |
if(d[ind] < dcur) { |
|
24 |
cmx = mx[ind]; |
if(d[ind] > dcur) { |
25 |
cmy = my[ind]; |
clx = mx[ind]; |
26 |
|
cly = my[ind]; |
27 |
|
} else { |
28 |
|
d[ind] = dcur; |
29 |
|
mx[ind] = clx; |
30 |
|
my[ind] = cly; |
31 |
|
} |
32 |
|
cmx = cx; |
33 |
|
cmy = cy; |
34 |
|
|
35 |
} else { |
} else { |
36 |
d[ind] = dcur; |
float dix = cx - cmx; |
37 |
mx[ind] = cmx; |
float diy = cy - cmy; |
38 |
my[ind] = cmy; |
float dcur = (float)Math.sqrt(dix*dix + diy*diy); |
39 |
|
|
40 |
|
if(d[ind] < dcur) { |
41 |
|
cmx = mx[ind]; |
42 |
|
cmy = my[ind]; |
43 |
|
} else { |
44 |
|
d[ind] = dcur; |
45 |
|
mx[ind] = cmx; |
46 |
|
my[ind] = cmy; |
47 |
|
} |
48 |
|
clx = cx; |
49 |
|
cly = cy; |
50 |
} |
} |
51 |
} |
} |
52 |
} |
} |
57 |
int[] my = new int[w*h]; |
int[] my = new int[w*h]; |
58 |
|
|
59 |
for(int ind = 0; ind < w*h; ind++) { |
for(int ind = 0; ind < w*h; ind++) { |
60 |
d[ind] = (from[ind] != 0 ? 0 : 1000000); |
d[ind] = (from[ind] != 0 ? -1000000 : 1000000); |
61 |
mx[ind] = ind % w; |
mx[ind] = ind % w; |
62 |
my[ind] = ind / w; |
my[ind] = ind / w; |
63 |
} |
} |
64 |
|
|
65 |
// Reasonable approximation |
// Reasonable approximation |
66 |
for(int i=0; i<5; i++) { |
for(int i=0; i<4; i++) { |
67 |
for(int x = 0; x < w; x++) |
for(int x = 0; x < w; x++) |
68 |
wipe(d, mx, my, x, 0, 0, 1, w, w); |
wipe(d, mx, my, x, 0, 0, 1, w, w); |
69 |
for(int y = 0; y < h; y++) |
for(int y = 0; y < h; y++) |
84 |
|
|
85 |
} |
} |
86 |
|
|
87 |
static public void b2s(short[] from, byte[] to) { |
static public void b2s(short[] from, byte[] to, int spacing) { |
88 |
for(int i=0; i<from.length; i++) { |
for(int i=0; i<from.length; i++) { |
89 |
to[i*2] = (byte)(from[i] % 256); |
to[i*spacing] = (byte)(from[i] % 256); |
90 |
to[i*2+1] = (byte)(from[i] / 256); |
to[i*spacing+1] = (byte)(from[i] / 256); |
91 |
|
if(to[i*spacing+1] == 0 && from[i] < 0) |
92 |
|
to[i*spacing+1] = (byte)255; |
93 |
} |
} |
94 |
} |
} |
95 |
} |
} |