1 对于这种问题,首先分析需求,
创新互联于2013年创立,先为杞县等服务建站,杞县等地企业,进行企业商务咨询服务。为杞县企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
直线:
要画直线,要的是什么,就是两个点;
所以定义一个结构体
struct point
{
int x;
int y;
}Ppline,Ppcircle;
画圆:
那么需要一个圆心,和一个半径;
圆心,通过上面的定义,可以获得,半径的话,直接传递参数就行了;
直线函数:
int paintline(Ppline startpoint,Ppline endpoint);
画圆函数:
int paintcircle(Ppcircle centerpoint,int r);
上次刚写过,在VC下运行的,
int dx,dy,incrE,incrNE,d,x,y;
if ((point[1].x-point[0].x)==0){ //垂直的直线
x=point[0].x;
for(y=point[0].y;ypoint[1].y;y++)
pDC-SetPixel(x,y,50);
}
else if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))=1){ //斜率 -1到 1 之间
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=dx-2*dy;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC-SetPixel(x,y,50);
if(point[0].ypoint[1].y){
while(xpoint[1].x)
{
if(d=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y--;
}
pDC-SetPixel(x,y,50);
}
}
else if(point[0].y=point[1].y){
dy=point[1].y-point[0].y;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC-SetPixel(x,y,50);
while(xpoint[1].x)
{
if(d=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y++;
}
pDC-SetPixel(x,y,50);
}
}
}
else { //斜率 -1 和 1的直线
if(point[1].x=point[0].x){
dx=point[1].x-point[0].x;
dy=point[1].y-point[0].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC-SetPixel(x,y,50);
while(xpoint[1].x)
{
if(d0){
d+=incrE;
y++;
}
else
{d+=incrNE;
pDC-SetPixel(x,y,50);
x++;
y++;
}
pDC-SetPixel(x,y,50);
}
}
else if((point[1].y-point[0].y)/(point[1].x-point[0].x)-1){
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC-SetPixel(x,y,50);
while(ypoint[1].y)
{
if(d0){
d+=incrE;
y++;
}
else
{d+=incrNE;
x--;
y++;
}
pDC-SetPixel(x,y,50);
}
}
}
包含windows.h,里面有一个SetPixel方法,画线常用算法有三种dda,中点画线Bresenham画线-_-
刚把三种都写了下
void CDDALineView::drawDDALine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
float deltax, deltay, x, y;
int steps = max(abs(x1 - x0), abs(y1 - y0));
deltax = (x1 - x0) / steps;
deltay = (y1 - y0) / steps;
x = x0;
y = y0;
pDC-SetPixel((int)(x + 0.5) , (int)(y + 0.5), color);
for(int i = 0; i steps; i++)
{
x += deltax;
y += deltay;
pDC-SetPixel((int)(x + 0.5), (int)(y + 0.5), color);
}
}
//preCondition:x0 x1
void CDDALineView::MidpointLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
int a = y0 - y1;
int b = x1 - x0;
int c = x0 * y1 - x1 * y0;
float d, d1, d2;
d = 2 * a + b;
d1 = 2 * a;
d2 = 2 * (a + b);
int x = x0, y = y0;
pDC-SetPixel(x, y, color);
while(x x1)
{
if(d 0)
{
x++;
y++;
d+=d2;
}
else{
x++;
d+=d1;
}
pDC-SetPixel(x, y, color);
}
}
void CDDALineView::BresenhamLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
int x, y, dx, dy;
dx = x1 - x0;
dy = y1 - y0;
float k = dy / dx;
x = x0;
y = y0;
float e = -0.5;
for(int i = 0; i = dx; i++)
{
pDC-SetPixel(x, y, color);
x++;
e+=k;
if(e = 0)
{
y++;
e-=1;
}
}
}
仅供参考
这个不管怎么说不是最开始的控制台的程序,这个新建工程的时候需要选择的是Win32的程序
画线的函数使用windows提供的API,MoveTo:移动到起点,LineToEx:移动到终点的这两个函数,是在OnPaint,或是响应WM_PAINT的消息的时候处理这两个函数;画点的画,使用SetPixel这个函数,同样也是在WM_PAINT的消息中去处理与画图有关的操作的
1.void far line(int x0, int y0, int x1, int y1);
画一条从点(x0, y0)到(x1, y1)的直线。
2.void far lineto(int x, int y);
画一作从现行游标到点(x, y)的直线。
3.void far linerel(int dx, int dy);
画一条从现行游标(x, y)到按相对增量确定的点(x+dx, y+dy)的直线。