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