⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sphereview.cpp

📁 此源代码是介绍中点位移算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						 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 + -