基于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的平行投影算法相关推荐

  1. 基于MFC的透视投影算法实现

    基于MFCMFCMFC的透视投影算法实现 本文是在上一篇博客基于MFC的平行投影算法实现的基础上实现透视投影中的一点透视. 两种方法实现 一.添加事件处理程序实现 设置IDIDID为ID_Yidian ...

  2. 基于MFC SDI的图像处理程序(带效果图)

    基于MFC SDI的图像处理程序(带效果图) 收藏 本程序主要实现了位图的打开保存,JPG格式作为BMP格式,以及24位BMP转化到8位.4位.1位(黑白图)及灰度图.还有一些简单的算法如反色,采用高 ...

  3. 基于MFC和OpenCV的图像处理小软件

    1.软件界面: 本程序是基于MFC的单文档(SDI)程序,每次可以打开耽搁图片文件,可以保存,另存为图片文件.支持打开jpg,png,ico,bmp,jpeg等格式的图片.图片打开后的界面如下: 2. ...

  4. 基于MFC的肯德基快餐店的收银系统

    基于MFC的肯德基点餐收银系统 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++/python/Java,结合设计模式(2种以上)至少实现 ...

  5. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速

    基于C++的图像处理算法实现.INTEL CPU上SSE加速.ARM CPU上NEON加速 基于C++的图像处理算法在INTEL CPU上SSE加速实现 基于C++的图像处理算法在ARM CPU上NE ...

  6. 基于自然的灵感算法--元启发式

    问题一:自然赋予的元启发式优化算法的分类 自然赋予的元启发式算法(模拟生物或者物理的现象去解决问题)有三大类也就是:基于进化,基于物理的,基于群体的 基于进化的主要是受达尔文的物种进化理论的启发,主要 ...

  7. 一文全面了解基于内容的推荐算法

    作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) 这篇文章我们主要关注的是基于内容的推荐算法,它也是非常通用的一类推荐算法,在工业界有大量的应用案例. 本文 ...

  8. 基于网格的聚类算法STING

    基于网格的聚类算法STING STING方法简介 ① 全称 : STING , Statistical Information Grid , 统计信息网格 , 是一种 多分辨率聚类技术 ; ② 划分方 ...

  9. Dubbo中基于权重的随机算法

    转载自dubbo源码解析-LoadBalance dubbo的源码地址:https://github.com/alibaba/dubbo Dubbo中的RandomLoadBalance采用基于权重的 ...

最新文章

  1. breakdancer检测结构变异
  2. label实现不同大小不同颜色
  3. Fedora下如何删除以前的老内核
  4. golang中并发sync和channel
  5. 类的主动使用与被动使用等
  6. Java并发Semaphore信号量的学习
  7. C语言中的常用文件操作
  8. How to write a custom control with NSControl ...
  9. 冒泡、鸡尾酒、选择、插入、归并、快速排序的C++程序
  10. 设计一个移动应用的本地缓存机制(转)
  11. [Tarjan四连]Tarjan缩点
  12. WEB开发常用软件集合
  13. cruisecontrol 持续化集成(运行bat脚本)
  14. VSCode,webstorm绿色护眼背景设置
  15. 预告 | 互联网人吐槽大会系列漫画 要来啦~
  16. DEV编写C语言方法简介
  17. 【Linux云计算架构:第三阶段-Linux高级运维架构】第26章——tcp三次握手四次挥手及在局域网中使用 awl伪装MAC地址进行多线程SYN攻击
  18. Queue.queue 退出与阻塞
  19. linux邮件thunderbird,在 Linux 中安装新版的Thunderbird 邮件客户端
  20. 维基解密爆料CIA监控技术 科技公司如何接招

热门文章

  1. 如何恢复微信删除的聊天记录
  2. 全球及中国视频会议系统市场应用状况与趋势展望分析报告2022版
  3. SS54/SS24/SS510及SMA/SMB/SMC不同封装区别
  4. 陆军工程大学毕业论文Latex模板
  5. 计算机地质模拟,地质过程计算机模拟.ppt
  6. 什么是管理能力?如何提高管理能力?HR人才测评
  7. java 中输入字符的方法(顺便判断元音辅音)
  8. 人生成功的生活经典治理名言
  9. 10月11号58同城面试的编程题
  10. 一舞倾城,再舞倾国,如之奈何