我弄了一个在窗体上画线 涂鸦的程序 因为要求需要把痕迹保存到数据库
我的程序是这样写的 不长大家帮我看看
程序运行没有错误 但是画线到后来就不平滑了 鼠标画出来的都是折线 画出来的线都是折线 不是曲线了
是不是程序有改进的地方 麻烦大家了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();
}
我的程序是这样写的 不长大家帮我看看
程序运行没有错误 但是画线到后来就不平滑了 鼠标画出来的都是折线 画出来的线都是折线 不是曲线了
是不是程序有改进的地方 麻烦大家了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();
}
因为我认为鼠标画线是把鼠标经过的所有点都保存到了arrayList数组了 为什么后来就出现了折线呢 中间的很多点都不保存了
怎么回事 呢