C Programlama Dili Kullanarak Grafik Çizdirme

(İlhami Barut) #1

Selamun aleyküm.
Python kullanarak grafikler çizdirip, bunların programlarını [Rehber] Pardus Notlarım konusunda paylaşmıştım. C programlama dili kullanarak da grafikler çizdirmek istedim ve aşağıda anlattığım şekilde çizdirebildim.
İlk olarak C derleyicisi gcc ve grafik çizdirmek için gerekli freeglut3-dev (OpenGL) paketinin kurulması gerekiyor. Bunu aşağıdaki komutla yaptım (Synaptic Paket Yöneticisi ile de oluyor).

sudo apt-get install gcc freeglut3-dev

Kurulumdan sonra, herhangi bir metin düzenleyici ile (ben Geany programını tercih ettim) programlarımı yazdım ve home dizinine kaydettim. Sonra home dizinindeyken, fare işaretçisi (genelde ok şeklinde olur) boş bir yerdeyken farenin sağ tuşuna tıklayıp, Burada Terminal Aç’ı seçtim. Derleme için örneğin,

gcc sinus.c -o derlen -lglut -lGL -lm

komutunu girdim. Derlenen programı çalıştırmak için (örneğin)

./derlen

komutunu girdim ve grafiği ekranda gördüm.

Geany programını kullanarak C programlarını çalıştırmak için ise, İnşa Et>İnşa Komutlarını Seç yolu izlendiğinde açılan pencereye -lglut -lGL -lGLU -lm yazısı eklenip, Tamam düğmesine tıklanarak, ayarlama işlemi yapılmalı. Bir programın derlenmesi, inşa edilmesi ve çalıştırılması için ise, sırayla Derle, İnşa et ve Çalıştır düğmelerine tıklanmalıdır.

Bunlarla ilgili videolar çektim.

Programları da paylaşayım.

#include <GL/gl.h> // OpenGL
#include <GL/glu.h> // kütüphaneleri
#include <GL/glut.h> // dahil edildi.
#include <math.h> // Matematik fonksiyonları için (sin() vb.) bu kütüphane kullanılmakta.

void SinusCiz(void);
static int ortho = 1; // Görülen ortho kelimeleri grafiğin tamamının
// görüntülenmesi amacıyla kullanıldı.
static void Hepsinigoster(int w, int h) { // Buradaki hepsinigoster fonksiyonu grafiğin tamamının
glViewport(0, 0, w, h); // görüntülenmesi için kullanıldı.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (ortho) {
glOrtho(-7.0, 7.0, -1.5, 1.5, -1.0, 1.0);}
glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
if (argc > 1) {
ortho = 0;
}
glutInitWindowPosition(320, 160); // Grafik penceresinin ekranın belirli bir kısmında çıkması sağlandı.
glutInitWindowSize(640,480); // Grafik penceresinin boyutu ayarlandı.
glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA); // Görüntü modu belirlendi.
glutCreateWindow(“Sinus”); // Açılacak grafik penceresine isim verildi.
glClearColor (1.0, 1.0, 1.0, 1.0); // Arka plan rengi beyaz yapıldı.
glutDisplayFunc(SinusCiz); // SinusCiz fonksiyonu çağrıldı.
glutReshapeFunc(Hepsinigoster); // Hepsinigoster fonksiyonu çağrıldı.
glutMainLoop();
return(0);
}

