Circle shape
//package net.slashie.utils;
import java.util.ArrayList;
import java.util.List;
public class Circle {
private Position center;
private int radius;
public Circle (Position p, int radius){
this.center = p;
this.radius = radius;
}
public List<Position> getPoints (){
List<Position> ret = new ArrayList<Position>();
int d = 3 - (2 * radius);
Position runner = new Position(0, radius);
Position zero = new Position(0,0);
while (true) {
if (Position.flatDistance(zero, runner) <= radius)
addPoints(center, runner.x,runner.y, ret);
if (d < 0)
d = d + (4*runner.x)+6;
else {
d = d + 4 * (runner.x-runner.y) +10;
runner.y --;
}
runner.x++;
if (runner.y == 0)
break;
}
return ret;
}
private void addPoints(Position center, int x, int y, List<Position> collection){
collection.add(new Position(center.x + x, center.y + y));
collection.add(new Position(center.x + x, center.y - y));
collection.add(new Position(center.x - x, center.y + y));
collection.add(new Position(center.x - x, center.y - y));
collection.add(new Position(center.x + y, center.y + x));
collection.add(new Position(center.x + y, center.y - x));
collection.add(new Position(center.x - y, center.y + x));
collection.add(new Position(center.x - y, center.y - x));
}
}
class Position implements java.io.Serializable {
public int x,y,z;
public int x(){
return x;
}
public int y(){
return y;
}
public int z(){
return z;
}
public Position(int px, int py){
x = px;
y = py;
}
public Position(int px, int py, int pz){
this(px, py);
z = pz;
}
public Position(Position p){
x = p.x;
y = p.y;
z = p.z;
}
public static Position add (Position a, Position b){
return new Position (a.x + b.x, a.y + b.y, a.z + b.z);
}
public static Position subs (Position a, Position b){
return new Position (a.x - b.x, a.y - b.y, a.z - b.z);
}
public static Position mul(Position a, int c){
return new Position (a.x * c, a.y * c, a.z * c);
}
public static Position mul(Position a, Position b){
return new Position (a.x * b.x, a.y * b.y, a.z * b.z);
}
public void mul(Position pos){
x *= pos.x;
y *= pos.y;
z *= pos.z;
}
public boolean equals(Object o){
if (o == null)
return false;
try {
if (((Position)o).x == x && ((Position)o).y == y && ((Position)o).z == z){
return true;
}
} catch (ClassCastException cce){
throw new RuntimeException("Error comparing points "+this+" "+o, cce);
}
return false;
}
public int hashCode() {
return toString().hashCode();
}
public String toString(){
return "("+x+","+y+","+z+")";
}
public static int flatDistance(Position a, Position b){
return (int) Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow (a.y - b.y, 2));
}
public static int flatDistance(int x1, int y1, int x2, int y2){
return (int) Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow (y1 - y2, 2));
}
public static int distance(Position a, Position b){
return (int) Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow (a.y - b.y, 2));
}
/* public static int distance(Position a, Position b){
return (int) Math.s(Math.pow(a.x - b.x, 2) + Math.pow (a.y - b.y, 2));
}*/
public void add(Position p){
x += p.x;
y += p.y;
z += p.z;
}
}
Related examples in the same category