- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- 卫生检验专.doc
- 压力及差压送器的量程选择.doc
- 即时通讯开平台—ANYCHAT.doc
- 压力开关基知识-博益气动.doc
- 压力等级单换算.doc
- 压力容器制工艺规程.doc
- 历年国考行数学运算题汇总.doc
- 压力管道的力计算和直径的确定.doc
- 压力表内校程1.doc
- 压控振荡器理和应用说明.doc
- 文化创意产业众创空间建设与产业升级关系研究报告.docx
- 中国2025年国际教育项目投资机会与竞争格局分析报告.docx
- 教育新形态:2025年K2教育人工智能个性化学习系统应用效果评估.docx
- 高校创新创业教育课程体系改革下的实践教学新模式研究报告.docx
- 2025年虚拟现实交互技术在虚拟现实互动餐厅中的应用与发展报告.docx
- 2025年咖啡连锁品牌扩张战略:精准市场布局案例分析报告.docx
- 休闲农业与乡村旅游乡村旅游产业乡村旅游产品创新与市场拓展报告.docx
- 学前教育机构师资队伍教师教学评价与反馈体系构建与完善效果评估报告.docx
- 制造业供应链数字化协同管理对产业链生态的影响报告.docx
- 金融科技企业估值方法在风险投资中的应用研究报告.docx
文档评论(0)