网站大量收购独家精品文档,联系QQ:2885784924

可见面消隐考代码.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
可见面消隐考代码

double O1,O2,O3;//视点球坐标分量 double Nx,Ny,Nz;//法向量分量 double Sx,Sy,Sz;//视向量分量 NormalVector(int p1, int p2, int p3)//表面法矢量 { double Fx,Fy,Fz,Hx,Hy,Hz; //求第一条边的分量 Fx=P[p2][1]-P[p1][1];Fy=P[p2][2]-P[p1][2];Fz=P[p2][3]-P[p1][3]; //求第二条边的分量 Hx=P[p3][1]-P[p1][1];Hy=P[p3][2]-P[p1][2];Hz=P[p3][3]-P[p1][3]; //法矢量为第一和第二个矢量的叉积 Nx=Fy*Hz-Fz*Hy;Ny=Fz*Hx-Fx*Hz;Nz=Fx*Hy-Fy*Hx; } VisualVector(int pt)//视矢量 { O1=R*k[5];O2=R*k[6];O3=R*k[4];//观察坐标系的视点球坐标 Sx=O1-P[pt][1];Sy=O2-P[pt][2];Sz=O3-P[pt][3];//视矢量 } Product(double v1, double v2, double v3, double n1, double n2, double n3)//矢量的数量积 { double NProduct; NProduct=v1*n1+v2*n2+v3*n3; return(NProduct); } DrawCube() { int P1,P2,P3;//面的顶点 for(int face=1;face=6;face++) { P1=F[face][1];//面的第一个顶点 P2=F[face][2];//面的第二个顶点 P3=F[face][3];//面的第三个顶点 if(flag==false) DrawLine(face);//画实线 else { VisualVector(P1);//求视矢量 NormalVector(P1,P2,P3);//求法矢量 if(Product(Sx,Sy,Sz,Nx,Ny,Nz)=0)//判断数量积正负 DrawLine(face);//数量积大于零,表面可见,实线画出 } } } OnDrawCubeXy() //消隐的条件下 { AfxGetMainWnd()-SetWindowText(案例:立方体动态隐线(消隐后)); flag=true; GetMaxX();GetMaxY(); InitParameter(); ReadPoint(); ReadFace(); RedrawWindow(); } 补充: #define ROUND(a) int(a+0.5)//四舍五入 #define PI 3.1415926//PI的宏定义 #include math.h//数学头文件 double R,Theta,Phi;//视点在用户坐标系的球坐标 double k[9];//运算常量 //在视图类的构造函数中初始化变量 R=800.0;Theta=-20;Phi=40; flag=false; InitParameter()//透视投影参数初始化 { k[1]=sin(PI*Theta/180); k[2]=sin(PI*Phi/180); k[3]=cos(PI*Theta/180); k[4]=cos(PI*Phi/180); k[5]=k[3]*k[2]; k[6]=k[1]*k[2]; k[7]=k[3]*k[4]; k[8]=k[1]*k[4]; } Project(double x, double y, double z,double D)// CPoint类型 { CPoint mypt; double x0,y0,z0;//观察坐标系三维坐标 x0=k[1]*x-k[3]*y; y0=-k[7]*x-k[8]*y+k[2]*z; z0=-k[5]*x-k[6]*y-k[4]*z+R; mypt.x=D*x0/z0;mypt.y=D*y0/z0;//屏幕坐标系二维坐标//视距D=1000; return mypt; } OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) ////键盘控制函数 { switch(nChar) { case VK_UP:Phi=Phi-10;break;//小键盘上向上方向键 case VK_DOWN:Phi=Phi+10;bre

文档评论(0)

ybcm963 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档