划直线。 我想问一下像windows自带的画图软件中的“直线”是怎么实现的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 moveto, lineto, polyline, polylineto... pDC->MoveTo(m_1.x,m_1.y);pDC->LineTo(m_2.x,m_2.y);自己定义m_1,m_1为CPoint型 我用bresenham直线生成算法写了一个画直线的函数,若需要源码和我联系(送)。画圆的我也有。 鼠标ON_move的时候画一条直线,当鼠标坐标改变时(前提是一直按着左键),在以前画的直线上,反色画一条直线,同是在新坐标处画一条新直线,如此,便实现了WINDOWS的直线功能。 对,送就感到很亲切。呵呵! 我也有,而且,多中方法都有!bresenham 法; 中点法;数值微分法;等等呵呵,还有圆的,呵呵,刚好学这个图形学,老师让做的!!要的话,说话就ok! ac669(龙龙酒),shaolunyuan(袁绍伦) 非常感谢!我非常需要不知道有没有画椭圆的算法我很想学图形学, 但不知道该从何学起,希望各位多多指点。 这是从我的计算机图形学实习程序(已调试无误)中直接copy来的,应该没有错误.void CMy003View::Bresenham_circle(CPoint point,double r,COLORREF color) //point为圆心,r为半径,color为作图颜色.{ //Bresenham算法画圆 int x,y,d,x0,y0; x0=point.x; y0=point.y; x=0; y=(int)r; d=(int)r; CDC *cdc; cdc=GetDC(); cdc->SetPixel(point.x,point.y,color); //点亮圆心. while(x<y) { cdc->SetPixel((x0+x),(y0+y),color); cdc->SetPixel((x0+y),(y0+x),color); cdc->SetPixel((x0+y),(y0-x),color); cdc->SetPixel((x0+x),(y0-y),color); cdc->SetPixel((x0-x),(y0-y),color); cdc->SetPixel((x0-y),(y0-x),color); cdc->SetPixel((x0-y),(y0+x),color); cdc->SetPixel((x0-x),(y0+y),color); if(d<0) d+=4*x+6; else { d+=4*(x-y)+10; y--; } x++; } if(x==y) { cdc->SetPixel((x0+x),(y0+y),color); cdc->SetPixel((x0+y),(y0+x),color); cdc->SetPixel((x0+y),(y0-x),color); cdc->SetPixel((x0+x),(y0-y),color); cdc->SetPixel((x0-x),(y0-y),color); cdc->SetPixel((x0-y),(y0-x),color); cdc->SetPixel((x0-y),(y0+x),color); cdc->SetPixel((x0-x),(y0+y),color); } cdc->SetPixel(point.x,point.y,bgcolor); //删除圆心. ReleaseDC(cdc);} //Bresenham_circle///////////////////////////////////////////////////////////////////void CMy003View::Bresenham_line(CPoint p1,CPoint p2,COLORREF color){ //Bresenham算法画直线 CDC *cdc=GetDC(); long xa,xb,ya,yb,x,y,dx,dy,s1,s2,temp,change; //color=505; xa=p1.x; xb=p2.x; ya=p1.y; yb=p2.y; x=xa; y=ya; dx=abs(xb-xa); dy=abs(yb-ya); if((xb-xa)>0) s1=1; else s1=-1; if((yb-ya)>0) s2=1; else s2=-1; if(dy>dx) { temp=dx; dx=dy; dy=temp; change=1; } else change=0; int e=-dx; for(int i=0;i<dx;i++) { cdc->SetPixel(x,y,color); if(change==1) y+=s2; else x+=s1; e=e+2*dy; while(e>=0) { if(change==1) x+=s1; else y=y+s2; e=e-2*dx; } }}/////////////////////////////////////////////////////////////////// 高手请进,WinSock的IO模式问题。 图形拷贝问题 快到VISTA时代了,还需要看《WINDOWS核心编程》吗 高分!请问大虾这样的服务器应该采用什么技术? ----SDI程序图标现实问题---- 小问题 帮忙提供些资料,谢谢 ==== SDK 问题,怎样将自己的程序由后台设为前台 (UP 有分) ==== 有opengl的高手么? 我想不通的事情。 我的win2000是不是被黑了.(急,在线等待...) 我用vc写了一个dll,vb调用出现问题???
pDC->LineTo(m_2.x,m_2.y);
自己定义m_1,m_1为CPoint型
画圆的我也有。
非常感谢!
我非常需要不知道有没有画椭圆的算法我很想学图形学, 但不知道该从何学起,希望各位多多指点。
//point为圆心,r为半径,color为作图颜色.
{ //Bresenham算法画圆
int x,y,d,x0,y0;
x0=point.x;
y0=point.y;
x=0;
y=(int)r;
d=(int)r;
CDC *cdc;
cdc=GetDC();
cdc->SetPixel(point.x,point.y,color); //点亮圆心.
while(x<y)
{
cdc->SetPixel((x0+x),(y0+y),color);
cdc->SetPixel((x0+y),(y0+x),color);
cdc->SetPixel((x0+y),(y0-x),color);
cdc->SetPixel((x0+x),(y0-y),color);
cdc->SetPixel((x0-x),(y0-y),color);
cdc->SetPixel((x0-y),(y0-x),color);
cdc->SetPixel((x0-y),(y0+x),color);
cdc->SetPixel((x0-x),(y0+y),color);
if(d<0)
d+=4*x+6;
else
{ d+=4*(x-y)+10;
y--;
}
x++;
}
if(x==y)
{
cdc->SetPixel((x0+x),(y0+y),color);
cdc->SetPixel((x0+y),(y0+x),color);
cdc->SetPixel((x0+y),(y0-x),color);
cdc->SetPixel((x0+x),(y0-y),color);
cdc->SetPixel((x0-x),(y0-y),color);
cdc->SetPixel((x0-y),(y0-x),color);
cdc->SetPixel((x0-y),(y0+x),color);
cdc->SetPixel((x0-x),(y0+y),color);
}
cdc->SetPixel(point.x,point.y,bgcolor); //删除圆心.
ReleaseDC(cdc);
} //Bresenham_circle
///////////////////////////////////////////////////////////////////
void CMy003View::Bresenham_line(CPoint p1,CPoint p2,COLORREF color)
{ //Bresenham算法画直线
CDC *cdc=GetDC();
long xa,xb,ya,yb,x,y,dx,dy,s1,s2,temp,change;
//color=505;
xa=p1.x;
xb=p2.x;
ya=p1.y;
yb=p2.y;
x=xa; y=ya; dx=abs(xb-xa); dy=abs(yb-ya);
if((xb-xa)>0) s1=1; else s1=-1;
if((yb-ya)>0) s2=1; else s2=-1;
if(dy>dx)
{ temp=dx;
dx=dy;
dy=temp;
change=1;
}
else change=0;
int e=-dx;
for(int i=0;i<dx;i++)
{ cdc->SetPixel(x,y,color);
if(change==1) y+=s2;
else x+=s1;
e=e+2*dy;
while(e>=0)
{ if(change==1) x+=s1;
else y=y+s2;
e=e-2*dx;
}
}
}
///////////////////////////////////////////////////////////////////