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

📄 cjp.h

📁 计算机图形学课程设计源码 这是大二的时候学计算机图形学时做的课程设计
💻 H
字号:
#include "stdafx.h"
#include "math.h"
#include<iostream.h>
#include "graphicView.h"
#include "graphicDoc.h"
#include "graphic.h"

#if !defined(all_of_myfunction_in_cjp)
#define all_of_myfunction_in_cjp
#define PI 3.1415926

typedef struct dcpt3	{ double x,y,z; }	dcpt3;
		dcpt3 U={0.0,1.0,0.0};	//默认以yoz坐标面为观察面
		dcpt3 V={0.0,0.0,1.0};
		dcpt3 N={1.0,0.0,0.0};
		dcpt3 viewpoint={0.0,0.0,0.0};	//视点
		dcpt3 wordpoint={0.0,0.0,0.0};	//球心
		dcpt3 *vw;//向量从viewpoint指向wordpoint
typedef struct ZPoint	{ int z;double r; CPoint *pxy;coloor *rgb;}	ZP;
		ZP *zp;	

	double Rvw;
	int dengfen=12;
	int R=100;
	CString mtext;
	CPoint *ps,*pn,*qs,*qn;
	CPoint miniface[4],_miniface[4];
///////////////////////////////////////////////////////
//建立模型坐标
bool jianmo(){
	int i,j;
	const int m=dengfen/4;
	double th=2.00*PI/dengfen;
	zp=new ZP[m+1];
	if(!zp) {
		mtext="zp内存分配失败!";
		AfxMessageBox(mtext,MB_OK,0);
		return false;
	}//if false
	
	for(i=0;i<m;i++){
		zp[i].r=R*cos((double)i*th);
		zp[i].z=int(R*sin((double)i*th));
		zp[i].pxy=new CPoint[dengfen+1];
		zp[i].rgb=new coloor[dengfen+1];
		if(!(zp[i].pxy&&zp[i].rgb)) {
			AfxMessageBox("内存分配失败!",MB_OK,0);
			return false;
		}//if new fail
		for(j=0;j<dengfen;j++){
			zp[i].pxy[j].x=long(zp[i].r*cos(double(j*th)));
			zp[i].pxy[j].y=long(zp[i].r*sin(double(j*th)));
		}//for..
		zp[i].pxy[dengfen].x=zp[i].pxy[0].x;
		zp[i].pxy[dengfen].y=zp[i].pxy[0].y;
	}//for
	zp[m].z=150;
	zp[m].pxy=new CPoint;
	if(!zp[m].pxy) return false;
	zp[m].pxy->x=0; 
	zp[m].pxy->y=0;
	
	return true;
}//jianmo
/**/
//////////////////////////////////////////////////////
//设置观察坐标系
bool setUVN(dcpt3 wordpoint,dcpt3 viewpoint){
	if((wordpoint.x==viewpoint.x)&&(wordpoint.y==viewpoint.y)&&(wordpoint.z==viewpoint.z))
	{ 	AfxMessageBox("球心与视点重合!",MB_OK,0);return true;}
	vw=new dcpt3;
	if(!vw){AfxMessageBox("vw内存分配失败!",MB_OK,0);
		return false;}//if new vw fail
	double r;
	vw->x=viewpoint.x-wordpoint.x;
	vw->y=viewpoint.y-wordpoint.y;
	vw->z=viewpoint.z-wordpoint.z;
//	AfxMessageBox("现在运行setUVN ",MB_OK,0);
	Rvw=sqrt((vw->x*vw->x)+(vw->y*vw->y)+(vw->z*vw->z));
	N.x=-(vw->x)/Rvw;  N.y=-(vw->y)/Rvw;  N.z=-(vw->z)/Rvw;
	r=sqrt((vw->y*vw->y)+(vw->z*vw->z))/Rvw;
	U.x=0;  U.y=-N.z/r;  U.z=N.y/r;
	V.x=N.y*U.z-N.z*U.y;
	V.y=N.z*U.x-N.x*U.z;
	V.z=N.x*U.y-N.y*U.x;	
	return true;
}//setUVN()
//////////////////////////////////////////////////////
//从世界坐标系转变为视图坐标系

