跪求高手帮忙解决,曲线平滑问题 实现Windows画画板那样的功能,可以随手画画,写字,现在的问题是,客户觉得写出来的字不平滑,希望用程序处理一下,请大虾们出出主意,有什么可行的方法解决1.考虑随便乱画,2.考虑点密集的时候该如何处理3.可以不考虑曲线实时平滑,如果能行那最好 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你这是后平滑处理写的字应该想办法让用户画的时候就是平滑的graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质 1、不要跪2、可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似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()); } }} 用WPF做吧,WPF本身自带抗锯齿等让图片平滑的功能 楼上两位说的都很对,但是这都是GDI+里面的做法,是我的错,有一点我忘记说了,我用的是WPF,不是winform,wpf中path标签中可以添加polyline对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果上面的意见我会考虑采纳的 画的时候用DrawCurve来做,就是平滑的。 colinfang2006: 能不能说的详细一点, 我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度, WPF里面如何实现,同样求解。关键是曲线要平滑无锯齿。 我用vc写了一个窗口exe,如何嵌入到c#主程序中? vs.net 2005 winform实现票据打印 高手进!!! c#怎样打包? 如何判断一个字符串是否符合“A”+数字 的格式 如何初始化NewPostList[0]?谢谢各位 用SendKeys遇到的严重问题! 有没有谁用过winform下的html编辑器? C#制作媒体播放器 开源项目:作圖程序[曲線圖,柏拉圖,柱圖]等功能,有源代码--来自热情网友dunao[] 关于同一类库里面的控件调用问题 关于控件visible隐藏出现的问题! 急,窗体里代码被删除了,并且保存了,有什么办法还原吗?
应该想办法让用户画的时候就是平滑的graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质
2、可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似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());
}
}
}
能不能说的详细一点,
我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,