Python İle Ağırlık Merkezi Bulma ve PHP ile Çizdirme

xeksenindemoment=[]
yeksenindemoment=[]
xeksenindekoord=[]
yeksenindekoord=[]
kutleler=[]

1)Bu boş listeleri daha sonra fonksiyonlardan gelecek değerleri saklamak için oluşturduk.

def kutleal(m,x,y):     
    kutleler.append(m)
    xeksenindekoord.append(x)
    yeksenindekoord.append(y)
    xmoment=m*x
    ymoment=m*y         
    xeksenindemoment.append(xmoment)
    yeksenindemoment.append(ymoment)

2)Bu ilk fonksiyonumuz: kutleal()

Bahsettiğim listelerin içini bu fonksiyon dolduruyor. 3 farklı değişken alıyor;

m:Kütle

x:X koordinatı

y:Y koordinatı

m,x,y değerlerini gerekli listelere ekledikten sonra xmoment ve ymoment adında iki yeni değişken oluşturuyor ve bunları x ve y eksenine göre momentlerini hesaplayıp gerekli listelere ekliyoruz.

def sor(): 
islem=raw_input("Kütle girmek için birşey yazmadan enter, çizim dosyasını yazdırmak için ciz() yazıp enter, çıkmak için exit() yazıp entera basınız")
    if (islem==''):
        if len(kutleler)==0:
            m=int(raw_input("Kütlenin ağırlığını giriniz"))
            if (m==0):
                print "0 birim kütleli ağırlık olmaz"
                sor()
            else:
                x=int(raw_input("Kütlenin x eksenindeki koordinatını giriniz"))    
                y=int(raw_input("Kütlenin y eksenindeki koordinatını giriniz"))
                kutleal(m,x,y)
        else:
            m=int(raw_input("Yeni kütlenin ağırlığını giriniz"))
            if (m==0):
                print "0 birim kütleli ağırlık olmaz"
                sor()
            else:
                x=int(raw_input("Yeni kütlenin x eksenindeki koordinatını giriniz"))    
                y=int(raw_input("Yeni kütlenin y eksenindeki koordinatını giriniz"))
                kutleal(m,x,y)
    elif (islem=='ciz()'):
         ciz()
    else:
        sor()

3)Şimdi ise sor diye bir fonksiyon tanımladık ve bu fonksiyonda kullanıcıdan veri istiyor.İlk if bloğu kutleler listesi boş mu dolu mu onu kontrol ediyor. Eğer boşsa kütle giriniz değilse yeni kütle giriniz diyor. İçerdeki if bloğu ise kütle yerine sıfır denilirse ne yapılacağını söylüyor. Programda hiçbirşey yazmadığınızda yeni kütle alma işlemi yapar, ciz() yazdığınızda php dosyasını oluşturur, exit() ise çıkmanızı sağlar.

def hesapla():          ##bu fonksiyon ise bize kütle merkezini hesaplayan fonksiyon. 
    global xkoord, ykoord, a, b, kutle
    a=sum(xeksenindemoment)
    b=sum(yeksenindemoment)
    kutle=sum(kutleler)
    xkoord=a/kutle
    ykoord=b/kutle
    print("Su anda kütlelerin merkezi(%s, %s) koordinatlarında ve toplam %s birimdir")%(xkoord,ykoord,kutle) 

4)Asıl hesaplamayı yapan fonksiyon bu hesapla fonksiyonu. Sum fonksiyonuyla listelerdeki değerlerin hepsi int tipinde olduğu için topladık ve a,b,kütle değişkenlerine atadık. Programda azcık bi fizik var o da lise1 fiziği. Momentlerin toplam kütleye böldüğümüzde x ve y eksenlerindeki kütle merkezinin koordinatlarını buluruz.

def ciz():          
    import os, math
    ucnoktalar=[math.fabs(min(xeksenindekoord)),math.fabs(min(yeksenindekoord)),max(xeksenindekoord),max(yeksenindekoord)]
    buyuk=max(ucnoktalar)
    if (250/buyuk)>25:
        oran=25
    else:
        oran=250/buyuk
    cizim=open("ciz.php","w")
    cizim.write("""<?
Header('Content-Type: image/jpg');
$im = ImageCreateTruecolor(600,600);
ImageFilledRectangle($im,550,300,50,300,0x00ffffff);//x ekseni
ImageFilledRectangle($im,300,550,300,50,0x00ffffff);//y ekseni
$white = ImageColorAllocate($im,255,255,255);
$red = ImageColorAllocate($im,255,0,0);
""")
    for i in range(len(xeksenindekoord)):
        xkoordinat=oran*xeksenindekoord[i]
        ykoordinat=oran*yeksenindekoord[i]
        xekseniyazida=xeksenindekoord[i]
        yekseniyazida=yeksenindekoord[i]
        kutle1=kutleler[i]
        cizim.write("ImageFilledRectangle($im,"+str(300+xkoordinat-0.5*oran)+","+str(300-ykoordinat+0.5*oran)+","+str(300+xkoordinat+0.5*oran)+","+str(300-ykoordinat-0.5*oran)+",0x00ffffff);\n")
        cizim.write("ImageString($im,"+str(oran)+","+str(300+xkoordinat-oran*1)+","+str(300-ykoordinat+oran)+",'("+str(xekseniyazida)+","+str(yekseniyazida)+")',$white);\n")
        cizim.write("ImageString($im,"+str(oran)+","+str(300+xkoordinat)+","+str(300-ykoordinat-oran)+",'"+str(kutle1)+"',$white);\n")
        cizim.write("ImageFilledRectangle($im,"+str(300+xkoord*oran-0.25*oran)+","+str(300-ykoord*oran+0.25*oran)+","+str(300+xkoord*oran+0.25*oran)+","+str(300-ykoord*oran-0.25*oran)+",0x00ff0000);\n")
        cizim.write("ImageString($im,"+str(oran)+","+str(300+xkoord*oran-oran*0.5)+","+str(300-ykoord*oran+oran*0.5)+",'("+str(xkoord)+","+str(ykoord)+")',$red);\n")            
        cizim.write("ImageString($im,"+str(oran)+","+str(300+xkoord*oran)+","+str(300-ykoord*oran-oran*1)+",'"+str(kutle)+"',$red);\n")
    cizim.write("""ImageFilledRectangle($im,0,550,15,565,0x00ff0000);
ImageString($im,20,20,550,'Kutle Merkezi',$white);
ImageFilledRectangle($im,0,567,15,582,0x00ffffff);
ImageString($im,20,20,567,'Kutleler',$white);
ImagePNG($im);?>""")
      print "###Ciz.php girdiğiniz değerler doğrultusunda oluşturuldu###"

