根据选取的点连接生成有宽度的路径
计算所有点的平均点,以它为中心,将所有点连接形成的图形放大缩小,形成路径
左键选取点,右键生成路,右键清除图形
#include<iostream>
#include<graphics.h>
#include <windows.h>
using namespace std;
void CreatLoad(double p[][3], int N)
{
for(int i=0; i<N-1; i++)
line( p[i][0], p[i][1], p[(i+1)][0], p[(i+1)][1] );
}
void MultiMatrix(double p[][3], double pNew[][3], double T[][3], int N)//矩阵相乘
{
int i,j;
double PNew[20][3];
for(i=0;i<N;i++)
for(j=0;j<3;j++)
PNew[i][j]=p[i][0]*T[0][j]+p[i][1]*T[1][j]+p[i][2]*T[2][j];
for(i=0;i<N;i++)
for(j=0;j<3;j++)
pNew[i][j]=PNew[i][j];
}
int main()
{
initgraph(1000, 600,SHOWCONSOLE);
double T1[3][3],T2[3][3],T3[3][3],T4[3][3];
int x,y,n=0;
ExMessage m;
double p[20][3], pNew[20][3];
while(1)
{
// 获取一条鼠标消息
m=getmessage(EM_MOUSE);
switch(m.message)
{
case WM_LBUTTONDOWN://左键摁下获取数据
p[n][0]=m.x;
p[n][1]=m.y;
p[n][2]=1;
n++;
break;
case WM_RBUTTONDOWN://右键摁下画图
cleardevice( );
x=y=0;
for(int i=0;i<n;i++)
{
x+=p[i][0];
y+=p[i][1];
}
x=x/n;y=y/n;
double w=0.25;//比例
//平移变换矩阵
T1[0][0]=1;T1[0][1]=0;T1[0][2]=0;
T1[1][0]=0;T1[1][1]=1;T1[1][2]=0;
T1[2][0]=-x;T1[2][1]=-y;T1[2][2]=1;
//放小变换矩阵
T2[0][0]=1-w;T2[0][1]=0;T2[0][2]=0;
T2[1][0]=0;T2[1][1]=1-w;T2[1][2]=0;
T2[2][0]=0;T2[2][1]=0;T2[2][2]=1;
//放大变换矩阵
T3[0][0]=1+w;T3[0][1]=0;T3[0][2]=0;
T3[1][0]=0;T3[1][1]=1+w;T3[1][2]=0;
T3[2][0]=0;T3[2][1]=0;T3[2][2]=1;
//反平移变换矩阵
T4[0][0]=1;T4[0][1]=0;T4[0][2]=0;
T4[1][0]=0;T4[1][1]=1;T4[1][2]=0;
T4[2][0]=x;T4[2][1]=y;T4[2][2]=1;
MultiMatrix(p, pNew, T1, n);
MultiMatrix(pNew, pNew, T2, n);
MultiMatrix(pNew, pNew, T4, n);
CreatLoad(pNew, n);
MultiMatrix(p, pNew, T1, n);
MultiMatrix(pNew, pNew, T3, n);
MultiMatrix(pNew, pNew, T4, n);
CreatLoad(pNew, n);
n=0;
break;
}
}
getchar();
closegraph();
return 0;
}