1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
import java.util.Random;
public class DvpThread425402 {
static class Circle {
int x,y,radius;
public Circle(int x, int y, int r) {
this.x=x; this.y=y; this.radius=r;
}
}
public static boolean move(Circle[] circles, int width, int height) {
boolean hasmoved=false;
for(int i=0;i<circles.length;i++) {
Circle ci = circles[i];
// move direction (vector)
double dx=0, dy=0;
// move away from the left/right border
int bx = 0;
if (ci.x>(width-ci.x)) bx = width;
int da = Math.abs(ci.x-bx);
if (da<ci.radius) {
int delta = ci.radius-da;
dx += delta*Math.signum(ci.x-bx);
hasmoved = true;
}
// move away from top/bottom border
int by = 0;
if (ci.y>(height-ci.y)) by = height;
int db = Math.abs(ci.y-by);
if (db<ci.radius) {
int delta = ci.radius-db;
dy += delta*Math.signum(ci.y-by);
hasmoved = true;
}
// find the nearest circle
int nearest_recover = 0;
int nearest_id = -1;
int nearest_dist = 0;
for(int j=0;j<circles.length;j++) {
if (i==j) continue;
Circle cj = circles[j];
int dcenter = (int)Math.sqrt((ci.x-cj.x)*(ci.x-cj.x)+(ci.y-cj.y)*(ci.y-cj.y));
int sumradius = ci.radius+cj.radius;
int recover = sumradius-dcenter;
if (recover>nearest_recover) {
nearest_recover = recover;
nearest_dist = dcenter;
nearest_id = j;
}
}
// move away from the nearest circle
if (nearest_id>=0) {
Circle cn = circles[nearest_id];
int dn = (int)nearest_dist;
int delta = 1 + (ci.radius+cn.radius) - dn;
dx += (delta*(ci.x-cn.x))/dn;
dy += (delta*(ci.y-cn.y))/dn;
hasmoved = true;
}
// move circle center
ci.x+=1.0*dx;
ci.y+=1.0*dy;
}
return hasmoved;
}
public static void main(String[] args) {
int width=320, height=200;
Random random = new Random();
Circle[] circles = new Circle[25];
for(int i=0;i<circles.length;i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int r = random.nextInt(20)+10;
circles[i] = new Circle(x,y,r);
}
for(int loop=0;loop<100;loop++)
if (!move(circles,width,height)) break;
}
} |
Partager