¼ÆËã»úͼÐÎѧѧϰ×ܽá

·¢²¼Ê±¼ä : ÐÇÆÚÒ» ÎÄÕ¼ÆËã»úͼÐÎѧѧϰ×ܽá¸üÐÂÍê±Ï¿ªÊ¼ÔĶÁ

void CDDAMouseLineView::DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) {

int length,i; float x,y,dx,dy; length=abs(x1-x0); if (abs(y1-y0)>length) length=abs(y1-y0);

dx=(float)(x1-x0)/length; dy=(float)(y1-y0)/length; x=x0+0.5;y=y0+0.5; for (i=1;i<=length;i++) {

pDC->SetPixel((int)x,(int)y,color); x=x+dx;y=y+dy; }

//pDC->MoveTo(x0,y0); //pDC->LineTo(x1,y1); }

µÚ°Ë²½£º±àÒëÔËÐгÌÐò£¬ÑéÖ¤ÔËÐнá¹û¡£

³ÌÐò¸Ä½ø£¬Ìí¼ÓÏðƤ½î»æͼ¼¼Êõ£¬ÊµÏÖ½»»¥Ê½»­Ö±Ïß¡£

ÏòÊÓͼÀàÖÐÌí¼ÓÊó±êOnMouseMove ()º¯ÊýÏûÏ¢ÏìÓ¦º¯Êý£¬²¢ÊäÈëÊó±ê´¦Àí³ÌÐò´úÂë¡£ void CDDAMouseLineView::OnMouseMove(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

int nDrawmode=pDC->SetROP2(R2_NOT); //ÉèÖÃÒì»ò»æͼģʽ£¬²¢±£´æÔ­À´»æͼģʽ pDC->SelectStockObject(NULL_BRUSH); if(m_ist==1){

CPoint prePnt,curPnt;

prePnt=m_p2; //»ñµÃÊó±êËùÔÚµÄǰһλÖà curPnt=point; //»æÖÆÏðƤ½îÏß

DDAMouseLine(pDC,m_p1.x,m_p1.y,prePnt.x,prePnt.y,RGB(255,0,0)); //DrawCircle(pDC,m_bO,prePnt); //ÓÃÒì»òģʽÖظ´»­Ô²£¬²Á³öËù»­µÄÔ² DDAMouseLine(pDC,m_p1.x,m_p1.y,curPnt.x,curPnt.y,RGB(255,0,0)); //DrawCircle(pDC,m_bO,curPnt); //Óõ±Ç°Î»ÖÃ×÷ΪԲÖÜÉϵĵ㻭Բ m_p2=point; }

pDC->SetROP2(nDrawmode); //»Ö¸´Ô­»æͼģʽ ReleaseDC(pDC); //ÊÍ·ÅÉ豸»·¾³ CView::OnMouseMove(nFlags, point); }

ʵÑéÈý

Ò»¡¢ÊµÑéÄ¿µÄ

±àдԲºÍÍÖÔ²µÄɨÃèת»»Ëã·¨³ÌÐò£¬ÑéÖ¤Ëã·¨µÄÕýÈ·ÐÔ¡£ ¶þ¡¢ÊµÑéÈÎÎñ

1£® ±àдÖе㻭Բ·¨µÄɨÃèת»»³ÌÐò£¬¿¼ÂÇÔ­µãÔÚ£¨x0,y0£©´¦³ÌÐòµÄ¸Ä¶¯£» 2£® Ìí¼ÓÊó±ê³ÌÐò£¬ÊµÏÖ½»»¥Ê½»­Ô²£» 3£® ±àдÖе㻭ÍÖÔ²·¨µÄɨÃèת»»³ÌÐò£»

13

4£® Ìí¼ÓÊó±ê³ÌÐò£¬ÊµÏÖ½»»¥Ê½»­ÍÖÔ²£»

Èý¡¢ÊµÑéÄÚÈÝ

ÈÎÎñÒ»£ºÖе㻭Բ·¨µÄɨÃèת»»Ëã·¨

³ÌÐòʵÏÖ²½Ö裺

£¨1£© ½¨Á¢MidPointCircle¹¤³ÌÎļþ£»

£¨2£© ÓÒ»÷CMidPointCircleViewÀ࣬½¨Á¢³ÉÔ±º¯Êý

void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) int CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) (3) ±àд³ÉÔ±º¯Êý´úÂ룬³ÌÐòÈçÏ£º

