Javada Tupper’ın Kendini Çizen Formülü: Grafiği, Kendine Eşit Olan Denklem!

Merhaba arkadaşlar bugün internette karşılaştığım ilginç bir şeyi javada görmek istedim.Öncelikle gördüğüm yazı şu:

Tupper’ın Kendini Çizen Formülü: Grafiği, Kendine Eşit Olan Denklem!

Başlıkta ne demek istediğimizi anlamamış olabilirsiniz, izah edelim. Tupper’ın Formülü olarak da bilinen şu denklemden söz ediyoruz:

1/2 < floor(mod(floor(y/17)*2^(-17*floor(x)-mod(floor(y), 17)),2))

Ne harika değil mi?

İlk bakışta bir anlam ifade etmiyor olabilir, bu normal. Çünkü tek başına pek bir anlamı yok. Ancak bu denklemi ne zaman ki x-y düzleminde grafiğe döküyorsunuz, o zaman çok şaşırtıcı bir şey ortaya çıkıyor: Ana görseldeki grafik!

Yani bu denklem, grafiğe döküldüğünde denklemin kendisini veriyor!

Hemen hemen diyelim… Çünkü bunu, sadece çok spesifik bir aralıkta görebiliyorsunuz. x eksenini 0 ile 160 arası olarak seçmeniz gerekiyor. y eksenini ise k ile k+17 arasında. Bu aralıkta, k sayısının tam olarak şu sayıya eşit olması gerekiyor:

960 939 379 918 958 884 971 672 962 127 852 754 715 004 339 660 129 306 651 505 519 271 702 802 395 266 424 689 642 842 174 350 718 121 267 153 782 770 623 355 993 237 280 874 144 307 891 325 963 941 337 723 487 857 735 749 823 926 629 715 517 173 716 995 165 232 890 538 221 612 403 238 855 866 184 013 235 585 136 048 828 693 337 902 491 454 229 288 667 081 096 184 496 091 705 183 454 067 827 731 551 705 405 381 627 380 967 602 565 625 016 981 482 083 418 783 163 849 115 590 225 610 003 652 351 370 343 874 461 848 378 737 238 198 224 849 863 465 033 159 410 054 974 700 593 138 339 226 497 249 461 751 545 728 366 702 369 745 461 014 655 997 933 798 537 483 143 786 841 806 593 422 227 898 388 722 980 000 748 404 719

Evet…

Aslında bu formül, 2001 yılında Jeff Tupper tarafından güvenilir 2 boyutlu bilgisayar grafikleri çizebilmemiz için geliştirildi. “Tek renkli bitmap görüntüsü sabiti” olarak da bilinen k sayısı, dilediğiniz herhangi bir grafiği çizebilmeniz için seçebileceğiniz bir sayı. Mesela bu sayıyı değiştirerek, herhangi bir diğer çizimi yaratmanız da mümkün. Eğer ki y eksenini sınırlandırmayacak olursanız, sayısız başka görüntü elde edebilir ve bunlar arasından kesitler alarak farklı resimler yaratabilirsiniz.

Yine de bu dünyada kendi kendini çizen bir matematik denkleminin olduğunu bilmek sevindirici diyebiliriz.

 

Kaynak

Ben de bu denklemi javada görmek için internette koduna baktım ve şu adreste aşağıdaki gibi şu java kodunu buldum.Kodumuz şöyle

Paint.java  sınıfı kodları


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.math.BigInteger;

import javax.swing.JPanel;

public class Paint extends JPanel {

private static final long serialVersionUID = 1L;

public static BigInteger K = new BigInteger(
"96093937991895888497167296212785275471500433966012930665150551927170"
+ "28023952664246896428421743507181212671537827706233559932372808741443"
+ "07891325963941337723487857735749823926629715517173716995165232890538"
+ "22161240323885586618401323558513604882869333790249145422928866708109"
+ "61844960917051834540678277315517054053816273809676025656250169814820"
+ "83418783163849115590225610003652351370343874461848378737238198224849"
+ "86346503315941005497470059313833922649724946175154572836670236974546"
+ "1014655997933798537483143786841806593422227898388722980000748404719");

public static boolean set_buffer(float xAxis, float yAxis) {
BigInteger y = new BigInteger("" + (int) yAxis);
y = y.add(K);
BigInteger x = new BigInteger("" + (int) xAxis);

//meat of the actual formula
if (0.5 < y.divideAndRemainder(BigInteger.valueOf(17))[0].divideAndRemainder(BigInteger.valueOf(2).pow(BigInteger.valueOf(17).multiply(x).add(y.mod(BigInteger.valueOf(17))).intValue()))[0].mod(BigInteger.valueOf(2)).doubleValue()) {
return true;
} else {
return false;
}
}

public void draw(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);

int _j;
for (int i = 0; i < Tupper.yRes; i++) {
for (int j = 0; j < Tupper.xRes; j++) {
if (set_buffer(((float) j) / 5L, ((float) i) / 5L)) //first argument prevents image from appearing reversed
{
g2.drawLine((_j = Tupper.xRes - j), i, _j, i);
}
}
}

}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}

}

Bu da Tupper.java sıfımızın kodları


&nbsp;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Tupper extends JFrame {

private static final long serialVersionUID = 1L;

public static int xRes = 530, yRes = 85;

public Tupper() {
setTitle("Tupper's Self-Referential Formula");
setSize(xRes + 25, yRes + 38);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

Paint painted = new Paint();
getContentPane().add(painted);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Tupper newTupper = new Tupper();
newTupper.setVisible(true);
}
});
}

}

Programı derleyince ilginç olarak şöyle bir formül çıkıyor:

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir