Giter Club home page Giter Club logo

prolab1-3dnoktaokuma's Introduction

Programlama Laboratuvarı Raporu

3D Nokta Okuma



Özge POYRAZ
Kocaeli Üniversitesi
Mühendislik Fakültesi
Bilgisayar Mühendisliği
[email protected]



Burak Can TEMİZEL
Kocaeli Üniversitesi
Mühendislik Fakültesi
Bilgisayar Mühendisliği
[email protected]


Özet—Bu çalışmada genel olarak 3 boyutlu uzayda belirli nokta kümeleriyle geometrik işlemler gerçekleştirdik ve bu işlemlerden birtakım sonuçlar elde ettik. Bu işlemleri gerçekleştirirken nokta bilgilerini dosya girdileri olarak aldık bu da bize fazla sayıda veri ile işlem yapma imkanı sağladı. Bu şekilde program büyük veri dosyalarını işleyerek işlemlerin çok hızlı bir şekilde yapılıp sonuçların elde edilmesini oldukça kolaylaştırdı. Veri dosyalarıyla yapılan bu işlemler aynı zamanda bize verilerin görselleştirilmesi ve incelenmesi fırsatını da verdi. İşlemleri gerçekleştiren yapıyı kurduktan sonra ayrı bir programda verilerimizi görselleştirerek sonuçların doğruluğunu test etmiş olduk. Program yapısal olarak dosya okuma, geometrik işlemleri gerçekleştirme ve sonuç verme aşamalarından oluşuyor. Dosya okurken farklı veri tipinde dosyaların okuması gerçekleştiriliyor ve nokta bilgileri elde ediliyor. Daha sonra bu nokta bilgileri kullanılarak çeşitli işlemler gerçekleştiriliyor ve aynı veri tipinde hesaplanan yeni nokta bilgilerini kullanıcıya çıktı olarak veriyor. Bu proje dosya işlemleri, dinamik bellek kullanımı, lineer cebir ve geometrik işlemler gibi konularda çok sayıda kazanım elde etmemizi sağladı.

I.PROJE HAKKINDA

Gerçekleştirdiğimiz proje birkaç temel aşamadan oluşmaktaydı ve her aşamanın kendine göre isterleri bulunmaktaydı. Proje kaba olarak özel bir dosya formatından okuduğumuz nokta verilerini belli işlemlerden geçirip kullanıcıya bir çıktı vermek üzerineydi. Daha ayrıntılı olarak bahsetmemiz gerekirse “.nkt” uzantılı olarak hazırlanmış yazı belgelerinde bir dosya yapısı oluşturulmuş ve içerisine farklı veri tiplerinde ve farklı parametreler içeren nokta bilgileri yazılmıştı. Programımızla bu dosyalardan noktaları okuyup işleme başlamadan önce ayrıca gerçekleştirmemiz gereken ek dosya işlemleri mevcuttu. Burada en önemli hususlardan birisi bir klasörden bilinmeyen sayıda dosyanın otomatik bir şekilde okunmasıydı. Bu konuya daha sonra yöntemler ve program mimarisi kısmında detaylıca değinilecektir. Dinamik bir dosya okuma yapısı kurulduktan sonra noktalar okunacak ve istediğimiz işlemleri gerçekleştirebilmek için belleğe atılacaktı. Daha sonra elde ettiğimiz verilerle hedeflediğimiz sonuçları elde etmek için kullanmamız gereken matematiksel yöntemleri hazırlamamız gerekecekti. Yine aynı şekilde bu işlemlerin matematiksel modellemelerine raporun ileri kısımlarında değinilecektir. Bazı matematiksel işlemler az sayıda veri ile hızlı ve kolay bir şekilde gerçekleştirilebilir.  Çok sayıda verinin işlenmesi, hesaplanması çok fazla zaman ve emek ister. Bu problemleri çözmek amacıyla hazırlanmış bilgisayar programlarından yardım almak; zamanı oldukça azaltacaktır, efor kaybına engel olacaktır ve hata payını ortadan kaldıracaktır. Bu programı hazırlarken sürekli büyük verilerle kullanabileceğini düşünerek ona göre bir mimari hazırlamaya özen gösterdik. Hem yavaş çalışmaması hem de kaynakları iyi kullanması gerekiyordu. Bu amacı gerçekleştirmek için çeşitli yöntemler izledik. Dosya işlemlerini gerçekleştirdikten sonra elde ettiğimiz nokta verileriyle matematiksel işlemleri gerçekleştirdik. Programımızın temel amaçlarından birisi dosyalardan alınan verileri okuyup işlemleri gerçekleştirip noktaları uzun süreli bellekte tutmaktan kaçınmaktı. Daha sonra elde edilen sonuçları kullanıcıya tekrar bir dosya olarak sunmamız gerekiyordu. Burada işlemden geçirdiğimiz nokta verilerinin sonuçlarını bir sınıflandırmaya tabi tutup okuduğumuz veri tipinde çıktı işlemini gerçekleştirdik. Binary ve ascii dosyalar için farklı çıktılar oluşturduk.

