我现在用8段2次bezier曲线画了一个椭圆,现在想在椭圆没有边的时候也显示的比较光滑,而smoothingmode这个函数必须在有边的时候才有效,看以前的帖子别人说先将 bezier转换为一段段小直线, 再对直线进行反走样处理。所以我想问一下
我想问一下1、bezier怎样转换为一小段折线?
2、栅格化后如何处理
原帖地址:http://topic.csdn.net/t/20020525/15/751942.html
我想问一下1、bezier怎样转换为一小段折线?
2、栅格化后如何处理
原帖地址:http://topic.csdn.net/t/20020525/15/751942.html
dcResult.Ellipse(&rc);
dcResult.EndPath();
dcResult.FlattenPath();
unsigned long lNumPoints = dcResult.GetPath(NULL, NULL, 0);
vector<CPoint> pts;
pts.resize(lNumPoints);
dcResult.GetPath(&pts[0], &Bytes[0], lNumPoints);
查查MSDN就知道了。
PT_MOVETO
坐标是一个新子路径的起始处
PT_LINETO
坐标是来自前一个坐标的一条线的终点
PT_BEZIERTO
肯定以三点一组的形式出现。头两个点是控制点,第三个是贝塞尔(Bezier)曲线的终点。PT_LINETO和PT_BEZIERTO也许能与PT_CLOSEFIGURE联合使用。在这种情况下,它代表一幅图象的最后一个点。将这个点与子路径的第一个连接起来后,路径就会封闭
=====================================
囧...怎么用呢?
1、第二个参数是指将得到的这些离散点如何处理吗?具体怎么用呢?能给个小程序不?2、第一个数组应该可以获得这些点的坐标值吧?或者我自己做个循环把每个小直线lineto可以不?那此时第二个参数应该填什么呢?
前面的代码没贴,point21~28是3个点组成的beizer曲线的控制点数组,这8个数组围成一个闭合曲线.
dc.BeginPath();
dc.MoveTo(start4.x,start4.y);
dc.PolyBezierTo(point21,3);
dc.PolyBezierTo(point22,3);
dc.PolyBezierTo(point23,3);
dc.PolyBezierTo(point24,3);
dc.PolyBezierTo(point25,3);
dc.PolyBezierTo(point26,3);
dc.PolyBezierTo(point27,3);
dc.PolyBezierTo(point28,3);
dc.EndPath(); dc.FlattenPath();
CPoint pts_getdot[MaxNum];
BYTE pts_byte[MaxNum];
unsigned long lNumPoints = dc.GetPath(NULL, NULL, 0);
CPoint Bytes[MaxNum];
dc.GetPath(&pts_getdot[0],&pts_byte[0],lNumPoints);
也就是说,如果我对每2个点作为一个直线进行处理的化,无非就是平行于x轴、y轴的直线,或者45度角的直线~~~
如果这样的化,我用反走样处理根本就没有意义了~~~因为平行于x轴、y轴的直线,或者45度角的直线本身就画得很好,不需要反走样我现在所需要做的就是将椭圆打成一些线段,这些线段不是相邻的,跨度比相邻的像素点要大一点,然后再对每条直线进行反走样处理,除了利用方程外,有谁有比较好的方法?