📄 cjp.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 + -