void CMidPointCircleView::MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) {

int x,y; float d;

x=0;y=r;d=1.25-r;

CirPot(pDC,x0,y0,x,y,color); while (x<=y) {

if(d<0) {

d+=2*x+3; x++; } else {

d+=2*(x-y)+5; x++; y--; }

CirPot(pDC,x0,y0,x,y,color); } /* while*/ }

int CMidPointCircleView::CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) {

pDC->SetPixel((x0+x),(y0+y),color); pDC->SetPixel((x0+y),(y0+x),color); pDC->SetPixel((x0+y),(y0-x),color); pDC->SetPixel((x0+x),(y0-y),color); pDC->SetPixel((x0-x),(y0-y),color); pDC->SetPixel((x0-y),(y0-x),color); pDC->SetPixel((x0-y),(y0+x),color); pDC->SetPixel((x0-x),(y0+y),color); return 0; }

£¨4£©±àдOnDraw(CDC* pDC)º¯Êý£¬³ÌÐòÈçÏ£º void CMidPointCircleView::OnDraw(CDC* pDC) {

CMidPointCircleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

MidpointCircle(pDC,100, 100, 10, RGB(255,0,0)); MidpointCircle(pDC,500, 300, 60, RGB(255,255,0)); }

£¨6£© ±àÒë¡¢ÔËÐгÌÐò£¬²é¿´½á¹û¡£

14

ÈÎÎñ¶þ£ºÌí¼ÓÊó±ê³ÌÐò£¬ÊµÏÖ½»»¥Ê½»­Ô²

ÔÚÈÎÎñ1µÄ»ù´¡ÉÏ£¬Íê³ÉÏÂÁв½Ö裺 £¨1£©ÏòÊÓͼÀàÖÐÌí¼Ó×Ô¶¨ÒåµÄ³ÉÔ±±äÁ¿

ÓÃÊó±êÓÒ¼üµ¥»÷ÊÓͼÀ࣬ѡÔñ¡°Add Member Variable¡­¡±,Ìí¼ÓÏÂÃæÈý¸ö³ÉÔ±±äÁ¿¡£ proctected : int m_r; // °ë¾¶

CPoint m_bO; // Ô²ÐÄ CPoint m_bR; //Ô²Éϵĵã

int m_ist; //Ô²ÐÄÓëÔ²ÖÜÉϵãµÄÇø±ð£¬m_ist=0£¬±íʾÊó±ê×ó»÷µãΪԲÐÄ£¬ //m_ist=1£¬±íʾÊó±ê×ó»÷µãΪԲÖÜÉϵĵã

£¨2£©ÔÚÊÓͼÀàCPPÎļþµÄ¹¹Ô캯ÊýÖгõʼ»¯³ÉÔ±±äÁ¿ CMidPointCircleMouseView::CMidPointCircleMouseView() {

// TODO: add construction code here m_bO.x=0; m_bO.y=0; //Ô²ÐÄ m_bR.x=0; m_bR.y=0; //Ô²Éϵĵã m_ist=0; //Ô²ÐÄÓëÔ²ÉϵĵãÇø±ð m_r=0; //Ô²µÄ°ë¾¶ }

£¨3£©ÏòÊÓͼÀàÖÐÌí¼Ó×Ô¶¨ÒåµÄ³ÉÔ±º¯ÊýÔ­ÐÍ£º public:

int ComputeRadius(CPoint cenp,CPoint ardp); Ìí¼Ó³ÉÔ±º¯ÊýµÄ³ÌÐò´úÂ룺

int CMouseSpringView::ComputeRadius(CPoint cenp, CPoint ardp) {

int dx=cenp.x-ardp.x; int dy=cenp.y-ardp.y;

//sqrt()º¯ÊýµÄµ÷Óã¬ÔÚÍ·ÎļþÖмÓÈë#include \ return (int)sqrt(dx*dx+dy*dy); }

£¨4£©ÏòÊÓͼÀàÖÐÌí¼ÓÁ½¸öÊó±êÏûÏ¢ÏìÓ¦º¯Êý£¬²¢ÊäÈëÊó±ê´¦Àí³ÌÐò´úÂë¡£

¾ßÌå²Ù×÷·½·¨ÓëÊó±êʾÀý1·½·¨Ïàͬ¡£Ò»¸öÊÇOnLButtonDown()º¯Êý£¬ÁíÒ»¸öÊÇOnMouseMove()º¯Êý¡£³ÌÐòÈçÏ£º

void CMidPointCircleMouseView::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

pDC->SelectStockObject(NULL_BRUSH); if (!m_ist) //»æÖÆÔ² {

m_bO=m_bR=point; //¼Í¼µÚÒ»´Îµ¥»÷Êó±êλÖ㬶¨Ô²ÐÄ m_ist++; } else {

m_bR=point; //¼Ç¼µÚ¶þ´Îµ¥»÷Êó±êµÄλÖ㬶¨Ô²ÖÜÉϵĵã m_ist--; // Ϊлæͼ×÷×¼±¸

m_r=ComputeRadius(m_bO,m_bR);

MidpointCircle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0)); }

