基于 M F C MFC MFC的平行投影算法实现
本文实现程序的 I D E IDE IDE是 V S 2017 VS\ 2017 VS 2017。
一、新建项目
此处就不再赘述,没有有 M F C MFC MFC基础可以先看第一个 M F C MFC MFC的程序。
设置项目名为 P a r a l l e l P r o j e c t i o n ParallelProjection 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
ParallelProjectionView.h文件最上方加#define N 12
。
然后在
V
i
e
w
View
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 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 ID为 I D _ C l e a n ID\_Clean ID_Clean,添加事件相应程序 O n C l e a n ( ) OnClean() OnClean()。
void CParallelProjectionView::OnClean()
{
// TODO: 在此添加命令处理程序代码
RedrawWindow();
}
七、正投影事件实现
设置正投影的 I D ID ID为 I D _ Z h e n g t o u y i n g ID\_Zhengtouying ID_Zhengtouying,添加事件处理程序 O n Z h e n g t o u y i n g ( ) 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();
}
八、正等测事件实现
设置正等测的 I D ID ID为 I D _ Z h e n g d e n g c e ID\_Zhengdengce ID_Zhengdengce,添加事件处理程序 O n Z h e n g d e n g c e ( ) 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();
}
九、正二测事件实现
设置正等测的 I D ID ID为 I D _ Z h e n g e r c e ID\_Zhengerce ID_Zhengerce,添加事件处理程序 O n Z h e n g e r c e ( ) 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();
}