2013-02-25 11 views
5

Kütüphane işlevlerini kullanmadan daire oluşturan bir dizi kümeyi nasıl çizebileceğimi (/ pikselleri ayarladığımı) anlamaya çalışıyorum . Şimdi, yarıçapı verilen noktaların (x, y) koordinatlarını almak basittir. Ben noktaları bir kezGrafik kütüphanesi veya başka kütüphane işlevleri kullanmadan bir nokta/piksel ayarı nasıl yapılır

for (x=-r; x <r; x=x+0.1) { 
     y = sqrt(r*r - x*x); 
     draw(x,y, 0, 0); 
    } 

Ama, aslında daire çizin nasıl bana kafa karıştırıcı budur. Ben grafik kütüphanesini kullanabilirsiniz ama grafik kütüphanesi

kullanmadan bunu nasıl anlamak istiyorum
void draw(float x, float y, float center_x, float center_y) { 
      //logic to set pixel given x, y and circle's center_x and center_y 
      // basically print x and y on the screen say print as a dot . 
      // u 'd need some sort of a 2d char array but how do you translate x and y 
      // to pixel positions 
    } 

birisi herhangi linkler/referanslar paylaşabilir veya bunun nasıl çalıştığını açıklayabilir misiniz?

+3

Hangi ortamda? – JasonD

+4

lütfen "berabere" yi tanımlayın! "Ekrana yazdırma" anlamına gelirse, bu, kullandığınız sisteme çok bağlıdır. –

cevap

6
char display[80][26]; 

void clearDisplay(void) { 
    memset(display, ' ', sizeof(display)); 
} 

void printDisplay(void) { 
    for (short row=0; row<26; row++) { 
    for (short col=0; col<80; col++) { 
     printf("%c", display[col][row]); 
    } 
    printf("\n"); 
    } 
} 


void draw(float x, float y, float center_x, float center_y) { 
    if (visible(x,y)) { 
    display[normalize(x)][normalize(y)] = '.'; 
    } 
} 

EDITH: sorunuzun daha fazla dahil etmek, Yorumunuzu değişti, bu yüzden cevabım biraz genişletecektir.

Eğer koordinatlar iki set vardır: bunlar çoğunlukla sizin x ve y (bir dünya haritası veya elektromıknatıs mikroskop üzerinde femtometers üzerinde ölçekli enlem ve boylam gibi)

  • Dünya koordinatları
  • ekran koordinatları: bunlar (piksel ya da peller veya inç başına nokta)

bir metrik gerek fiziksel boyutları ile, Nexus 7 veya Nexus 10 Tablet gibi görüntüleme cihazının gösterimi vardır, o sizin dünyanız ekran Coordi içine koordinatları dönüştüren kabaetler. İşleri daha karmaşık hale getirmek için, gösteremediğiniz şeyleri (Afrika'yı göstermek istediğinizde, afrika gibi) gizlemek için bir pencereye (kullanıcının göstermek istediği kısmı) ihtiyacınız vardır. Ve sen dünyanın (görüntülemek istediğiniz ne kadar avrupa)

Bu ölçümler ve kupürleri basit cebirsel dönüşümler vardır görüntülü koordinatlar ile tutuyor koordinatları Büyütmek isteyebilirsiniz

  • Display- için dünya koordinat Büyütmek koordinat: görüntü-X = dünyaca x * faktörü (piksele femtometer veya kilometre)
  • görüntülemek-merkez için dünya merkez çevir görüntü-X + ayar

vb. Sadece "alegorik dönüşüm" veya "geometriler" için wikipedia "

+0

Güzel ... - ama neden 26 değil 25 hatta daha iyi 24? – alk

+0

@alk: sadece bir sayı, haklısınız, 24 daha iyi olabilir –

2

Zor bir soru çünkü teknik olarak C yerleşik herhangi bir giriş/çıkış kapasitesine sahip değil. Bir dosyaya yazmak bile bir kütüphane gerektirir. Gerçek modda DOS gibi bazı sistemlerde, video belleğine doğrudan erişebilir ve bu belleğe değerler yazarak pikselleri ayarlayabilirsiniz, ancak modern OS'ler bunu yapmanın gerçekten yolunu bulur. Programı bir OS olmadan daha izin verici bir CPU modunda başlatmak için bir bootloader yazmayı deneyebilirsiniz, ancak bu muazzam bir solucan olabilir.

Bu yüzden, stdio kitaplığını kullanarak, diğer yanıtları gösterildiği gibi ascii grafiklerini kullanarak stdout'a yazabilir veya ayrı bir görüntü görüntüleme programıyla görüntülenebilen xbm gibi basit bir grafik formatı çıktı alabilirsiniz. . Daha iyi bir seçim, biçimleri olabilir.

Daire çizimi bölümü için, klasik Bresenham algorithm'a bakın. Veya, çok fazla bilgi için, Jim Blinn'in A Trip Down the Graphics Pipeline bölüm 1'i, farklı daire çizim algoritmalarını açıklar!

İlgili konular