void SinusCiz (void) // Buradaki SinusCiz fonksiyonu sinüs grafiğini çizmek için kullanıldı.
{
double t, genlik; // t değişkeni double olarak tanıtıldı.
glClear(GL_COLOR_BUFFER_BIT); // Tampon temizlendi ve renkli çizim için ayarlandı.
glPointSize(3.0); // Nokta boyutu (çapı) belirlendi.
glBegin(GL_POINTS); // Noktalarla yapılacak çizim işlemi başlatıldı.
for(t = -6.28; t <= 6.28; t+=0.01){ // İki periyotluk sinüs için döngü başlatıldı.
glColor3f(0.0, 0.0, 0.0); // Noktaların rengi siyah yapıldı.
genlik = sin(t); // Zamanın sinüs değeri genlik değişkenine atandı.
glVertex2f(t,genlik); // Noktanın grafik ekrandaki koordinatları atandı.
} // Döngü bitti.
glEnd(); // Çizim işlemi bitti.

glFlush(); // Çizim ekranda gösterildi.
}

#include <GL/gl.h> // OpenGL
#include <GL/glu.h> // kütüphaneleri
#include <GL/glut.h> // dahil edildi.
#include <math.h> // Matematik fonksiyonları için (exp() vb.) bu kütüphane dahil edildi.
#include <stdio.h> // Değişkenleri okutmak (scanf) ve yazdırmak (printf) için dahil edildi.

void KonsansatorunDolmasiniCiz(void);
static int ortho = 1; // Görülen ortho kelimeleri grafiğin tamamının
// görüntülenmesi amacıyla kullanıldı.
static void Hepsinigoster(int w, int h) { // Buradaki hepsinigoster fonksiyonu grafiğin tamamının
glViewport(0, 0, w, h); // görüntülenmesi için kullanıldı.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (ortho) { // Zaman sabitinin beş katı dikkate alınarak,
glOrtho(-5, 5, -1.5, 1.5, -1.0, 1.0);} // glOrtho() fonksiyonunun en soldaki iki değeri belirlendi.
glMatrixMode(GL_MODELVIEW);
}

void KonsansatorunDolmasiniCiz (void) // Buradaki KonsansatorunDolmasiniCiz fonksiyonu kondasatörün
{ // dolma grafiğinin çizdirilmesi amacıyla kullanıldı.
double t, genlik; // t değişkeni double olarak tanıtıldı.
double Zamansabiti, aradeger; // Zamansabiti değişkeni double olarak tanıtıldı.
printf (“Zaman Sabitini Giriniz:”); // Ekrana “Zaman Sabitini Giriniz” yazısı yazdırıldı.
scanf ("%lf",&Zamansabiti); // Klavyeden girilecek değerin Zamansabiti değişkenine atanması sağlandı.
printf (" \n"); // Bir satır boşluk bırakılıp, bir alt satıra geçildi.
glClear(GL_COLOR_BUFFER_BIT); // Tampon temizlendi ve renkli çizim için ayarlandı.
glPointSize(3.0); // Nokta boyutu (çapı) belirlendi.
glBegin(GL_POINTS); // Noktalarla yapılacak çizim işlemi başlatıldı.
for(t = 0; t <= 5.0*Zamansabiti; t+=0.01){ // Artış miktarı 0,01 olan, beş Zaman sabiti süreli bir döngü başlatıldı.
glColor3f(0.0, 1.0, 1.0); // Noktaların rengi camgöbeği yapıldı.
aradeger=t/Zamansabiti; // t değişkeni, Zamansabitine bölünüp, aradeger değişkenine atandı.
genlik = 1-exp(-aradeger); // Zamanın üstel değeri genlik değişkenine atandı.
glVertex2f(t,genlik); // Noktanın grafik penceresindeki koordinatları atandı.
} // Döngü bitti.
glEnd(); // Çizim işlemi bitti.
glFlush(); // Çizim grafik penceresinde gösterildi.
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
if (argc > 1) {
ortho = 0;
}
glutInitWindowPosition(320, 160); // Grafik penceresinin ekranın belirli bir kısmında çıkması sağlandı.
glutInitWindowSize(640,480); // Grafik penceresinin boyutu ayarlandı.
glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA); // Görüntü modu ayarlandı.
glutCreateWindow(“Kondansatorun Dolmasi”); // Açılacak grafik penceresine isim verildi.
glClearColor (1.0, 1.0, 1.0, 1.0); // Arka plan rengi beyaz yapıldı.
glutDisplayFunc(KonsansatorunDolmasiniCiz); // KonsansatorunDolmasiniCiz fonksiyonu çağrıldı.
glutReshapeFunc(Hepsinigoster); // Hepsinigoster fonksiyonu çağrıldı.
glutMainLoop();
return(0);
}

