PDA

Tam Sürümünü Görmek İçin : bir dikdörtgenler prizmasını döndürme kodu


caglar
13/03/2004, 23:42
Bir dikdörtgenler prizmasını c kodu yazarak nasıl döndürebilirim.(Ben matematiksel modelini çıkaracağım.Fakat sonra onu programlamaya uyarlamam gerekli. böyle yazılmış bir kod varsa önce onu incelemem akıllıca olur.(tekerleği yeniden keşfetmeye gerek yok)
yardımınız için şimdiden teşekkürler


integral
14/03/2004, 17:46
Bir dikdörtgenler prizmasını c kodu yazarak nasıl döndürebilirim.(Ben matematiksel modelini çıkaracağım.Fakat sonra onu programlamaya uyarlamam gerekli. böyle yazılmış bir kod varsa önce onu incelemem akıllıca olur.(tekerleği yeniden keşfetmeye gerek yok)
yardımınız için şimdiden teşekkürler

C kodunu yazmak kolay.. ancak modellemesi biraz hesap kitap işi.. dondurmekden hangi açı, hangi yöne kastediyorsun? Mesela 30 derece ve saat yonunun tersi mi? veya ne bileyim, 90 derece ve saat yonu mu???
Bunlar bilinmeden c kodunu yazmak zor. Matematik muhendisliginde okutulan derslerden biri bu dondurmeler ile ilgiliydi. Matris islemi yapiyorsun sonucta.
Bana özel mail atabilirsin.
Kolay gelsin.

acehreli
15/03/2004, 00:00
Uc boyutlu kutuphanelerle deneyimim yok. Bu konuda yardimci olacak cesitli grafik kutuphaneleri olmali. (?)

Ama eger kendimiz yapmak istersek, cisim cizilirken noktalarin iki boyutlu yuzeye (ekrana) iz dusumleri hesaplanir ve noktalar arasina cizgiler orada cizilebilir.

Fizikcilik oynadigim zamanlarda yazdigim bir program, uc boyutlu uzayda egriler ('strange attractor'lar) hesapliyor ve ekranda gosteriyordu. Program DOS icin yazildigi icin ve 'putpixel' gibi standart olmayan islevler cagirdigi icin artik calistiramiyorum :( :)

Guzel bir programdi. Hey gidi gunler... :) Ok tuslarina basarak cismi ekranda cevirebiliyorduk filan... :)

Iki boyutlu uzaya iz dusurmek icin kullandigim satirlar sunlarmis:


void
plot3d(void)
{
int scrx, scry; // ekran koordinatlari
int trj;

for (trj = 0; trj < TRAJECTORY; trj++)
{ // ekran koordinatlarini hesapliyoruz
scrx = magn * (pn[trj].x * cosP - pn[trj].y * sinP);
scry = magn *
(pn[trj].x * sinPcosT + pn[trj].y * cosPcosT + pn[trj].z * sinT);

putpixel(xoff + scrx, yoff - scry, color[trj]);
}
}


O zamanlar deneyimsiz oldugum icin bolca global degisken filan da kullanmisim :) Yukaridaki satirlardaki cosP vs. hep global degiskenler:


// Nokta
struct point
{
long double x;
long double y;
long double z;
};

long double thet, phi; // cisme bakis acilari
struct point pn[TRAJECTORY]; // noktalar
long double magn; // buyutme orani
long double sinT, cosT, sinP, cosP, sinPcosT, cosPcosT; // hesaplarda kullanilacak bazi degerler
int xoff, yoff; // koordinat merkezi


plot3d'yi cagirmadan once asagidaki islev ile yukaridaki sabitleri hesapliyormusum: (O sabitler her nokta icin ayni oldugu icin, anlasilan bir kere hesaplamak programi hizlandiriyormus.)


void
calcsincos(void)
{
sinT = sinl(thet);
cosT = cosl(thet);
sinP = sinl(phi);
cosP = cosl(phi);
sinPcosT = sinP * cosT;
cosPcosT = cosP * cosT;
}


Yukaridaki koda bakarak anladigima gore, x,y,z gibi uc koordinattan olusan bir cismin iki boyuta iz dusumu soyle hesaplanir:

x,y,z: herhangi bir noktanin uc koordinati
P: saga-sola dondurme acisi (fi)
T: yukariya-asagiya egme acisi (teta)

ekran_x = x * cos(P) - y * sin(P);
ekran_y = x * sin(P) * cos(T) + y * cos(P) * cos(T) + z * sin(T);

Ali