Tarih: Sat Oct 22, 2005 2:33 pm Mesaj konusu: Cizim algoritmalari
Selam arkadaslar,
cizim komutlarinin (line, circle, arc, ellips , v.s.) kullandigi algoritma ile ilgili bir kaynak ariyorum.
Yani aradigim su; (10,10) koordinatindan (150,130) koordinatına doğru bir çizgi çizdik diyelim, bu iki koordinat arasinda hangi pikseller boyanir, veya (300,300) merkezli yaricapi 50 piksel olan bir daire cizdik diyelim, bu durumda hangi pikseller boyanir.
Bu cizim komutlarinin kullandigi matematiksel bagintili algoritmalar hakkinda bilgi verecek arkadaslar varsa cevaplarini bekliyorum. simdiden tesekkur ederim... iyi calismalar..
Cizim araligi sana kalmis bisi yani soyle diyebiliriz istenilen coklukta noktalar dizisi olusturcaksin.
yani soyleki aralik belirlikceksin ve bir noktadan diger noktaya sanki hareket vektoru varmis gibi noktalari tek tek yerlestireceksin.
//-------------------------------------------------
1.nokta
* * 2. nokta
//-------------------------------------------------
aralik belirle ve her aralikta bir nokta yerlestir ve hareket vektoru diger noktayi gostercek sekilde devam et.
*------> *
//-------------------------------------------------
Son olarak tum noktalari ciz cok sık aralik olursa bu bir LINE olur
Gelelim cember v.s. cizimine bildigimiz (birim cember) sin , cos fonksiyonlarini kulanarak gene belirledigin bir aralikta nokta yerlestirerek bu isi yapabilirsin aralik ne kadar sık olursa gorunum olarak daha iyi olucaktir.
repeat
v=v+1
for r=1 to 30
dot (cos(v)*r)+100,(sin(v)*r)+200,rgb(v,v,v)
dot (2*sin(v)*30)+200,(cos(v)*30)+200,rgb(255,255,255)
dot (cos(v)*r)+300,(sin(v)*r)+200,rgb(255,255,255)
dot (sin(v)*30)+400,(cos(v)*30)+200,rgb(255,255,255)
dot v,300,rgb(255,255,255)
next r
sync
until escapekey()
buda uygulaması
/* Pikselleri görüntüleyecek döngü kurulup
döngünün her işleyişinde x ve y değişkenleri
xFark ve yFark kadar artırılır. */
while (pikselSayisi--)
{
pikselBas((int)floor(x + 0.5f), (int)floor(y + 0.5f));
x += xFark;
y += yFark;
}
}
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
void dogruBresenham(int x1, int y1, int x2, int y2)
{
int hata = x1 - x2;
int dxCarpi2 = (x2 - x1) * 2;
int dyCarpi2 = (y2 - y1) * 2;
int x, y = y1;
for (x = x1; x < x2; x++)
{
pikselBas(x, y);
hata += dyCarpi2;
if (hata > 0)
{
y++;
hata -= dxCarpi2;
}
}
}
////////////////////////////////////
////////////////////////////////////
void alanDoldur(int x, int y, int eskiRenk, int yeniRenk)
{
if (pikselAl(x, y) == eskiRenk)
{
pikselBas(x, y, yeniRenk);
/* (x, y) koordinatına komşu 4 piksel için prosedürü
özyineli olarak çağır. */
alanDoldur(x+1, y, eskiRenk, yeniRenk);
alanDoldur(x-1, y, eskiRenk, yeniRenk);
alanDoldur(x, y+1, eskiRenk, yeniRenk);
alanDoldur(x, y-1, eskiRenk, yeniRenk);
}
}
////////////////////////////////////
///BSpline Eğrisi////////////////////////////
////////////////////////////////////
typedef struct
{
float x, y, z;
} Nokta3B;
int dugumK, dugumN;
int dugumVektoru(int i)
{
if (i < dugumK)
return 0;
else if (i > dugumN)
return (dugumN - dugumK + 2);
return (i - dugumK + 1);
}
float basisFonksiyonu(int i, int k, float u)
{
int t;
float v;
if (k == 1)
{
v = 0.0f;
if ((dugumVektoru(i) <= u) && (u < dugumVektoru(i + 1)))
v = 1.0f;
}
else
{
v = 0.0f;
t = dugumVektoru(i + k - 1) - dugumVektoru(i);
if (t != 0)
v = (u - dugumVektoru(i)) *
basisFonksiyonu(i, k - 1, u) / t;
t = dugumVektoru(i + k) - dugumVektoru(i + 1);
if (t != 0)
v = v + (dugumVektoru(i + k) - u) *
basisFonksiyonu(i + 1, k - 1, u) / t;
}
return v;
}
Nokta3B BSpline(float u, int n, int k, Nokta3B kontrolNoktalari[])
{
int i;
float b;
Nokta3B p;
dugumK = k;
dugumN = n;
p.x = 0.0f;
p.y = 0.0f;
p.z = 0.0f;
for (i = 0; i <= n; i++)
{
b = basisFonksiyonu(i, k, u);
int derece;
for (derece = 0; derece < 360; derece++)
{
/* (x, y) koordinatlarını kullan. */
double xYeni = x * cosDelta - y * sinDelta;
y = x * sinDelta + y * cosDelta;
x = xYeni;
}
/* Bezier Egrileri (Horner kuraliyla) */
double t;
for (t = 0.0; t <= 1.0; t += 0.01)
{
double x = (0.023193 * t - 0.316086) * t * t + 1.0;
double y = ((-0.055993 * t - 0.032527) * t + 0.795627) * t;
Bu forumda yeni konular açamazsınız Bu forumdaki mesajlara cevap veremezsiniz Bu forumdaki mesajlarınızı değiştiremezsiniz Bu forumdaki mesajlarınızı silemezsiniz Bu forumdaki anketlerde oy kullanamazsınız