5)Bu ciz fonksiyonu ise bir php dosya oluşturuyor ve grafiğini çizdiriyor. Karışık görünmesinin sebebi benim hesaplamaları içinde yapmam dosyayı yazdırırken. Os ve math modüllerini import ediyoruz öncelikle. Math modülünden fasd fonksiyonnu kullandım sadece. Öncelikle uç koordinat noktaları bulacak ve ucnoktalar adlı listeye yazacak satırımız var. Bu satırda fasd fonksiyonu ile mutlak değerini aldık. Buyuk değişkenine ise en uç noktayı atadık ucnoktalar listesinin maximumunu yani.

    buyuk=max(ucnoktalar)
    if (250/buyuk)>25:
        oran=25
    else:
        oran=250/buyuk

6)Bu bölüm bizim oranımızı bir değişle ölçeğimizi hesaplatıyor. Yani adamların gireceği uçuk sayılara karşı uçuk pixellerde resimler oluşturmayacağız. Bizim resmimiz daima 600*600 px bir resim olacak(biz 500*500 üzerinde çizim yapacağız ama geri kalan 100pxlik kısımlar boşluk) ve onun üzerinde ölçekleyerek çizeceğiz. Eğer buyuk dediğimiz değişken 10’dan küçük ise oranı 25 aldım yoksa aptalca şekiller çıkıyor. 10’dan büyük ise direkt olarak 250’yi buyuk değişkenine bölerek ölçeği hesaplattık. Neden 250 çünkü resmin boyutunun yarısı.

   cizim=open("ciz.php","w")
    cizim.write("""<?
Header('Content-Type: image/jpg');
$im = ImageCreateTruecolor(600,600);
ImageFilledRectangle($im,550,300,50,300,0x00ffffff);//x ekseni
ImageFilledRectangle($im,300,550,300,50,0x00ffffff);//y ekseni
$white = ImageColorAllocate($im,255,255,255);
$red = ImageColorAllocate($im,255,0,0);
""")
7)Bu kısım bütün php dosyalarımızda sabit olarak yazdırdğımız bölüm. Yani değişkenlere bağlı değildir. X ekseni ve Y eksenini çiziyor, beyaz ve kırmızı renkleri tanıtıyor.
    for i in range(len(xeksenindekoord)):
        xkoordinat=oran*xeksenindekoord[i]
        ykoordinat=oran*yeksenindekoord[i]
        xekseniyazida=xeksenindekoord[i]
        yekseniyazida=yeksenindekoord[i]
        kutle1=kutleler[i]

8)Burada for döngüsünü xeksenindekoord listesindeki eleman sayısınca döndürdük. Yeksenindekoord ve kütleler listelerinde de aynı eleman sayısı olduğu için bir farkı yok. Şimdi xkoordinat  değişkeni oluşturup oranla xeksenindekoord listesindeki değerle çarpıyoruz. O satırdan sonrası php de grafik oluşturma konusu. Fakat 300+xkoordinat-0.5*oran burada ne yaptığımızı anlatayım. 300 px’e xkoordinat değerini ekliyo ve bundan ölçeğimizin yarısını çıkartıyo. Sebebi bu değer phpde o dikdörtgen şeklinin başladığı yeri anlatır. Yani ölçeğin yarısını çıkartıp sonraki bittiği değere de ölçeğin yarısını eklediğimizde ise dikdörtgenin tam merkezi gelmesi gereken koordinata geliyor. Uzerine de ağırlıklar ve altına ise koordinatları yazılıyor. Büyüklükleri ve şekle olan uzaklıkları hep ölçeğimizle alakalı incelerseniz o kısımları anlarsınız muhakkak.

def main():         
    try:
        sor()
    except(ValueError):
        print "Son yazdığınız kayıt değer hatası yaptığınız için kaydedilmedi. Yalnızca sayı girerek tekrar deneyin"
        sor()
    hesapla()
9)Bu fonksiyon ise programın diğer fonksiyonlarını çağıran bir fonksiyon. Try except bloğuyla bize aptal aptal karakterler fırlatan kullanıcılardan programın kapanmasını engellemeye çalışıyoruz.
while True:
    main()

10)Döngümüzü sonsuza ulaştırıyoruz (:

Bu doküman can sıkıntısı sonucu python-php çiftleşmesiyle ZoRKaYa tarafından Tahribat.Com için yazılmıştır.

Tarih:
Hit: 625008
Yazar: ZoRKaYa



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.