基于MFC的平行投影算法

基于 M F C MFC 的平行投影算法实现

本文实现程序的 I D E IDE V S   2017 VS\ 2017

一、新建项目

此处就不再赘述,没有有 M F C MFC 基础可以先看第一个 M F C MFC 的程序。

设置项目名为 P a r a l l e l P r o j e c t i o n ParallelProjection

二、类定义初始化

首先在在 P a r a l l e l P r o j e c t i o n V i e w . h ParallelProjectionView.h 文件最上方加#define N 12
然后在 V i e w View 类中定义成员变量和函数成员。

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]);
	
}

五、图形元素初始化

在类向导中,选择消息,然后选择 W M _ C R E A T E WM\_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;
}

六、清除窗口内容事件实现

设置清除屏幕的 I D ID I D _ C l e a n ID\_Clean ,添加事件相应程序 O n C l e a n ( ) OnClean()

void CParallelProjectionView::OnClean()
{
	// TODO: 在此添加命令处理程序代码
	RedrawWindow();
}

七、正投影事件实现

设置正投影的 I D ID I D _ Z h e n g t o u y i n g ID\_Zhengtouying ,添加事件处理程序 O n Z h e n g t o u y i n g ( ) 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();
}

八、正等测事件实现

设置正等测的 I D ID I D _ Z h e n g d e n g c e ID\_Zhengdengce ,添加事件处理程序 O n Z h e n g d e n g c e ( ) 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();

}

九、正二测事件实现

设置正等测的 I D ID I D _ Z h e n g e r c e ID\_Zhengerce ,添加事件处理程序 O n Z h e n g e r c e ( ) 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();
}

十、实现效果

在这里插入图片描述

原创文章 165 获赞 197 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_43751983/article/details/106074527