我弄了一个在窗体上画线 涂鸦的程序 因为要求需要把痕迹保存到数据库
我的程序是这样写的 不长大家帮我看看
程序运行没有错误 但是画线到后来就不平滑了 鼠标画出来的都是折线 画出来的线都是折线 不是曲线了 
是不是程序有改进的地方 麻烦大家了MsMove 是把鼠标经过的点保存到arrayList数组里,并把MsDown 是插入笔画结束标志  
MsUp函数是 鼠标松开的时候保存笔画的关键点保存到数据库
private void MsMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
 if (pen)

  {
   g.DrawLine(new Pen(Color.Red), oldX, oldY, e.X, e.Y);
oldX = e.X;
oldY = e.Y;
p = new Point(e.X,e.Y);
array.Add(p);
  }

private void MsDown(object sender, System.Windows.Forms.MouseEventArgs e)

  if(pen)
 {
 string str="server=127.0.0.1;Integrated  Security=SSPI;database=webdevelop";
SqlConnection conn=new SqlConnection(str);
SqlDataAdapter adapter1=new SqlDataAdapter("INSERT INTO ZUOBIAO (XX,YY)  VALUES (-1,-1)",conn);
//在数据库中插入(-1,-1)点是为了恢复痕迹的时候 把鼠标中间停顿的笔画分 开避免 全部连接起来
DataSet dataset1 = new DataSet();
conn.Open();

adapter1.Fill(dataset1, "ZUOBIAO");
conn.Close();
}

if(e.Button == MouseButtons.Left)
{
isMoving = true; }
Drag = true;     
oldX=e.X;
oldY=e.Y;
}private void MsUp(object sender, System.Windows.Forms.MouseEventArgs e)
{ double d0;
double d1;
double d;
Drag = false; if(e.Button == MouseButtons.Left)
isMoving = false;
string str="server=127.0.0.1;Integrated Security=SSPI;database=webdevelop";
SqlConnection conn=new SqlConnection(str);
for(int i=0;i<array.Count/2;i++)
{
p0=(Point)array[i*2];
array1.Add(p0);


}
 array.Clear();
for(int j=1;j<array1.Count-1;j++)
{
p1=(Point)array1[j-1];
p2=(Point)array1[j];
p3=(Point)array1[j+1]; 
d0=System.Math.Sqrt((p3.Y-p1.Y)*(p3.Y-p1.Y)+(p1.X-p3.X)*(p1.X-p3.X));
d1=((p3.Y-p1.Y)*p2.X+(p1.X-p3.X)*p2.Y+p1.Y*p3.X-p3.Y*p1.X);
d=d1/d0;
 //d是p2点到p1和p点决定的直线的的距离
if(d>1||d<-1)
{}
else
{
 array1.Remove(p2); //把点到直线的距离少于一个相素的点去掉
 j--;
}
}
for(int k=0;k<array1.Count;k++)
{
p4=(Point)array1[k];
string sql="INSERT INTO ZUOBIAO (XX,YY) VALUES ("+p4.X+","+p4.Y+")";
SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);
DataSet dataset=new DataSet();
adapter.Fill(dataset,"ZUOBIAO");
}
array1.Clear();

}

解决方案 »

  1.   

    不知道为什么 开始画线的时候是很顺利的 笔画很平滑 而且恢复出来的痕迹比较准确 但是 随着保存的痕迹越来越多 鼠标就没有那么好用了似的 中间的很多点都不保存到arrayList数组了 点和点中间画的都是折线 因为我是先保留了偶数点 然后求点到直线的距离来取舍剩下的点的 所以就和原来的痕迹差别很大了 
    因为我认为鼠标画线是把鼠标经过的所有点都保存到了arrayList数组了 为什么后来就出现了折线呢 中间的很多点都不保存了
    怎么回事 呢