ReleaseDC(pDC); //ÊÍ·ÅÉ豸»·¾³

CView::OnLButtonDown(nFlags, point); }

15

void CMidPointCircleMouseView::OnMouseMove(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

int nDrawmode=pDC->SetROP2(R2_NOT); //ÉèÖÃÒì»ò»æͼģʽ£¬²¢±£´æÔ­À´»æͼģʽ pDC->SelectStockObject(NULL_BRUSH); if(m_ist==1) {

CPoint prePnt,curPnt;

prePnt=m_bR; //»ñµÃÊó±êËùÔÚµÄǰһλÖà curPnt=point; //»æÖÆÏðƤ½îÏß

m_r=ComputeRadius(m_bO,prePnt);

MidpointCircle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0));//ÓÃÒì»òģʽÖظ´»­Ô²£¬²Á³öËù»­µÄÔ² // DrawCircle(pDC,m_bO,prePnt); m_r=ComputeRadius(m_bO,curPnt);

MidpointCircle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0)); //Óõ±Ç°Î»ÖÃ×÷ΪԲÖÜÉϵĵ㻭Բ m_bR=point; }

pDC->SetROP2(nDrawmode); //»Ö¸´Ô­»æͼģʽ ReleaseDC(pDC); //ÊÍ·ÅÉ豸»·¾³ CView::OnMouseMove(nFlags, point); }

ÈÎÎñÈý£º±àдÖе㻭ÍÖÔ²·¨µÄɨÃèת»»³ÌÐò

³ÌÐòʵÏÖ²½Ö裺

(1) ½¨Á¢MidPointEllise¹¤³ÌÎļþ£»

(2)ÓÒ»÷CMidPointElliseViewÀ࣬½¨Á¢³ÉÔ±º¯Êý

void MidpointEllise(CDC *pDC, int x0, int y0, int a, int b, COLORREF color) (3) ±àд³ÉÔ±º¯Êý´úÂ룬³ÌÐòÈçÏ£º

void CMidPointEllipseView::MidpointEllise(CDC *pDC, int x0, int y0, int a, int b, COLORREF color) { } // Éϰ벿·Ö int x,y; d2=(b*(x+0.5))*(b*(x+0.5))+(a*(y-1))*(a*(y-1))-(float d1,d2; a*b)*(a*b); x=0;y=b; while (y>0) d1=b*b+a*a*(-b+0.25); { pDC->SetPixel(x+x0,y+y0,color); if (d2<0) while (b*b*(x+1)SetPixel(x0+x,y0+y,color); x++; y--; pDC->SetPixel(x0+x,y0-y,color); } pDC->SetPixel(x0-x,y0+y,color); pDC->SetPixel(x0+x,y0+y,color); pDC->SetPixel(x0-x,y0-y,color); pDC->SetPixel(x0+x,y0-y,color); } //Ï°벿·Ö pDC->SetPixel(x0-x,y0+y,color); } pDC->SetPixel(x0-x,y0-y,color); (4) ±àдOnDraw()º¯Êý

16

ÁªÏµºÏͬ·¶ÎÄ¿Í·þ£ºxxxxx#qq.com(#Ì滻Ϊ@)