1??對于這種問題,首先分析需求,
創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為杞縣等服務建站,杞縣等地企業(yè),進行企業(yè)商務咨詢服務。為杞縣企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
直線:
要畫直線,要的是什么,就是兩個點;
所以定義一個結構體
struct?point
{
int??x;
int??y;
}Ppline,Ppcircle;
畫圓:
那么需要一個圓心,和一個半徑;
圓心,通過上面的定義,可以獲得,半徑的話,直接傳遞參數(shù)就行了;
直線函數(shù):
int??paintline(Ppline??startpoint,Ppline?endpoint);
畫圓函數(shù):
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的程序
畫線的函數(shù)使用windows提供的API,MoveTo:移動到起點,LineToEx:移動到終點的這兩個函數(shù),是在OnPaint,或是響應WM_PAINT的消息的時候處理這兩個函數(shù);畫點的畫,使用SetPixel這個函數(shù),同樣也是在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);
畫一作從現(xiàn)行游標到點(x, y)的直線。
3.void far linerel(int dx, int dy);
畫一條從現(xiàn)行游標(x, y)到按相對增量確定的點(x+dx, y+dy)的直線。