CPoint  w_v(int i,int j){
	CPoint pot;
	pot.x=int((U.x*zp[i].pxy[j].x)+(U.y*zp[i].pxy[j].y)+(U.z*zp[i].z)+300);
	pot.y=int((V.x*zp[i].pxy[j].x)+(V.y*zp[i].pxy[j].y)+(V.z*zp[i].z)+200);
	return pot;
}//w_v()
CPoint  _w_v(int i,int j){
	CPoint pot;
	pot.x=int((U.x*zp[i].pxy[j].x)+(U.y*zp[i].pxy[j].y)-(U.z*zp[i].z)+300);
	pot.y=int((V.x*zp[i].pxy[j].x)+(V.y*zp[i].pxy[j].y)-(V.z*zp[i].z)+200);
	return pot;
}//_w_v()
/**/

/**/
bool seeable(int i,int j){
	dcpt3 a,b,c;
	if(i==dengfen/4)
	{a.x=0.0; a.y=0.0;	a.z=double(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;
	double k=((b.y-a.y)*(c.z-b.z)-(b.z-a.z)*(c.y-b.y))*(vw->x)
			+((b.z-a.z)*(c.x-b.x)-(b.x-a.x)*(c.z-b.z))*(vw->y)
	 		+((b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x))*(vw->z);
	if(k>0) return false;
	else return true;
}//seeable()
bool _seeable(int i,int j){
	dcpt3 a,b,c;
	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;
	double k=((b.y-a.y)*(c.z-b.z)-(b.z-a.z)*(c.y-b.y))*(vw->x)
			+((b.z-a.z)*(c.x-b.x)-(b.x-a.x)*(c.z-b.z))*(vw->y)
	 		+((b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x))*(vw->z);
	if(k<=0) return false;
	else return true;
}//_seeable()

///////////////////////////////////////////////
bool CGraphicView::sphereview(){
	if(!zp)jianmo();
	setUVN(wordpoint,viewpoint);
	if(!zp)	return false;
	int i,j,m=dengfen/4;
	for(i=1;i<m;i++){
		for(j=0;j<dengfen;j++){
			if(m_bSphere||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);
				if(m_bSunlight){//	scanFill4(miniface);
				}
				else{
					lineany(miniface[0],miniface[1]);
					lineany(miniface[1],miniface[2]);
					if(m_bSeeable)
					{	
						lineany(miniface[2],miniface[3]);
						lineany(miniface[3],miniface[0]);
					}//if...
				}//else..
			}//if1
			if(m_bSphere||_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);
				if(m_bSunlight){//	scanFill4(miniface);
				}
				else{
					lineany(miniface[0],miniface[1]);
					lineany(miniface[1],miniface[2]);
					if(m_bSeeable)
					{	
						lineany(miniface[2],miniface[3]);
						lineany(miniface[3],miniface[0]);
					}//if..
				}//else2..
			}//if2
		}//for..
	}//for1

	miniface[0].x=int(U.z*R+300);
	miniface[0].y=int(V.z*R+200);
	miniface[3]=miniface[0];
	_miniface[0].x=int(-U.z*R+300);
	_miniface[0].y=int(-V.z*R+200);
	_miniface[3]=_miniface[0];
	for(j=0;j<dengfen;j++){
		if	(m_bSphere||seeable(m,j)){
			miniface[1]=w_v(m-1,j);
			miniface[2]=w_v(m-1,j+1);
			if(m_bSunlight){//	scanFill4(miniface);
				}//if...
			else{
					lineany(miniface[0],miniface[1]);
					lineany(miniface[1],miniface[2]);
					if(m_bSeeable){lineany(miniface[2],miniface[3]);}
			}//else..
		}//if1
		if	(m_bSphere||_seeable(m,j)){
				miniface[1]=_w_v(i-1,j);
				miniface[2]=_w_v(i-1,j+1);
			if(m_bSunlight){//	scanFill4(miniface);
				}//if...
			else{
					lineany(_miniface[0],miniface[1]);
					lineany(miniface[1],miniface[2]);
					if(m_bSeeable){lineany(miniface[2],_miniface[3]); }
			}//else..
		}//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()


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -