首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

GraphicsPath.AddCurve()步骤效果优化

2014-01-22 
GraphicsPath.AddCurve()方法效果优化描述:做一个画笔小工具在触屏白板上使用,我使用GraphicsPath来保存鼠

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 e)
    {
        if (this.points.Count > 2)
        {
            e.Graphics.DrawCurve(Pens.Blue, this.points.ToArray());
        }
    }
}

[解决办法]
引用:
这个原因有几个:1)取的鼠标点就是不连续的;2)半身绘制线的时候就有锯齿
处理方式:(我的建议)
1)以每三个点(如12345五个点,123算一组,345算是一组,其中务必公用一个顶点)为一组,绘制2次Bezier曲线;(线的宽度可以定义)
2)在最终显示的时候使用抗锯齿算法,如果嫌麻烦,可以简单使用超采样算法
这样您整个线是光滑的,而且线的细节(每个像素)也是光滑的

发现好像有一处遗漏:用二次Bezier曲线如果仅用一个公用顶点还是有可能不连续,所以,公用几个顶点可以再考虑,但一点应该是可行的,就是可以使用Bezier曲线,之所以选择2次Bezier仅仅是为了计算简单和速度上原因。
楼上说的“频率”不是很明白,之前我们的做法是判断一个线是否够“平直”,如果是平直的线,我们会用直线;对于不够平直的线是根据他们的“弯曲程度”确认应该使用的线段数 ---- 太多的曲线会影响效能

热点排行