2D Graphics GUI Java

//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 getPoints (){
    List ret = new ArrayList();
    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 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;
  }
}