根据选取的点连接生成有宽度的路径
计算每三个点连接形成角的中线,中线上选取点连接形成路
左键选取点,右键生成路,右键清除图形
#include<iostream>
#include<graphics.h>
#include <windows.h>
#include<cmath>
#define PI 3.1415;
using namespace std;
void CreatLoad(double p[][2], 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 PData(double p[][2], int N)
{
double p1[20][2],p2[20][2];
double k[20],k0=0,k1=0,k2=0;
k[0]=( p[0][1]-p[1][1] )/( p[0][0]-p[1][0] );
p1[0][0]=p[0][0]-10;p1[0][1]=p[0][1]-10*(-1/k[0]);
p2[0][0]=p[0][0]+10;p2[0][1]=p[0][1]+10*(-1/k[0]);
for(int i=1; i<N; i++)
{
k[i]=( p[i][1]-p[i+1][1] )/( p[i][0]-p[i+1][0] );
if( p[i][0]>p[i-1][0] )
{
if(p[i][1]>p[i-1][1])
{
k1 = atan( k[i-1] ) - PI;
}
else
{
k1 = atan( k[i-1] ) + PI;
}
}
else k1=atan( k[i-1] );
if( p[i][0]>p[i+1][0] )
{
if(p[i][1]>p[i+1][1])
{
k2=atan( k[i] ) - PI;
}
else
{
k2=atan( k[i] ) + PI;
}
}
else k2=atan( k[i] );
k0=tan( (k1+k2)/2 );
if( i==(N-1) )k0=(-1/k[i-1]);
//y=k[i-1]*(x-p1[i-1][0]))+p1[i-1][1]
//y=k0*(x-p[i][0])+p[i][1]
p1[i][0] = ( p[i][1] - k0*p[i][0] + k[i-1]*p1[i-1][0] - p1[i-1][1] ) / ( k[i-1]-k0 );
p1[i][1] = k0 * ( p1[i][0] - p[i][0] ) + p[i][1];
p2[i][0] = ( p[i][1] - k0*p[i][0] + k[i-1]*p2[i-1][0] - p2[i-1][1] ) / ( k[i-1]-k0 );
p2[i][1] = k0 * ( p2[i][0] - p[i][0] ) + p[i][1];
}
CreatLoad(p1, N);
CreatLoad(p2, N);
}
int main()
{
initgraph(1000, 600,SHOWCONSOLE);
int n=0;
double p[20][2];
ExMessage m;
while(1)
{
// 获取一条鼠标消息
m=getmessage(EM_MOUSE);
switch(m.message)
{
case WM_LBUTTONDOWN://左键摁下获取数据
p[n][0]=m.x;
p[n][1]=m.y;
n++;
break;
case WM_RBUTTONDOWN://右键摁下画图
cleardevice( );
PData(p, n);
n=0;
break;
}
}
getchar();
closegraph();
return 0;
}