II.YÖNTEMLER VE PROGRAM MİMARİSİ

A.Dosya İşlemleri

Programımız çok sayıda dosya işlemini gerçekleştiren bir yapıdaydı. Burada ilk ve önemli bir husus olarak karşımıza dinamik dosya okuması çıkmaktaydı. Verilen istere göre programımız otomatik olarak klasöründe bulunan “.nkt” dosyalarını işleme sokmalıydı. Bunun için sadece dosya işlemleri yetmemekteydi aynı zamanda klasör işlemleri gerçekleştirmeliydik. Klasör bilgisini edinmek için Open Group Library “dirent.h” kütüphanesini kullandık. Bu başlık dosyası içerdiği özel değişken tipleri, veri yapıları ve fonksiyonlarla klasör işlemlerini gerçekleştirmemizi sağladı. Burada temel olarak kullandığımız fonksiyon ve yapılardan bazıları klasörü açmak için opendir(), klasör okuma işlemi için readdir(), klasör kaynağı tipi olan DIR ve girdilere ulaşmak için dirent struct yapısıydı. Bu ve bunun gibi yapılarla dosya girdilerimize ulaşıp istediğimiz şekilde dosya dizilerimizi yaratarak gerekli ortamı oluşturmuş olduk. Daha sonrasında da dosya işlemlerimizi gerçekleştirdik. Dosya işlemlerimizi gerçekleştirirken kullanıcıdan aldığımız dosyanın veri tipine göre binary okuma ve yazma işlemi de gerçekleştirdik. Binary işlemlerini gerçekleştirirken değerlerimizin doğruluğunu çeşitli hex editörler ile test ettik.

B.Verilerin Okunması ve Saklanması

Programımızın bellekte daha az alan tüketmesi için okuduğumuz verileri tek bir dinamik struct dizisinde tutmaya çalıştık böylece her dosya için sürekli aynı diziyi tekrar tekrar boyutlandırarak işleme sokup bu şekilde noktaları depoladık. Daha sonra bu diziyi işlemlere göndererek kullandık. Dosyalardan hataları yakalarken tüm dosya yapısını halihazırda okumuş olacağımız için buradan elde ettiğimiz dosya verilerini yine sadece dosyalarla ilgili bilgilerin saklanması ve hataların tutulması amacıyla oluşturduğumuz dinamik struct dizilerinde sakladık bu da daha sonra program akışında veri tipleri, parametre tipleri ve dosyalarla ilgili bilgileri yönlendirirken oldukça işimize yaradı ve tekrar tekrar dosyalardan bilgi okuma zorunluluğumuzu ortadan kaldırdı.

C.Matematiksel İşlemler

Dosyalardan elde ettiğimiz verileri farklı işlemlerden geçirip bazı çıktılar elde etmemiz gerekiyordu. Burada her işlem için farklı matematiksel metotlar kullandık. En yakın ve en uzak probleminde iki nokta arasındaki uzaklığı Pisagor teoreminden faydalanarak tespit ederek işlemlerimizi gerçekleştirdik. En küçük küp problemine geldiğimizde yine aynı teoremden faydalanarak her eksen için noktalar kümesinde maksimum uzunluğu bularak küpün sahip olacağı ayrıtı tespit ettik. Daha sonrasında yine her eksendeki uzaklık farkından faydalanarak küpün merkez noktasını bulduk ve ayrıt uzunluğundan da faydalanarak köşe koordinatlarını oluşturduk. Bu sırada fark ettik ki eğer herhangi bir eksende maksimum uzaklık diğer bir eksenden küçükse yani küpün her kenarına bir nokta temas etmiyorsa aslında hacmi sabit kalmakla birlikte sonsuz pozisyonda küp tüm noktaları içine alabilecekti. Programımız yapısal olarak bir konsol uygulaması olduğu için bunu görselleştirme imkanımız yoktu. Daha sonra Processing Java’da ayrı bir program yazarak işlemlerimizin matematiksel modellerini görselleştirdik. Böylece kendi programımızdaki sonuçlarımızın doğruluğunu teyit etmiş olduk.

