基于MFC的平行投影算法
基于MFCMFCMFC的平行投影算法实现
本文实现程序的IDEIDEIDE是VS2017VS\ 2017VS 2017。
一、新建项目
此处就不再赘述,没有有MFCMFCMFC基础可以先看第一个MFCMFCMFC的程序。
设置项目名为ParallelProjectionParallelProjectionParallelProjection。
二、类定义初始化
首先在在ParallelProjectionView.hParallelProjectionView.hParallelProjectionView.h文件最上方加#define N 12
。
然后在ViewViewView类中定义成员变量和函数成员。
public:void matx_N4(double a[][4], double b[4][4], double c[][4]);double lifang[N][4];double bianhuan1[4][4], bianhuan2[4][4], zhouce[4][4];double jieguo[N][4];void mydraw();
三、矩阵相乘函数实现
void CParallelProjectionView::matx_N4(double a[][4], double b[4][4], double c[][4])
{int i, j, m;for (m = 0; m < N; m++)for (i = 0; i < 4; i++)c[m][i] = 0;for (m = 0; m < N; m++)for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)c[m][i] += a[m][j] * b[j][i];for (i = 0; i < N; i++)for (j = 0; j < 4; j++)c[i][j] /= c[i][3];
}
四、绘制形体各条棱边函数实现
void CParallelProjectionView::mydraw()
{int tx[N][2];CDC *pDC = GetDC();for (int i = 0; i < N; i++) {tx[i][0] = jieguo[i][0] * 100 + 300;tx[i][1] = 200 - jieguo[i][1] * 100;}pDC->MoveTo(tx[0][0], tx[0][1]);pDC->LineTo(tx[1][0], tx[1][1]);pDC->MoveTo(tx[3][0], tx[3][1]);pDC->LineTo(tx[0][0], tx[0][1]);pDC->MoveTo(tx[1][0], tx[1][1]);pDC->LineTo(tx[2][0], tx[2][1]);pDC->MoveTo(tx[2][0], tx[2][1]);pDC->LineTo(tx[3][0], tx[3][1]);pDC->MoveTo(tx[8][0], tx[8][1]);pDC->LineTo(tx[9][0], tx[9][1]);pDC->LineTo(tx[10][0], tx[10][1]);pDC->LineTo(tx[11][0], tx[11][1]);pDC->LineTo(tx[8][0], tx[8][1]);pDC->MoveTo(tx[4][0], tx[4][1]);pDC->LineTo(tx[5][0], tx[5][1]);pDC->MoveTo(tx[4][0], tx[4][1]);pDC->LineTo(tx[7][0], tx[7][1]);pDC->MoveTo(tx[5][0], tx[5][1]);pDC->LineTo(tx[6][0], tx[6][1]);pDC->MoveTo(tx[6][0], tx[6][1]);pDC->LineTo(tx[7][0], tx[7][1]);pDC->MoveTo(tx[8][0], tx[8][1]);pDC->LineTo(tx[4][0], tx[4][1]);pDC->MoveTo(tx[9][0], tx[9][1]);pDC->LineTo(tx[5][0], tx[5][1]);pDC->MoveTo(tx[2][0], tx[2][1]);pDC->LineTo(tx[6][0], tx[6][1]);pDC->MoveTo(tx[3][0], tx[3][1]);pDC->LineTo(tx[7][0], tx[7][1]);pDC->MoveTo(tx[0][0], tx[0][1]);pDC->LineTo(tx[11][0], tx[11][1]);pDC->MoveTo(tx[1][0], tx[1][1]);pDC->LineTo(tx[10][0], tx[10][1]);}
五、图形元素初始化
在类向导中,选择消息,然后选择WM_CREATEWM\_CREATEWM_CREATE,添加处理程序。
int CParallelProjectionView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: 在此添加您专用的创建代码lifang[0][0] = 0, lifang[0][1] = 0.5, lifang[0][2] = 1, lifang[0][3] = 1;lifang[1][0] = 1, lifang[1][1] = 0.5, lifang[1][2] = 1, lifang[1][3] = 1;lifang[2][0] = 1, lifang[2][1] = 1, lifang[2][2] = 1, lifang[2][3] = 1;lifang[3][0] = 0, lifang[3][1] = 1, lifang[3][2] = 1, lifang[3][3] = 1;lifang[4][0] = 0, lifang[4][1] = 0, lifang[4][2] = 0, lifang[4][3] = 1;lifang[5][0] = 1, lifang[5][1] = 0, lifang[5][2] = 0, lifang[5][3] = 1;lifang[6][0] = 1, lifang[6][1] = 1, lifang[6][2] = 0, lifang[6][3] = 1;lifang[7][0] = 0, lifang[7][1] = 1, lifang[7][2] = 0, lifang[7][3] = 1;lifang[8][0] = 0, lifang[8][1] = 0, lifang[8][2] = 2, lifang[8][3] = 1;lifang[9][0] = 1, lifang[9][1] = 0, lifang[9][2] = 2, lifang[9][3] = 1;lifang[10][0] = 1, lifang[10][1] = 0.5, lifang[10][2] = 2, lifang[10][3] = 1;lifang[11][0] = 0, lifang[11][1] = 0.5, lifang[11][2] = 2, lifang[11][3] = 1;return 0;
}
六、清除窗口内容事件实现
设置清除屏幕的IDIDID为ID_CleanID\_CleanID_Clean,添加事件相应程序OnClean()OnClean()OnClean()。
void CParallelProjectionView::OnClean()
{// TODO: 在此添加命令处理程序代码RedrawWindow();
}
七、正投影事件实现
设置正投影的IDIDID为ID_ZhengtouyingID\_ZhengtouyingID_Zhengtouying,添加事件处理程序OnZhengtouying()OnZhengtouying()OnZhengtouying()。
void CParallelProjectionView::OnZhengtouying()
{// TODO: 在此添加命令处理程序代码bianhuan2[0][0] = 1, bianhuan2[0][1] = 0, bianhuan2[0][2] = 0, bianhuan2[0][3] = 0;bianhuan2[1][0] = 0, bianhuan2[1][1] = 1, bianhuan2[1][2] = 0, bianhuan2[1][3] = 0;bianhuan2[2][0] = 0, bianhuan2[2][1] = 0, bianhuan2[2][2] = 0, bianhuan2[2][3] = 0;bianhuan2[3][0] = 0, bianhuan2[3][1] = 0, bianhuan2[3][2] = 0, bianhuan2[3][3] = 1;matx_N4(lifang, bianhuan2, jieguo);bianhuan2[0][0] = 0, bianhuan2[0][1] = 0, bianhuan2[0][2] = 0, bianhuan2[0][3] = 0;bianhuan2[1][0] = 0, bianhuan2[1][1] = 1, bianhuan2[1][2] = 0, bianhuan2[1][3] = 0;bianhuan2[2][0] = 1, bianhuan2[2][1] = 0, bianhuan2[2][2] = 0, bianhuan2[2][3] = 0;bianhuan2[3][0] = 2, bianhuan2[3][1] = 0, bianhuan2[3][2] = 0, bianhuan2[3][3] = 1;matx_N4(lifang, bianhuan2, jieguo);mydraw();
}
八、正等测事件实现
设置正等测的IDIDID为ID_ZhengdengceID\_ZhengdengceID_Zhengdengce,添加事件处理程序OnZhengdengce()OnZhengdengce()OnZhengdengce()。
void CParallelProjectionView::OnZhengdengce()
{// TODO: 在此添加命令处理程序代码zhouce[0][0] = 0.7071, zhouce[0][1] = 0.4082, zhouce[0][2] = 0.0, zhouce[0][3] = 0.0;zhouce[1][0] = 0.0, zhouce[1][1] = 0.8166, zhouce[1][2] = 0.0, zhouce[1][3] = 0.0;zhouce[2][0] = 0.7071, zhouce[2][1] = -0.4082, zhouce[2][2] = 0.0, zhouce[2][3] = 0.0;zhouce[3][0] = 0.0, zhouce[3][1] = 0.0, zhouce[3][2] = 0.0, zhouce[3][3] = 1.0;matx_N4(lifang, zhouce, jieguo);mydraw();}
九、正二测事件实现
设置正等测的IDIDID为ID_ZhengerceID\_ZhengerceID_Zhengerce,添加事件处理程序OnZhengerce()OnZhengerce()OnZhengerce()。
void CParallelProjectionView::OnZhengerce()
{// TODO: 在此添加命令处理程序代码zhouce[0][0] = 0.9258, zhouce[0][1] = 0.1336, zhouce[0][2] = 0.0, zhouce[0][3] = 0.0;zhouce[1][0] = 0.0, zhouce[1][1] = 0.9534, zhouce[1][2] = 0.0, zhouce[1][3] = 0.0;zhouce[2][0] = 0.3780, zhouce[2][1] = -0.3273, zhouce[2][2] = 0.0, zhouce[2][3] = 0.0;zhouce[3][0] = 0.0, zhouce[3][1] = 0.0, zhouce[3][2] = 0.0, zhouce[3][3] = 1.0;matx_N4(lifang, zhouce, jieguo);mydraw();
}
十、实现效果
基于MFC的平行投影算法相关推荐
- 基于MFC的透视投影算法实现
基于MFCMFCMFC的透视投影算法实现 本文是在上一篇博客基于MFC的平行投影算法实现的基础上实现透视投影中的一点透视. 两种方法实现 一.添加事件处理程序实现 设置IDIDID为ID_Yidian ...
- 基于MFC SDI的图像处理程序(带效果图)
基于MFC SDI的图像处理程序(带效果图) 收藏 本程序主要实现了位图的打开保存,JPG格式作为BMP格式,以及24位BMP转化到8位.4位.1位(黑白图)及灰度图.还有一些简单的算法如反色,采用高 ...
- 基于MFC和OpenCV的图像处理小软件
1.软件界面: 本程序是基于MFC的单文档(SDI)程序,每次可以打开耽搁图片文件,可以保存,另存为图片文件.支持打开jpg,png,ico,bmp,jpeg等格式的图片.图片打开后的界面如下: 2. ...
- 基于MFC的肯德基快餐店的收银系统
基于MFC的肯德基点餐收银系统 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++/python/Java,结合设计模式(2种以上)至少实现 ...
- 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
基于C++的图像处理算法实现.INTEL CPU上SSE加速.ARM CPU上NEON加速 基于C++的图像处理算法在INTEL CPU上SSE加速实现 基于C++的图像处理算法在ARM CPU上NE ...
- 基于自然的灵感算法--元启发式
问题一:自然赋予的元启发式优化算法的分类 自然赋予的元启发式算法(模拟生物或者物理的现象去解决问题)有三大类也就是:基于进化,基于物理的,基于群体的 基于进化的主要是受达尔文的物种进化理论的启发,主要 ...
- 一文全面了解基于内容的推荐算法
作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) 这篇文章我们主要关注的是基于内容的推荐算法,它也是非常通用的一类推荐算法,在工业界有大量的应用案例. 本文 ...
- 基于网格的聚类算法STING
基于网格的聚类算法STING STING方法简介 ① 全称 : STING , Statistical Information Grid , 统计信息网格 , 是一种 多分辨率聚类技术 ; ② 划分方 ...
- Dubbo中基于权重的随机算法
转载自dubbo源码解析-LoadBalance dubbo的源码地址:https://github.com/alibaba/dubbo Dubbo中的RandomLoadBalance采用基于权重的 ...
最新文章
- breakdancer检测结构变异
- label实现不同大小不同颜色
- Fedora下如何删除以前的老内核
- golang中并发sync和channel
- 类的主动使用与被动使用等
- Java并发Semaphore信号量的学习
- C语言中的常用文件操作
- How to write a custom control with NSControl ...
- 冒泡、鸡尾酒、选择、插入、归并、快速排序的C++程序
- 设计一个移动应用的本地缓存机制(转)
- [Tarjan四连]Tarjan缩点
- WEB开发常用软件集合
- cruisecontrol 持续化集成(运行bat脚本)
- VSCode,webstorm绿色护眼背景设置
- 预告 | 互联网人吐槽大会系列漫画 要来啦~
- DEV编写C语言方法简介
- 【Linux云计算架构:第三阶段-Linux高级运维架构】第26章——tcp三次握手四次挥手及在局域网中使用 awl伪装MAC地址进行多线程SYN攻击
- Queue.queue 退出与阻塞
- linux邮件thunderbird,在 Linux 中安装新版的Thunderbird 邮件客户端
- 维基解密爆料CIA监控技术 科技公司如何接招