所属类别:vc
文章作者:happyparrot
特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!
贝赛尔曲线的拆分是指将贝赛尔曲线分解成逼近的多边形。可以用来判断贝赛尔曲线的选中,以及显示贝赛尔曲线的旋转效果等。贝赛尔曲线简单介绍:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度。所以本函数的顶点数组的记录方式是:控制点+顶点+控制点+控制点+顶点+控制点+……。所以两个顶点之间的曲线是由两个顶点以及两个顶点之间的控制点来决定的。==主函数PolyBezierToPolys==【主要类型申明】 typedef CArray CPtArray;//点动态数组类型【参数说明】 bezierPts[in]---贝赛尔曲线顶点和控制点数组 bClose[in]------是否封闭的贝赛尔曲线polyPt[out]-----拆分后的多边形点数组precision[in]---拆分精度bool PolyBezierToPolys(CPtArray &bezierPts, bool bClose,CPtArray &polyPt,int precision){ polyPt.RemoveAll(); CPtArray apt; int i,count = bezierPts.GetSize();//从1开始,是因为第一个是控制点,如果曲线不封闭,那么第一个控制点是没有用的。//每一段贝赛尔曲线由相邻的两个顶点和之间的两个控制点决定,所以频率为3(后一个顶点在下一组中还要使用) for(i=1;iprecision){ if(!EndBezierCut(&polyPt[i], precision)){bExit = false;InciseBezier(&polyPt[i], ptBuffer);polyPt.RemoveAt(i+1,2);polyPt.InsertAt(i+1,ptBuffer[1],5);for(j=0;j<4;j++) polyPt[i+2+j] = ptBuffer[2+j];i += 3;count += 3; }}if(bExit) break; } count = polyPt.GetSize(); i=0; while(igap)gap=abs(p[i].x-p[i-1].x);if(abs(p[i].y-p[i-1].y)>gap) gap=abs(p[i].y-p[i-1].y); } return gap;}//判断是否可以终止更精细得拆分bool EndBezierCut(CPoint *ptBezier, int nExtent){double C,dx,dy,delt,delt1,delt2;if (nExtent<2) nExtent = 2;dx = (double)(ptBezier[3].x - ptBezier[0].x);dy = (double)(ptBezier[3].y - ptBezier[0].y);C= dx * ptBezier[0].y - dy * ptBezier[0].x;delt = (double)nExtent*nExtent*(dy*dy+dx*dx);delt1 = dy * ptBezier[1].x - dx * ptBezier[1].y+ C;delt2 = dy * ptBezier[2].x - dx * ptBezier[2].y+ C;delt1 = delt1 * delt1;delt2 = delt2 * delt2;if (delt1 > delt delt2 > delt)return FALSE;elsereturn TRUE;}ea5
相关信息· linux下挂载像镜文件
· 窗体的Close方法与Hide方法...
· Servlet技巧ABC
· 查看并找回ADSL拨号连接保存的密码
107027
86012
