📄 sphereview.cpp
字号:
l.z=lightpoint.z-zp[i].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[0].c.R=float(ForeColor.R+I);if(face[0].c.R<0)face[0].c.R=0;else if(face[0].c.R>255)face[0].c.R=255;
face[0].c.G=float(ForeColor.G+I);if(face[0].c.G<0)face[0].c.G=0;else if(face[0].c.G>255)face[0].c.G=255;
face[0].c.B=float(ForeColor.B+I);if(face[0].c.B<0)face[0].c.B=0;else if(face[0].c.B>255)face[0].c.B=255;
//------------------------------------------------------------------
n=zp[i].pn[j+1];
v.x=viewpoint.x-zp[i].pxy[j+1].x;
v.y=viewpoint.y-zp[i].pxy[j+1].y;
v.z=viewpoint.z-zp[i].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i].pxy[j+1].x;
l.y=lightpoint.y-zp[i].pxy[j+1].y;
l.z=lightpoint.z-zp[i].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[3].c.R=float(ForeColor.R+I);if(face[3].c.R<0)face[3].c.R=0;else if(face[3].c.R>255)face[3].c.R=255;
face[3].c.G=float(ForeColor.G+I);if(face[3].c.G<0)face[3].c.G=0;else if(face[3].c.G>255)face[3].c.G=255;
face[3].c.B=float(ForeColor.B+I);if(face[3].c.B<0)face[3].c.B=0;else if(face[3].c.B>255)face[3].c.B=255;
}//else
n=zp[i-1].pn[j];
v.x=viewpoint.x-zp[i-1].pxy[j].x;
v.y=viewpoint.y-zp[i-1].pxy[j].y;
v.z=viewpoint.z-zp[i-1].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i-1].pxy[j].x;
l.y=lightpoint.y-zp[i-1].pxy[j].y;
l.z=lightpoint.z-zp[i-1].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[1].c.R=float(ForeColor.R+I);if(face[1].c.R<0)face[1].c.R=0;else if(face[1].c.R>255)face[1].c.R=255;
face[1].c.G=float(ForeColor.G+I);if(face[1].c.G<0)face[1].c.G=0;else if(face[1].c.G>255)face[1].c.G=255;
face[1].c.B=float(ForeColor.B+I);if(face[1].c.B<0)face[1].c.B=0;else if(face[1].c.B>255)face[1].c.B=255;
n=zp[i-1].pn[j+1];
v.x=viewpoint.x-zp[i-1].pxy[j+1].x;
v.y=viewpoint.y-zp[i-1].pxy[j+1].y;
v.z=viewpoint.z-zp[i-1].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i-1].pxy[j+1].x;
l.y=lightpoint.y-zp[i-1].pxy[j+1].y;
l.z=lightpoint.z-zp[i-1].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[2].c.R=float(ForeColor.R+I);if(face[2].c.R<0)face[2].c.R=0;else if(face[2].c.R>255)face[2].c.R=255;
face[2].c.G=float(ForeColor.G+I);if(face[2].c.G<0)face[2].c.G=0;else if(face[2].c.G>255)face[2].c.G=255;
face[2].c.B=float(ForeColor.B+I);if(face[2].c.B<0)face[2].c.B=0;else if(face[2].c.B>255)face[2].c.B=255;
}//if(m_bFanshe)
return true;}//if(k<=0)
else return false;
}//seeable()
/////////////////////////////////////////
bool _seeable(int i,int j,Fpoint face[]){
dcpt3 a,b,c,n;
if(i==dengfen/4)
{a.x=0; a.y=0; a.z=-R;}//if
else
{ a.x=zp[i].pxy[j].x; a.y=zp[i].pxy[j].y; a.z=-zp[i].z;}
b.x=zp[i-1].pxy[j].x; b.y=zp[i-1].pxy[j].y; b.z=-zp[i-1].z;
c.x=zp[i-1].pxy[j+1].x; c.y=zp[i-1].pxy[j+1].y; c.z=-zp[i-1].z;
n.x=-((b.y-a.y)*(c.z-b.z)-(b.z-a.z)*(c.y-b.y));
n.y=-((b.z-a.z)*(c.x-b.x)-(b.x-a.x)*(c.z-b.z));
n.z=-((b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x));
double k=n.x*(vw->x)+n.y*(vw->y)+n.z*(vw->z);
if(k<=0) {
if(m_bJingmian){
danweihua(n);
dcpt3 av;
av.x=viewpoint.x-a.x; av.y=viewpoint.y-a.y; av.z=viewpoint.z-a.z;
danweihua(av);
if(kd<0||kd>1) return false;
double I=-kd*Il*(n.x*av.x+n.y*av.y+n.z*av.z);
face[0].c.R=float(ForeColor.R+I);
if(face[0].c.R<0)face[0].c.R=0;
else if(face[0].c.R>255)face[0].c.R=255;
face[0].c.G=float(ForeColor.G+I);
if(face[0].c.G<0)face[0].c.G=0;
else if(face[0].c.G>255)face[0].c.G=255;
face[0].c.B=float(ForeColor.B+I);
if(face[0].c.B<0)face[0].c.B=0;
else if(face[0].c.B>255)face[0].c.B=255;
face[1].c.R=face[0].c.R; face[1].c.G=face[0].c.G; face[1].c.B=face[0].c.B;
face[2].c.R=face[0].c.R; face[2].c.G=face[0].c.G; face[2].c.B=face[0].c.B;
face[3].c.R=face[0].c.R; face[3].c.G=face[0].c.G; face[3].c.B=face[0].c.B;
}//if(m_bJingmian)
if(m_bFanshe){
dcpt3 v;
dcpt3 l,H;
double NH;
double I;
if(i==dengfen/4){
n.x=0; n.y=0; n.z=-1;
v.x=viewpoint.x; v.y=viewpoint.y; v.z=viewpoint.z+R;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x;
l.y=lightpoint.y;
l.z=lightpoint.z+R;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[0].c.R=float(ForeColor.R+I);if(face[0].c.R<0)face[0].c.R=0;else if(face[0].c.R>255)face[0].c.R=255;
face[0].c.G=float(ForeColor.G+I);if(face[0].c.G<0)face[0].c.G=0;else if(face[0].c.G>255)face[0].c.G=255;
face[0].c.B=float(ForeColor.B+I);if(face[0].c.B<0)face[0].c.B=0;else if(face[0].c.B>255)face[0].c.B=255;
face[3].c.R=face[0].c.R; face[3].c.G=face[0].c.G; face[3].c.B=face[0].c.B;
}//if(i==dengfen/4)
else{
n=zp[i].pn[j]; n.z=-n.z;
v.x=viewpoint.x-zp[i].pxy[j].x;
v.y=viewpoint.y-zp[i].pxy[j].y;
v.z=viewpoint.z+zp[i].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i].pxy[j].x;
l.y=lightpoint.y-zp[i].pxy[j].y;
l.z=lightpoint.z+zp[i].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[0].c.R=float(ForeColor.R+I);if(face[0].c.R<0)face[0].c.R=0;else if(face[0].c.R>255)face[0].c.R=255;
face[0].c.G=float(ForeColor.G+I);if(face[0].c.G<0)face[0].c.G=0;else if(face[0].c.G>255)face[0].c.G=255;
face[0].c.B=float(ForeColor.B+I);if(face[0].c.B<0)face[0].c.B=0;else if(face[0].c.B>255)face[0].c.B=255;
n=zp[i].pn[j+1];
n.z=-n.z;
v.x=viewpoint.x-zp[i].pxy[j+1].x;
v.y=viewpoint.y-zp[i].pxy[j+1].y;
v.z=viewpoint.z+zp[i].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i].pxy[j+1].x;
l.y=lightpoint.y-zp[i].pxy[j+1].y;
l.z=lightpoint.z+zp[i].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[3].c.R=float(ForeColor.R+I);if(face[3].c.R<0)face[3].c.R=0;else if(face[3].c.R>255)face[3].c.R=255;
face[3].c.G=float(ForeColor.G+I);if(face[3].c.G<0)face[3].c.G=0;else if(face[3].c.G>255)face[3].c.G=255;
face[3].c.B=float(ForeColor.B+I);if(face[3].c.B<0)face[3].c.B=0;else if(face[3].c.B>255)face[3].c.B=255;
}//else
n=zp[i-1].pn[j];
n.z=-n.z;
v.x=viewpoint.x-zp[i-1].pxy[j].x;
v.y=viewpoint.y-zp[i-1].pxy[j].y;
v.z=viewpoint.z+zp[i-1].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i-1].pxy[j].x;
l.y=lightpoint.y-zp[i-1].pxy[j].y;
l.z=lightpoint.z+zp[i-1].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[1].c.R=float(ForeColor.R+I);if(face[1].c.R<0)face[1].c.R=0;else if(face[1].c.R>255)face[1].c.R=255;
face[1].c.G=float(ForeColor.G+I);if(face[1].c.G<0)face[1].c.G=0;else if(face[1].c.G>255)face[1].c.G=255;
face[1].c.B=float(ForeColor.B+I);if(face[1].c.B<0)face[1].c.B=0;else if(face[1].c.B>255)face[1].c.B=255;
n=zp[i-1].pn[j+1];
n.z=-n.z;
v.x=viewpoint.x-zp[i-1].pxy[j+1].x;
v.y=viewpoint.y-zp[i-1].pxy[j+1].y;
v.z=viewpoint.z+zp[i-1].z;
danweihua(v);
I=-kd*Il*(n.x*v.x+n.y*v.y+n.z*v.z);
if(m_bGuangzhao){
l.x=lightpoint.x-zp[i-1].pxy[j+1].x;
l.y=lightpoint.y-zp[i-1].pxy[j+1].y;
l.z=lightpoint.z+zp[i-1].z;
danweihua(l);
H.x=l.x+v.x; H.y=l.y+v.y; H.z=l.z+v.z;
danweihua(H);
NH=H.x*n.x+H.y*n.y+H.z*n.z;
I+=ks*Il*pow(NH,ns);
}//if_m_bGuangzhao
face[2].c.R=float(ForeColor.R+I);if(face[2].c.R<0)face[2].c.R=0;else if(face[2].c.R>255)face[2].c.R=255;
face[2].c.G=float(ForeColor.G+I);if(face[2].c.G<0)face[2].c.G=0;else if(face[2].c.G>255)face[2].c.G=255;
face[2].c.B=float(ForeColor.B+I);if(face[2].c.B<0)face[2].c.B=0;else if(face[2].c.B>255)face[2].c.B=255;
}//if(m_bFanshe)
return true;}
else return false;
}//_seeable()
///////////////////////////////////////////////
bool CSphereView::sphereview(){
if(!zp){
jianmo();
setUVN(wordpoint,viewpoint);
}
if(!zp) return false;
int i,j,m=dengfen/4;
Fpoint miniface[4],_miniface[4];
for(i=1;i<m;i++){
for(j=0;j<dengfen;j++){
if(seeable(i,j)){
miniface[0]=w_v(i,j);
miniface[1]=w_v(i-1,j);
miniface[2]=w_v(i-1,j+1);
miniface[3]=w_v(i,j+1);
seeable(i,j,miniface);
if(m_bWangge){
lineany(miniface[0],miniface[1]);
lineany(miniface[1],miniface[2]);
lineany(miniface[2],miniface[3]);
lineany(miniface[3],miniface[0]);
}
else scanFill(4,miniface);
/**/ }//if1
if(_seeable(i,j)){
miniface[0]=_w_v(i,j);
miniface[1]=_w_v(i-1,j);
miniface[2]=_w_v(i-1,j+1);
miniface[3]=_w_v(i,j+1);
_seeable(i,j,miniface);
if(m_bWangge){
lineany(miniface[0],miniface[1]);
lineany(miniface[1],miniface[2]);
lineany(miniface[2],miniface[3]);
lineany(miniface[3],miniface[0]);
}
else scanFill(4,miniface);
/**/ }//if2
}//for(j)
}//for(i)
miniface[0].x=int(U.z*R+300);
miniface[0].y=int(V.z*R+200);
miniface[3].x=miniface[0].x;
miniface[3].y=miniface[0].y;
_miniface[0].x=int(-U.z*R+300);
_miniface[0].y=int(-V.z*R+200);
_miniface[3].x=_miniface[0].x;
_miniface[3].y=_miniface[0].y;
for(j=0;j<dengfen;j++){
if (seeable(m,j)){
miniface[1]=w_v(m-1,j);
miniface[2]=w_v(m-1,j+1);
seeable(m,j,miniface);
if(m_bWangge){
lineany(miniface[0],miniface[1]);
lineany(miniface[1],miniface[2]);
lineany(miniface[2],miniface[3]);
}
else scanFill(3,miniface);
}//if1
if (_seeable(m,j)){
_miniface[1]=_w_v(m-1,j);
_miniface[2]=_w_v(m-1,j+1);
_seeable(m,j,_miniface);
if(m_bWangge){
lineany(_miniface[0],_miniface[1]);
lineany(_miniface[1],_miniface[2]);
lineany(_miniface[2],_miniface[3]);
}
else scanFill(3,_miniface);
}//if2
}//for3
/* COLORREF color=m_ForeColor;
m_ForeColor=RGB(250,0,0);
// if(seeable(m,0))
lineany(300,200,int(U.z*R+300),int(V.z*R+200));
m_ForeColor=RGB(0,0,255);
// if(seeable(1,0))
lineany(300,200,int(U.x*R+300),int(V.x*R+200));
m_ForeColor=RGB(0,100,0);
// if(seeable(1,dengfen/4))
lineany(300,200,int(U.y*R+300),int(V.y*R+200));
m_ForeColor=color;/**/
return true;
}//sphereview()
//***********************fill*******************************************
//////////////////////////////
void insertEdge(Edge *list,Edge * edge) {
Edge *p,*q=list;
p=q->next;
while(p!=NULL){
if(edge->xIntersect<p->xIntersect)p=NULL;
else{q=p; p=p->next; }//else
}//while
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -