Р
Q
1.2.5. Варнок Алгоритми (1969).
Варнок алгоритми тасвир текислигини 4 қисмга бўлишга асосланган ва ҳар кисми учун алгоритми осон ечилади.
Экран 4 та қисмга бўлинади. Агар қисм энг яқин ёқ проекцияси билан тўлиқ ёпилса ёки бирорта ҳам ёқнинг проекцияси билан ёпилмаса унда масала ёпилади, яъни тўлиқ бўялади ёки четлаштирилади. Агар иккала шарт ҳам бажарилмаса у ҳолда қисм яъни 4 қисмга бўлинади ва шартлар текширилади. Ушбу жараён қисмнинг ўлчови бир пикселдан кичик бўлгунга қадар бажарилади.
Лаборатория ишини бажариш учун намуна
Лаборатория ишининг бажарилишининг мисол тариқасида полигонал сетка кўринишида берилган гексаэдрнинг (кубнинг) кўринмас ёқларини олиб ташлашни қараб ўтамиз. Гексаэдрнинг полигонал сетка кўринишида берилиши ва алмаштиришлар, тасвир текислигига проекциялашлар «Компьютер графикаси ва дизайн» (бўлим-1) лабораториялар учун методик қўлланмасида берилган.
Гексаэдрнинг кўринмас ёқларини олиб ташлаш учун назарий қисмда берилганидек векторининг йўналишининг мос проекциялаш векторини аниқлаш керак.
Параллел проекциялашни қараб ўтайлик аниқроғи Кавалье проекциясини. У ҳолда берилган вектор қуйидаги кўринишда берилади:
Z(l·cos(θ), l·sin(θ),-1), где l =0,5; θ =45⁰
Гексаэдрнинг ҳар бир ёқларига туширилган ташқи нормал ва поекциялаш йўналиши орасидаги бурчак текширилади. Бу учун аввало ҳар бир ёқларига туширилган ташқи нормални топиш керак. Ташқи нормаллар қуйидагича топилади: хохлаган ёқларидан учтадан гексаэдрнинг учлари танланади (кетма-кет келган учтасини олиш ҳам мумкин), булардан мос равишда ёқларнинг ташқи нормали аниқланади.
Масалан, гексаэдрнинг А(x1,y1,z1), B(x2,y2,z2), C(x3,y3,z3), ва х нуқталари билан аниқланадиган ёқ учун нормал N(n,I,m):
n=(y3-y1) (z2-z1)-(z3-z1) (y2-y1);
l=-((x3-x1) (z2-z1)- (x2-x1) (z3-z1));
m=(x3-x1) (y2-y1)- (x2-x1) (y3-y1);
Бу ерда кўринмас ёқларни олиб ташлаш учун (Z,N)≤0 шарти текширилади. Бу амал ҳар бир ёқ учун алмаштиришлар бажарилгандан кейин текширилиб туради. Бизнинг мисолимизда гексаэдрнинг абцисса ўқи атрофида айланиши қаралган.
С++ тилида дастури:
#include
#include
#include
#include
#include
typedef float vek3[4];
typedef float vek8[9];
typedef float mat38[9][4];
typedef float mat28[9][3];
typedef int mat28i[9][3];
double alpha = 3.1415/4;
double l_kabine = 1/2.;
double d = 100;
vek3 z1;
mat38 kk3;
mat38 kk4;
mat28 kk2;
mat28i kk2i;
int ii,ff;
float ffi;
void initkub3( mat38 &k)
{
k[1][1]=0; k[1][2]=0; k[1][3]=0;
k[2][1]=d; k[2][2]=0; k[2][3]=0;
k[3][1]=0; k[3][2]=d; k[3][3]=0;
k[4][1]=0; k[4][2]=0; k[4][3]=d;
k[5][1]=d; k[5][2]=d; k[5][3]=0;
k[6][1]=0; k[6][2]=d; k[6][3]=d;
k[7][1]=d; k[7][2]=0; k[7][3]=d;
k[8][1]=d; k[8][2]=d; k[8][3]=d;
}
void kabine(mat38 m3, mat28 &m2)
{
int i;
for ( i=1; i<=8; i++)
{
m2[i][1] = m3[i][1] + l_kabine * sin(alpha) * m3[i][3];
m2[i][2] = m3[i][2] + l_kabine * cos(alpha) * m3[i][3];
}
}
void realtoint(mat28 m2, mat28i &m2i)
{
int i,j;
for(j=1; j<=8;j++)
for(i=1; i<=2;i++)
m2i[j][i]=int(m2[j][i]);
}
void lineside(vek3 z,mat38 k3,mat28i k2i,int n1,int n2,int n3,int n4)
{
if (((((k3[n3][2]-k3[n1][2])*(k3[n2][3]-k3[n1][3]))-
((k3[n3][3]-k3[n1][3])*(k3[n2][2]-k3[n1][2])))*z[1]-
(((k3[n3][1]-k3[n1][1])*(k3[n2][3]-k3[n1][3]))-
((k3[n2][1]-k3[n1][1])*(k3[n3][3]-k3[n1][3])))*z[2]+
(((k3[n3][1]-k3[n1][1])*(k3[n2][2]-k3[n1][2]))-
((k3[n2][1]-k3[n1][1])*(k3[n3][2]-k3[n1][2])))*z[3])<0 )
{
setcolor(15);
line(k2i[n1][1],k2i[n1][2],k2i[n2][1],k2i[n2][2]);
line(k2i[n2][1],k2i[n2][2],k2i[n3][1],k2i[n3][2]);
line(k2i[n3][1],k2i[n3][2],k2i[n4][1],k2i[n4][2]);
line(k2i[n4][1],k2i[n4][2],k2i[n1][1],k2i[n1][2]);
}
}
int main()
{ float ffi;
int gd=0,gm;
initgraph(&gd,&gm,"c:\\borlandc\\bgi");
z1[1]=l_kabine*sin(alpha);
z1[2]=l_kabine*cos(alpha);
z1[3]=-1;
initkub3(kk3);
for(ff=0;ff<=360;ff++)
{
for(ii=1;ii<=8;ii++)
{cleardevice();
ffi=ff*3.14/180.;
kk4[ii][1]=kk3[ii][1]+200;
kk4[ii][2]=cos(ffi)*kk3[ii][2]-sin(ffi)*kk3[ii][3]+200;
kk4[ii][3]=sin(ffi)*kk3[ii][2]+cos(ffi)*kk3[ii][3]+200;
kabine(kk4,kk2);
realtoint(kk2,kk2i);
lineside(z1,kk4,kk2i,1,2,5,3);
lineside(z1,kk4,kk2i,1,3,6,4);
lineside(z1,kk4,kk2i,1,4,7,2);
lineside(z1,kk4,kk2i,7,8,5,2);
lineside(z1,kk4,kk2i,5,8,6,3);
lineside(z1,kk4,kk2i,6,8,7,4);
delay(10);
}} getch();
return 0;
}
0>
Do'stlaringiz bilan baham: |