日期:2014-05-17  浏览次数:21362 次

GraphicsPath.AddCurve()方法效果优化
描述:
做一个画笔小工具在触屏白板上使用,我使用GraphicsPath来保存鼠标移动过的轨迹,并将轨迹显示出来

问题:
显示出来的线条不够平滑,写字的时候也不流畅。

   在这里寻求帮助,欢迎各位大神前来指导。

------解决方案--------------------
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
设置了吗
------解决方案--------------------
http://www.codeproject.com/Articles/8494/DrawTools
这个软件,可以下载下来研究一下!
------解决方案--------------------
这个原因有几个:1)取的鼠标点就是不连续的;2)半身绘制线的时候就有锯齿
处理方式:(我的建议)
1)以每三个点(如12345五个点,123算一组,345算是一组,其中务必公用一个顶点)为一组,绘制2次Bezier曲线;(线的宽度可以定义)
2)在最终显示的时候使用抗锯齿算法,如果嫌麻烦,可以简单使用超采样算法
这样您整个线是光滑的,而且线的细节(每个像素)也是光滑的
------解决方案--------------------
见下贴2楼:
引用 http://bbs.csdn.net/topics/360162829:
...可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似bezier等来画平滑曲线。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
    }

    List<Point> points = new List<Point>();
    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (this.Capture)
        {
            Point last = this.points.Count > 0 ? points[points.Count - 1] : new Point(-100,-100);
            // 这里取样规则是下一点离前一点超过一定的距离,可以自己定义。
            if (Math.Abs(e.X - last.X) + Math.Abs(e.Y - last.Y) > 15)
            {
                points.Add(e.Location);
                this.Invalidate();
            }
        }
        else
        {
            points.Clear();
        }
    }
    protected override void OnPaint(PaintEventArgs&nb