Programları dosya olarak da paylaşayım. İçerikleri kopyalayıp, Geany programında kaydedip, uzantılarını .c yaparsanız, çalışır.

sinus.odt (17.1 KB)

kondansator.odt (18.6 KB)

Ayrıca, hazır .c uzantılı dosyaları aşağıdaki adrese yükledim. İndirdikten sonra, Ev>İndirilenler içerisinde arşiv dosyasına sağ tıklayıp, "Buraya ayıkla"yı seçerseniz, dosyalara ulaşmış olursunuz.

https://dosya.co/xzlvtdixome9/C_Programlarım.tar.gz.html

Hayırlı çalışmalar dilerim.

4 Likes

(İlhami Barut) #2

Selamun aleyküm.
Derleme sonucu (Geany programında İnşa Et düğmesine tıklandıktan sonra) ortaya çıkan uzantısız dosya çift tıklama ile açılmak istenirse, aşağıdakiler yapılabilir.
Dosyaya sağ tıklanıp, Diğer Uygulama İle Aç…'a tıklanır. Burada Uçbirim Öykünücüsü seçilip, “Bu tür dosyalar için öntanımlı olarak kullan” yazısına tıklanarak onay işareti konulduktan sonra Aç düğmesine tıklanır. Eğer dosyaya çift tıklandığında hata mesajı çıkarsa, dosya farklı bir dizine taşınarak sorunun üstesinden gelinir.
Hayırlı günler dilerim.

1 Like

(Musa Ortagedik) #3

Selamun Aleyküm
Hocam emeğinize sağlık. Faydalı bilgiler sunuyorsunuz ancak rica etsem böyle uzun uzun mesaj olarak atmak yerine projeyi github üzerine yükleyip link verseniz daha hoş olacaktır. Ben merak ettim denemek istiyorum şimdi fakat sizin yaptığınız her şeyi en baştan yapmak zorundayım. Belki başka bir yerde hata verecek. Çok yaşadığımız bir şey; bazen bir paket ihtiyacı oluyor sizin sisteminizde başka bir uygulama tarafından sağlanmış oluyor fakat bizde olmuyor. Ama yüklerken de bağımlılıkları içine eklenmemiş mesela. Yani bu tip olayların yaşanmaması için github üzerinden projeyi sunun ve biz de indirip deneyelim. Orada da şunu dersiniz mesela; arkadaşlar xx ve yy paketini kesin yüklemeniz gerek sonrasında projeyi indirip derleyin çalışır. Bu ifade daha basit ve uygulaması daha kolaydır.

Tekrar çok çok teşekkür ediyorum emeğinize. Bu tip yazılarınızın devamını bekleriz açıkça. Bir ders dizisi yapabilirsiniz mesela.

Selamun Aleyküm.

0 Likes

(İlhami Barut) #4

Aleyküm selam.
Bağımlılıklardan emin olmak için sistemi yeniden kurup, hiç bir program kurmadan deneme yaptığımdan o konuda sıkıntı çıkacağını sanmıyorum.
Burada yükleme olarak gcc, freeglut3-dev ve isteğe bağlı olarak geany kurmak yeterli.
C programlarını da hazır olarak en altta paylaştım.

Paylaşımlarım, genelde bir işi Pardus’ta ilk defa yapacaklara yardımcı olmaya yönelik. Uzun süreli işlere kalkışmam pek mümkün görünmüyor.
Ayrıca, paylaşımlarımı sadece bu sitede yapıyorum.
Hayırlı günler dilerim.

0 Likes