读书人

GraphicsPath.AddCurve()步骤效果优化

发布时间: 2014-01-22 00:03:39 作者: rapoo

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仅仅是为了计算简单和速度上原因。
楼上说的“频率”不是很明白,之前我们的做法是判断一个线是否够“平直”,如果是平直的线,我们会用直线;对于不够平直的线是根据他们的“弯曲程度”确认应该使用的线段数 ---- 太多的曲线会影响效能

读书人网 >C#

热点推荐