1、直线中点Bresenham算法学 生: 学 号: 班 级: 网络 实验时间: 2012年12月19日 报告时间: 2012年12月20日 系 别: 计算机系 学 院: 电气与信息工程学院 实验:直线中点Bresenham算法一:原理1、输入直线的两端点p0(x0,y0)和p1(x1,y1)。2、计算初始值x,y,d=x-2y,x=x0,y=y0。3、绘制点(x,y)判断d的符号:若d=scanline 4) 扫描AET表,填充扫描线和多边形相交的区间。二:伪代码class CscanfillView : public CViewprotected: / 仅从序列化创建 CscanfillVie
2、w(); DECLARE_DYNCREATE(CscanfillView)/ 属性public: CscanfillDoc* GetDocument() const;/ 操作public: void PolygonFill(); /上闭下开填充多边形 void CreatBucket(); /建立桶节点 void Et(); /构造边表 void AddEdge(AET *); /将边插入AET表 void EdgeOrder(); /对AET表进行排序/ 重写public: virtual void OnDraw(CDC* pDC); / 重写以绘制该视图 virtual BOOL PreC
3、reateWindow(CREATESTRUCT& cs);protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/ 实现public: virtual CscanfillView();#ifdef _DEBUG virtual void AssertValid() const; virtual v
4、oid Dump(CDumpContext& dc) const;#endifprotected: COLORREF GetColor; /调色板 CPoint Point7; /定义多边形 Bucket * HeadB,*CurrentB; /桶的头结点和当前节点 AET ENumber,*HeadE,*CurrentE,*T1,*T2; /有效边表的节点/ 生成的消息映射函数protected: DECLARE_MESSAGE_MAP()public: afx_msg void OnMenuAET();#ifndef _DEBUG / scanfillView.cpp 中的调试版本inli
5、ne CscanfillDoc* CscanfillView:GetDocument() const return reinterpret_cast(m_pDocument); #endif三:截图实验:梁友栋-Barsky直线裁剪算法一:原理 梁友栋-Barsky算法进行线段裁剪的步骤 (1) 输入直线段的两端点坐标以及窗口的四条边界坐标。 (2) 若x=0 则p1=p2=0。进一步判断是否满足q10或q20且q20 则进一步计算u1和u2。转(5)。 (3) 若y=0 则p3=p4=0。进一步判断是否满足q30或q40且q20 则进一步计算u1和u2。转(5)。(4) 若上述两条均不满足,
6、则有pk0(k=1,2,3,4)。此时计算u1和u2。(5) 求得u1和u2后,进行判断 若u1u2,则直线段在窗口外,转(7)。若u1Polygon(Point,7);/绘制多边形 /输出多边形的顶点编号 pDC-TextOut(550,410,P0); pDC-TextOut(350,600,P1); pDC-TextOut(230,340,P2); pDC-TextOut(350,30,P3); pDC-TextOut(490,220,P4); pDC-TextOut(600,30,P5); pDC-TextOut(805,450,P6); 三:截图实验:三次B样条曲线算法一:原理三次B
7、样条曲线的n=3,k=0,1,2,3,控制多边形有4个控制点P0、P1、P2和P3,B样条曲线是三次多项式。三次参数曲线可以表示成: P(t)=A0(t) Q0 + A1(t) Q1 + A2(t) Q2 + A3 (t) Q3 (1) A0(t),A1(t),A2(t),A3 (t)是待定参数P1 由Q0,Q1,Q2,Q3确定P2 由Q1,Q2,Q3,Q4确定P1 (1)=P2 (0) P1 (1)=P2 (0) P1 (1)=P2 (0) A0(t) + A1(t)+ A2(t) + A3 (t)=1A0(t) ,A1(t) , A2(t) , A3 (t)0确定 A0(t) ,A1(t)
8、 , A2(t) , A3 (t) 代入(1)式对于B样条曲线来说,特征多边形每增加一个顶点,就相应增加一段B样条曲线。因此, B样条曲线很好地解决了曲线段的连接问题。二:伪代码void CDrawYTQXView:DrawB3_curves() /绘制B样条曲线 CClientDC dc(this); int i,rate=10,m; long lx,ly; m=CtrlPoint-(3+1); double F03,F13,F23,F33; lx=ROUND(pt0.x+4.0*pt1.x+pt2.x)/6.0); /t0的起点x坐标 ly=ROUND(pt0.y+4.0*pt1.y+pt
9、2.y)/6.0);/t0的起点y坐标 dc.MoveTo(lx,ly); CPen MyPen2,*pOldPen2; MyPen2.CreatePen(PS_SOLID,2,RGB(0,0,255); /颜色设置 pOldPen2=dc.SelectObject(&MyPen2); for(i=1;im+2;i+) /m+1段三次样条曲线 for(double t=0;t=1;t+=1.0/rate) F03=(-t*t*t+3*t*t-3*t+1)/6;/计算F0,3(t) F13=(3*t*t*t-6*t*t+4)/6;/计算F1,3(t) F23=(-3*t*t*t+3*t*t+3*
10、t+1)/6;/计算F2,3(t) F33=t*t*t/6;/计算B3,3(t) lx=ROUND(pti-1.x*F03+pti.x*F13+pti+1.x*F23+pti+2.x*F33); ly=ROUND(pti-1.y*F03+pti.y*F13+pti+1.y*F23+pti+2.y*F33); dc.LineTo(lx,ly); dc.SelectObject(pOldPen2); MyPen2.DeleteObject();void CDrawYTQXView:DrawCharPolygon()/绘制控制多边形 CClientDC dc(this); CPen MyPen,*p
11、OldPen; MyPen.CreatePen(PS_SOLID,2,RGB(0,0,0); /控制多边形 pOldPen=dc.SelectObject(&MyPen); for(int i=0;iCtrlPoint;i+) if(i=0) dc.MoveTo(pti); dc.Ellipse(pti.x-2,pti.y-2,pti.x+2,pti.y+2); else dc.LineTo(pti); dc.Ellipse(pti.x-2,pti.y-2,pti.x+2,pti.y+2); dc.SelectObject(pOldPen); MyPen.DeleteObject();void
12、 CDrawYTQXView:OnLButtonDown(UINT nFlags, CPoint point)/获得屏幕控制点坐标 / TODO: Add your message handler code here and/or call default CView:OnLButtonDown(nFlags, point); if(Flag) ptCtrlPoint.x=point.x; ptCtrlPoint.y=point.y; if(CtrlPointN_MAX_POINT) CtrlPoint+; else Flag=false; DrawCharPolygon(); else DrawCharPolygon1();void CDrawYTQXView:OnRButtonDown(UINT nFlags, CPoint point)/调用绘制函数 / TODO: Add your message handler code here and/or call default Flag=false; if(Sign=0)Hermite(); if(Sign=1)DrawBezier(); if(Sign=2)DrawB3_curves(); CView:OnRButtonDown(nFlags, point);三:截图
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1