2.18- rasm. YIQ rang modеli
HSV rang modеli
Yuqorida kеltirilgan RGB,CMY(K) va YIQ rang modеllari qurilmalar uchun mo‘ljallangan va odam tomonidan rang bеrish uchun noqulay.
HSV (Hue-ton, saturation-to‘yinganlik, value-yorug‘lik qiymati) rang modеli foydalanuvchiga mo‘ljallangan bo‘lib rangni ton, to‘yinganlik, yorug‘lik qiymati kabi tushunchalar orqali bеrish imkonini bеradi.
HSV modеlida silindrik koordinatalar sistеmasi ishlatiladi, barcha ifodalanuvchi ranglar esa olti qirrali konusni tashkil qiladi (2.31-rasm).
Konusning asosi yorug‘ ranglarga mos kеladi (V=1). OV o‘qi kulranglarga mos kеladi (S=0), bu holda yani S=0 bo‘lganda H ning qiymati aniqlanmagan bo‘ladi (HUE_UNDEFGIUNED).
Ton N burchak gradusi bilan o‘lchanadi, 00 ga qizil rang mos kеladi, 1200 ga esa yashil rang va x.k.
HSV rang modеlini ifodalovchi asosiy qiymatlar mos ravishda quyidagicha o‘zgaradi:
oq ranga S=0, V=1 mos kеladi, qora ranga esa V=0.
HLS rang modеli
HLS (Hue–ton, Lightness-yorug‘lik, Saturation-to‘yinganlik) HSV modеlining modifikatsiyasi bo‘lib, u orqali ifodalanuvchi ranglar ikkita olti qirrali va asoslari birlashtirilgan konusni tashkil qiladi (2.19-rasm).
2.19- rasm. HLS rang modеli
Misol.
Misol tariqasida poligonal sеtka ko‘rinishida bеrilgan gеksaedrni (kubni) Guro usuli yordamida bo‘yashni qaraymiz. Yuqorida aytib o‘tilganidеk, dastlab ko‘rinmas qirralar va yoqlari olib tashlanadi, proеksiyalash to‘g‘ri tanlanadi va kеyin bo‘yash ishlari amalga oshiriladi.
DevC++ tilidagi dasturi:
#include
#include
#include
using namespace std;
typedef struct {double x,y,z;} point;
typedef struct {double x,y,z;} vec;
typedef struct {long x,y,z;} pointtyp;
typedef point plane[6];
typedef vec vect[5];
typedef plane cube_coor[6];
typedef vect normali[6];
cube_coor cube={{{-100,-100,100},
{100,-100,100},
{100, 100,100},
{-100,100,100},
{ 0, 0,100}},
{{-100,-100,-100},
{100,-100,-100},
{100,-100,100},
{-100,-100,100},
{0,-100,0}},
{{-100,100,100},
{100,100,100},
{100,100,-100},
{-100,100,-100},
{0,100,0}},
{{-100,-100,-100},
{-100,-100,100},
{-100,100,100},
{-100,100,-100},
{-100,0,0}},
{{100,-100,100},
{100,-100,-100},
{100,100,-100},
{100,100,100},
{100,0,0}},
{{-100,100,-100},
{100,100,-100},
{100,-100,-100},
{-100,-100,-100},
{0,0,-100}}};
double pcos,psin;
char c;
normali nor;
int vhod;
void initialize()
{
initwindow(1000,700,"2-3");
}
void init()
{
double a=3.14/4;
pcos=cos(a*3.14/180);
psin=sin(a*3.14/180);
}
void povorotx()
{
int i,j,k;
double y1,z1;
for (i=1;i<=6;i++)
{
for (j=1;j<=5;j++)
{
y1=pcos*cube[i][j].y-psin*cube[i][j].z;
z1=pcos*cube[i][j].y+pcos*cube[i][j].z;
cube[i][j].y=y1;
cube[i][j].z=z1;
}
for (k=1;k<=4;k++)
{
y1=pcos*nor[i][k].y-psin*nor[i][k].z;
z1=pcos*nor[i][k].y+pcos*nor[i][k].z;
nor[i][j].y=y1;
nor[i][j].z=z1;
}
}
}
void povorotz()
{
int i,j,k;
double y1,x1;
for (i=1;i<=6;i++)
{
for (j=1;j<=5;j++)
{
y1=pcos*cube[i][j].y-psin*cube[i][j].x;
x1=pcos*cube[i][j].y+pcos*cube[i][j].x;
cube[i][j].y=y1;
cube[i][j].x=x1;
}
for (k=1;k<=4;k++)
{
y1=pcos*nor[i][k].y-psin*nor[i][k].x;
x1=pcos*nor[i][k].y+pcos*nor[i][k].x;
nor[i][j].y=y1;
nor[i][j].x=x1;
}
}
}
double dlina(vec a)
{
return sqrt((a.x*a.x)+(a.y*a.y)+(a.z+a.z));
}
double dlinna(pointtyp a)
{
return sqrt((a.x*a.x)+(a.y*a.y));
}
double cosinus(vec a,vec b)
{
return fabs((a.x*b.x+a.y*b.y+a.z*b.z)/(dlina(a)*dlina(b)));
}
void vector(point a,point b,vec &c)
{
c.x=b.x-a.x;
c.y=b.y-a.y;
c.z=b.z-a.z;
}
void multivector(vec a,vec b,vec &c)
{
c.x=a.y*b.z-a.z*b.y;
c.y=a.z*b.x-a.x*b.z;
c.z=a.x*b.y-a.y*b.x;
}
void normal(point a,point b,point c, point d, vec &e)
{
vec e1,e2,e3,b1,c1,d1;
vector(a,b,b1);
vector(a,c,c1);
vector(a,d,d1);
multivector(b1,c1,e1);
multivector(c1,d1,e2);
multivector(d1,b1,e3);
e.x=e1.x+e2.x+e3.x;
e.y=e1.y+e2.y+e3.y;
e.z=e1.z+e2.z+e3.z;
}
void guro(plane m,vect n)
{
point s={-100,-100,300};
int ia=24,id=62;
int i1,i2,q,qi,qw,wq,iw,x1,y1,x2,y2,maxx,maxy,minx,miny,a,b,j;
pointtyp ver[6];
vec p;
float inten[5];
float iu,iv,t,u,v;
int vershina,vershinaa,vershinab,vershinac,vershinad;
pointtyp a1,b1,c1,d1;
vec vek1,vek2;
for (j=1;j<6;j++)
{
ver[j].x=int(m[j].x);
ver[j].y=int(m[j].y);
}
maxx=ver[1].x;
maxy=ver[1].y;
minx=ver[1].x;
miny=ver[1].y;
vershina=1;
for (j=1;j<5;j++)
{
if (ver[j].x>maxx) maxx=ver[j].x;
if (ver[j].y>maxy) maxy=ver[j].y;
if (ver[j].yif (ver[j].y{
miny=ver[j].y;
vershina=j;
}
}
vershinaa=vershina;
a1.x=ver[vershinaa].x;
a1.y=ver[vershinaa].y;
vershinac=vershina;
c1.x=ver[vershinac].x;
c1.y=ver[vershinac].y;
vershinad=vershina;
b1.x=ver[vershinab].x;
b1.y=ver[vershinab].y;
if (vershinad==5) vershinad=1;
d1.x=ver[vershinad].x;
d1.y=ver[vershinad].y;
for (j=1;j<5;j++)
{
vector(s,m[j],p);
inten[j]=(ia+id*cosinus(p,n[j])*(500-dlina(p))/350);
}
if (ver[vershinaa].y==ver[vershinad].y || ver[vershinaa].y==ver[vershina].y)
{
b=miny-1;
q=0;
x1=x2=y1=y2=0;
do
{
if(b1.y==b)
{
vershinaa--;
if (vershinaa==0) vershinaa=4;
a1.x=ver[vershinaa].x;
a1.y=ver[vershinaa].y;
vershinab--;
if (vershinab==0) vershinab=4;
b1.x=ver[vershinab].x;
b1.y=ver[vershinab].y;
}
if(d1.y==b)
{
vershinac++;
if (vershinac==5) vershinaa=1;
c1.x=ver[vershinac].x;
c1.y=ver[vershinac].y;
vershinad++;
if (vershinad==5) vershinab=1;
d1.x=ver[vershinad].x;
d1.y=ver[vershinad].y;
}
b++;
a=minx;
wq=0;
do
{
if (getpixel(a,b)==15)
{
x1=a;y1=b;wq=1;
}
a++;
} while (aa=maxx;
wq=0;
do
{
if (getpixel(a,b)==15)
{
x2=a;y2=b;wq=1;
}
a++;
} while (avek1.x=x2-d1.x; vek1.y=yA1.y;
vek2.x=b1.x-a1.x;vek2.y=b1.y-a1.y;
if (dlina(vek2)==0) u=1; else u=dlina(vek1)/dlina(vek2);
vek1.x=x2-d1.x; vek1.y=y2-d1.y;
vek2.x=c1.x-d1.x;vek2.y=c1.y-d1.y;
if (dlina(vek2)==0) v=1; else v=dlina(vek1)/dlina(vek2);
iu=(1-u)*inten[vershinaa]+u*inten[vershinab];
iv=(1-v)*inten[vershinad]+v*inten[vershinac];
qi=x1;
while (qi<=x2)
{
if (x1==x2) t=1; else t=(qi-x1)/(x2-x1);
iw=int((1-t)*iu+t*iv);
putpixel(qi,b,iw);
qi++;
}
} while (b!=maxy);
for(i1=minx;i1if(getpixel(i1,maxy)==15)
putpixel(i1,maxy,int(inten[vershinad]));
}
}
void poisk_normaley()
{
normal(cube[1][1],cube[1][2],cube[1][4],cube[6][4],nor[1][1]);
normal(cube[1][2],cube[1][3],cube[1][1],cube[6][3],nor[1][2]);
normal(cube[1][3],cube[1][4],cube[1][2],cube[6][2],nor[1][3]);
normal(cube[1][4],cube[1][1],cube[1][3],cube[6][1],nor[1][4]);
normal(cube[2][1],cube[2][2],cube[2][4],cube[3][4],nor[2][1]);
normal(cube[2][2],cube[2][3],cube[2][1],cube[3][3],nor[2][2]);
normal(cube[2][3],cube[2][4],cube[2][2],cube[3][2],nor[2][3]);
normal(cube[2][4],cube[2][1],cube[2][3],cube[3][1],nor[2][4]);
normal(cube[3][1],cube[3][2],cube[3][4],cube[2][4],nor[3][1]);
normal(cube[3][2],cube[3][3],cube[3][1],cube[2][3],nor[3][2]);
normal(cube[3][3],cube[3][4],cube[3][2],cube[2][2],nor[3][3]);
normal(cube[3][4],cube[3][1],cube[3][3],cube[2][1],nor[3][4]);
normal(cube[3][1],cube[3][2],cube[3][4],cube[2][4],nor[4][1]);
normal(cube[3][2],cube[3][3],cube[3][1],cube[2][3],nor[4][2]);
normal(cube[3][3],cube[3][4],cube[3][2],cube[2][2],nor[4][3]);
normal(cube[3][4],cube[3][1],cube[3][3],cube[2][1],nor[4][4]);
normal(cube[4][1],cube[4][2],cube[4][4],cube[5][4],nor[4][1]);
normal(cube[4][2],cube[4][3],cube[4][1],cube[5][3],nor[4][2]);
normal(cube[4][3],cube[4][4],cube[4][2],cube[5][2],nor[4][3]);
normal(cube[4][4],cube[4][1],cube[4][3],cube[5][1],nor[4][4]);
normal(cube[5][1],cube[5][2],cube[5][4],cube[4][4],nor[5][1]);
normal(cube[5][2],cube[5][3],cube[5][1],cube[4][3],nor[5][2]);
normal(cube[5][3],cube[5][4],cube[5][2],cube[4][2],nor[5][3]);
normal(cube[5][4],cube[5][1],cube[5][3],cube[4][1],nor[5][4]);
normal(cube[6][1],cube[6][2],cube[6][4],cube[1][4],nor[6][1]);
normal(cube[6][2],cube[6][3],cube[6][1],cube[1][3],nor[6][2]);
normal(cube[6][3],cube[6][4],cube[6][2],cube[1][2],nor[6][3]);
normal(cube[6][4],cube[6][1],cube[6][3],cube[1][1],nor[6][4]);
}
void display()
{
int i,j;
pointtyp vertex[6];
setcolor(15);
for (i=1;i<=6;i++)
{
if (cube[i][5].z>0)
{
for (j=1;j<6;j++)
{
vertex[j].x=int(cube[i][j].x);
vertex[j].y=int(cube[i][j].y);
}
line (vertex[1].x,vertex[1].y,vertex[2].x,vertex[2].y);
line (vertex[2].x,vertex[2].y,vertex[3].x,vertex[3].y);
line (vertex[3].x,vertex[3].y,vertex[4].x,vertex[4].y);
line (vertex[4].x,vertex[4].y,vertex[1].x,vertex[1].y);
}
}
}
int main()
{
int j,swit;
initialize();
setgraphmode(1);
setcolor(1);
for (j=24;j<=86;j++)
setrgbpalette(j,j-23,j-23,j-23);
init();
povorotx();
povorotz();
poisk_normaley();
swit=1;
do
{
setactivepage(‘0’+(swit));
cleardevice();
setviewport(int(getmaxx()/2),int(getmaxy()/2),getmaxx(),getmaxy(),false);
display();
setvisualpage(‘0’+(swit));
swit!=swit;
} while(kbhit()==0);
return 0;
}
Do'stlaringiz bilan baham: |