Bir sonraki adımda elimizdeki Multiangle’ın istediğimiz kenarından yeni bir Multiangle yaratmamız gerekiyor. Bunun için bize hangi kenardan bunu yaratmamız gerektiği ve yaratılacak yeni Multiangle’ın kenar sayısı verilmeli. Multiangle class’ı geri kalan bilgileri hesaplayacaktır.

Eğer benim Multiangle’ımın merkezi cen ise ve yeni yaratacağımın merkezi de cennew ise, benim verilen snew (yeni Multiangle’ın kenar sayısı) ile yeni Multiangle’ın yarıçapını ve merkezini (cennew) bulabilmem lazım. Diğelim en ve en+1 noktalarının arasındaki kenarla bitişik bir Multiangle yaratmak istiyorum. O zaman rnew ve cennew aşağıdaki gibi bulunur.

Bunun kodu nasıl olur?

Sadece Multiangle class’i degisiyor. Point class daha onceki gibi.

// 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

  // 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);
    }
  }

   // 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;
  }

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

  public Multiangle createNewAt(int i, int snew) {

    int s = elements.length;
    if (i >= s) return null;
    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),
                             center.y + dis * cos((i+0.5) * angle));
    Multiangle ret =  new Multiangle(snew, rnew, cennew, 0.0f);
    return ret;

  }

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

  public float getRadius() {
    return radius;
  }
}

Ancak bunu çalıştırdığımız zaman bir eksiklik olduğunu görüyoruz.

Eğer farklı sayıda kenara sahip bir komşu Multiangle yaratmak istersem sorun çıkıyor. Bu komşuyu döndürmem gerekiyor.

Bu sorunu henüz çözmedim. Şimdilik bu haliyle bırakıyorum. Bir sonraki post’ta çözümü vereceğim.

Aşağıda yukarıdaki Multiangle’ı çalıştırabileceğiniz dosyayı bulabilirsiniz.

void setup() {
  size (600, 600);
  background (255);

  Multiangle a = new Multiangle (6, 100, new Point(300, 300), 0.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();
  for (int f = 0; f<6; f++) {
    a.createNewAt(f, 3).display();
  }

}

Bunu çalıştırınca aşağıdaki resmi göreceksiniz. Problem bariz. Ama nasıl çözülür?