En son Multiangle’a kenardan yaratma özelliğini eklemiştim fakat yeni yaratılan Multiangle’lar dönmüş bir şekilde geliyordu. Ayrıca Multiangle’ın kenar sayısı çift olduğu zaman da epey sorun çıkıyordu. Bunları kenar sayısı kontrolü ve epeyce bir % (modulo) işlemi kullanarak çözdüm. Yeni Multiangle kodu ve aklıma daha iyi bir şey gelmediği için sağa sola rastgele Multiangle’lar yaratan bir örnek kod aşağıda.


Multiangle kodu:

// Bu class istenilen sayida esit kenari olan sekilerdir.

class Multiangle {
  private Point[] elements; // Sekli olusturan noktalar
  private float radius; // Seklin icine oturdugu daire
  private Point center; // Bu dairenin merkezinin koordinati
  private float skew;   // Multiangle hafif donmus olabilir. Radyan
  PFont font;

  // Constructor
  // int s - Kenar sayisi
  // float radius - icine oturdugu dairenin yari capi
  // Point center - dairenin merkezinin koordinatlari
  Multiangle (int s, float radius, Point center, float skew) {
    this.radius = radius;
    this.center = center;
    this.skew = skew;
    this.elements = new Point[s];
    float angle = TWO_PI/s;
    for (int f = 0; f < s; f++) {
      elements[f] = new Point(center.getx() + sin(angle * f+skew) * radius,
                             center.gety() + cos(angle * f+skew) * radius);
    }
    font = createFont("Arial-Black", 12);
  }

   // Constructor
   // int s - Kenar sayisi
   // float radius - icine oturdugu dairenin yari capi
  Multiangle (int s, float radius) {
    this.elements = new Point[s];
    this.radius = radius;
    font = createFont("Arial-Black", 12);
  }

  //Bu seklin ekranda gosterilmesini saglar
  public void display () {
    textFont(font, 12);
    noFill();
    beginShape();  // boyle faydali bir komut vardi...
    for (int f = 0; f < elements.length; f++) {
      Point p = elements[f];
      vertex (p.getx(), p.gety());
//      fill(0);
//      text(f, (int) p.getx(), (int) p.gety());
//      noFill();
    }
    endShape(CLOSE);
  }

  // Bu Multiangle'in "i" numarali kenarina, "snew" adet kenari
  // olan yeni bir Multiangle cizer
  public Multiangle createNewAt(int i, int snew) {

    int s = elements.length;
    if (i >= s) return null;
    float sf = (float)snew;
    float correct = 0;
    if ( sf/2 <= (int)(snew/2) ) {
      correct = - PI/snew;
      println ("odd");
    }
    float angle = TWO_PI/s;
    println (elements[i].getDistance(elements[(i+1)%s]));
    float rnew = elements[i].getDistance(elements[(i+1)%s])/2/sin(PI/snew);
    float dis = rnew * cos(PI/snew) + radius * cos(PI/s);
    Point cennew = new Point(center.x + dis * sin((i+0.5) * angle + skew ),
                             center.y + dis * cos((i+0.5) * angle + skew ));
    Multiangle ret =  new Multiangle(snew, rnew, cennew,
              (PI/s + (i*2*PI/s))%(2*PI/snew) + skew + correct);
    return ret;

  }

  public Point[] getElements() {
    return elements;
  }

  public float getRadius() {
    return radius;
  }
}

Denemek icin:

Multiangle a;
int f = 0;
int s = 7;

void setup() {
  size (600, 600);
  background (255);
//  String[] fontList = PFont.list();
//  println(fontList);
  int snew = 5;
  a = new Multiangle (s, 20, new Point(300, 300), 0f);
  a.display();
//  Multiangle b = new Multiangle (8, 100, new Point(100, 300), 0.0f);
//  b.display();
//  b = new Multiangle(13, 100, new Point(500, 300), 0.0f);
//  b.display();
//  b = a.createNewAt(1, 3);
//  b.display();
}

void draw() {
  int ran = (int)(random(2));
  println(ran);
  a = a.createNewAt((f+ran)%s, s);
  a.display();
  f += 1;
}

 void mousePressed() {
   noLoop();
 }