Kullandığımız matematiksel modellemelerin görselleştirilmesi

D.Program Çıktıları

Programımız farklı veri tiplerinde dosyalarla işlem yaptığı için çıktılarımızı da buna göre biçimlendirmek zorundaydık. Binary dosya çıktılarını oluştururken öncelikle verilerimizin binarye doğru bir şekilde dönüştürüldüğünü test ettik ve daha öncesinde program akışını kontrol etmek için hazırladığımız çeşitli yapılarla bu verileri çıktı olarak kullanıcıya sunduk.

E.Programın Genel Yapısı ve Tasarım

Programın genel yapısı ve işleyiş algoritması raporun en sonunda verilmiştir. Tasarım olarak standart bir konsol uygulaması biçimindedir.



Programın Genel Arayüzü


F.Performans

Program çok sayıda veriyle işlem gerçekleştirebileceği için derlenirken optimize edilmesi performansını büyük ölçüde etkilemektedir. Codeblocks Mingw derleyicisinin içindeki gcc.exe ile yapılan derleme işleminde -O2 veya -O3 optimizasyon parametreleriyle yapılan derleme işlemlerinde çok büyük bir hız farkı oluşmaktadır ve direkt olarak derlenebilmektedir. Eğer bu optimizasyonlar gerçekleştirilmezse işlemlerde bekleme süreleri artabilmektedir. Bu yüzden bu şekilde derlenmesi gerekmektedir.

Tam olarak kaynağı main.c olan dosya için terminal ya da komut isteminden Codeblocks/Mingw/bin altındaki gcc.exe yoluna gidilerek aşağıdaki derleme komutu ile derlenmelidir.


  • gcc -O3 main.c -o “uygulamaismi”


III.GELİŞTİRME ORTAMI VE KULLANILAN DİL

Projeyi C programlama dilinde Windows işletim sistemi üzerinde gerçekleştirirken, geliştirme ortamı olarak gcc derleyicili Codeblocks 17.12 sürümünü kullandık. Programda kullandığımız kütüphaneler

  • stdio.h

  • stdlib.h

  • dirent.h

  • string.h

  • math.h


IV.DENEYSEL SONUÇLAR

Bu projeyle birlikte büyük verilerle işlemler gerçekleştirmeye çalıştık ve bu verileri çeşitli işlemlerden geçirdik. Bu sırada geometri uygulamalarını daha yakından inceleme fırsatı bulduk. Elde ettiğimiz sonuçların doğruluğunu test etmek amacıyla verilerimizi görselleştirerek, kontrol edip bu modellerin çıktılarıyla kıyaslayarak kendi test yöntemlerimizi oluşturduk.En küçük küp problemini çözmeye çalışırken aslında bazı şartlar altında bir nokta kümesini kapsayan sonsuz sayıda küp olduğunu keşfettik.

V.SONUÇ

Bu projenin gerçekleştirilmesiyle aslında çok fazla kazanım elde ettik. Bunlardan bahsetmemiz gerekirse geniş çaplı dosya işlemlerinde oldukça tecrübe elde ettik. C programlama dilinin güçlü bir yanı olan bellek işlemlerini bol bol kullanma fırsatı sağladık ve bu şekilde daha optimize bir program elde etmeye çalıştık. Kullanıcı deneyimini iyileştirmek için çalışmalar yapma fırsatı bulduk. Algoritma yeteneğimizi geliştirdik ve bir uygulamayı nasıl daha işlevsel hale getirebiliriz gibi sorularla ilgilendik.

VI.KAYNAKLAR



Programın Genel Akış Şeması


prolab1-3dnoktaokuma's People

Contributors

burakcantemizel avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.