直線:Ax+By+C=0
成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗。創(chuàng)新互聯(lián)多年互聯(lián)網(wǎng)經(jīng)驗,見的多,溝通容易、能幫助客戶提出的運營建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇創(chuàng)新互聯(lián),不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價值服務(wù)。
兩點:A(Xa,Ya),B(Xb,Yb)
typedef struct
{
volatile float A;
volatile float B;
volatile float C;
} line_t;
void lineFun(float Xa,float Ya, float Xb,float Yb,line_t *line)
{
line-A = Yb - Ya;
line-B= Xa - Xb;
line-C = Xb * Ya - Xa * Yb;
}
上次剛寫過,在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);
}
}
}
這是我自己編的一個程序仿真通過,控制核心板是51單片機可以參考:
//第一象限順弧
#includereg51.h
//#define xe 10 //終點橫坐標(biāo)
//#define ye 0 //終點縱坐標(biāo)
//#define x0 10 //起點橫坐標(biāo)
//#define y0 0 //起點縱坐標(biāo)
//#define R 10 //半徑
void xzRotateStep(); // X向走一步
void yzRotateStep(); // -x向走一步
void xfRotateStep(); // y向走一步
void yfRotateStep(); // -y向走一步
void d1shun(); //第一象限順弧
void d4shun(); //第二象限順弧
void d3shun(); //第三象限順弧
void d2shun(); //第四象限順弧
int kx=0x01; int ky=0x10; //
/*延時函數(shù)*/
void display(int x)
{
int i,y;
for(i=x;i0;i--)
for(y=100;y0;y--);
}
void main()
{
d1shun();
d4shun();
d3shun();
d2shun();
}
void d1shun()
{
int F,xi,yi,count ;// (xi,yi)為動點坐標(biāo),F(xiàn)為偏差值,count為計數(shù)值。
int k=0;
int kx=
F=xi=0;
yi=10;
count=20;
do{
if(F=0)
{
yfRotateStep(); //-y向走一步
F=F-2*yi+1;
xi=xi;
yi=yi-1;
}
else
{
xzRotateStep(); //+x向走一步
F=F+2*xi+1;
xi=xi+1;
yi=yi;
}
count--; k++;
P2=k;
}
while(count) ; //計數(shù)為0?
}
void d4shun()
{
int F,xi,yi,count ;// (xi,yi)為動點坐標(biāo),F(xiàn)為偏差值,count為計數(shù)值。
int k=0;
F=xi=10;
yi=0;
count=20;
do{
if(F=0)
{
xfRotateStep(); //-x向走一步
F=F-2*xi+1;
xi=xi-1;
yi=yi;
}
else
{
yfRotateStep(); //-y向走一步
F=F+2*yi+1;
xi=xi;
yi=yi+1;
}
count--; k++;
P2=k;
}
while(count) ; //計數(shù)為0?
}
void d3shun()
{
int F,xi,yi,count ;// (xi,yi)為動點坐標(biāo),F(xiàn)為偏差值,count為計數(shù)值。
int k=0;
F=xi=0;
yi=-10;
count=20;
do{
if(F=0)
{
yzRotateStep(); //+y向走一步
F=F-2*yi+1;
xi=xi;
yi=yi-1;
}
else
{
xfRotateStep(); //-x向走一步
F=F+2*xi+1;
xi=xi+1;
yi=yi;
}
count--; k++;
P2=k;
}
while(count) ; //計數(shù)為0?
}
void d2shun()
{
int F,xi,yi,count ;// (xi,yi)為動點坐標(biāo),F(xiàn)為偏差值,count為計數(shù)值。
int k=0;
F=xi=-10;
yi=0;
count=20;
do{
if(F=0)
{
xzRotateStep(); //-x向走一步
F=F-2*xi+1;
xi=xi-1;
yi=yi;
}
else
{
yfRotateStep(); //-y向走一步
F=F+2*yi+1;
xi=xi;
yi=yi+1;
}
count--; k++;
P2=k;
}
while(count) ; //計數(shù)為0?
}
void xzRotateStep()
{
int i;
switch(kx)
{
case 0x01: kx=P1=0x02;display(200);for(i=0;i20000;i++); break;
case 0x02: kx=P1=0x04;display(200);for(i=0;i20000;i++) ;break;
case 0x04: kx=P1=0x01;display(200);for(i=0;i20000;i++) ;break;
}
}
void xfRotateStep()
{
int i;
switch(kx)
{
case 0x01: kx=P1=0x04;display(200);for(i=0;i20000;i++); break;
case 0x04: kx=P1=0x02;display(200);for(i=0;i20000;i++) ;break;
case 0x02: kx=P1=0x01;display(200);for(i=0;i20000;i++) ;break;
}
}
void yzRotateStep()
{
int j ;
switch(ky)
{
case 0x10: ky=P1=0x20;display(200);for(j=0;j20000;j++);break;
case 0x20: ky=P1=0x40;display(200);for(j=0;j20000;j++);break;
case 0x40: ky=P1=0x10;display(200);for(j=0;j20000;j++);break;
}
}
void yfRotateStep()
{
int j ;
switch(ky)
{
case 0x10: ky=P1=0x40;display(200);for(j=0;j20000;j++);break;
case 0x40: ky=P1=0x20;display(200);for(j=0;j20000;j++);break;
case 0x20: ky=P1=0x10;display(200);for(j=0;j20000;j++);break;
}
}
C語言的話畫直線用MoveTo()和LineTo()很簡單啊。
幫你復(fù)制一份我學(xué)習(xí)時老師給的畫線兩例:
#includegraphics.h
#includemath.h
/*
###############################################################################
功 能:本函數(shù)的作用是用逐點比較法來畫一條直線
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
參數(shù)說明:x1,y1是起始點坐標(biāo),x2,y2是終止點,color是畫線的顏色
調(diào)用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*變量定義開始(2007/10/16增加)*/
int iTx; /*x軸終點的相對坐標(biāo)xa或臨時變量*/
int iTy; /*y軸終點的相對坐標(biāo)ya或臨時變量*/
int iDx; /*x軸方向的步長dx*/
int iDy; /*y軸方向的步長dy*/
int iFt; /*偏差Fm*/
int iSt; /*記數(shù)循環(huán)數(shù)(dx+dy)S*/
int iXt; /*x方向循環(huán)變量xm*/
int iYt; /*y方向循環(huán)變量ym*/
/*變量定義結(jié)束*/
/*變量初始化開始*/
/*如果是第三象限或第四象限則換成第一或第二象限*/
if(y2y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x軸的相對坐標(biāo)*/
iTy=y2-y1; /*取y軸的相對坐標(biāo)*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx0)iSt=-1*iTx+iTy;; /*如果在第二象限,則x軸方向步長取負值*/
iXt=0;
iYt=0;
/*變量初始化結(jié)束*/
/*數(shù)據(jù)處理開始*/
while(iSt0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx=0) /*如果在第一象限*/
{
if(iFt0) /*如果偏差小于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大于或等于0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt0) /*如果偏差小于0*/
{
iXt-=iDx; /*負x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大于或等于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函數(shù)的作用是用來畫一條直線
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
參數(shù)說明:x1,y1是起始點坐標(biāo),x2,y2是終止點,color是畫線的顏色
調(diào)用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐標(biāo)變量*/
int iY; /*y方向的坐標(biāo)變量*/
int iTx; /*x方向的步長變量*/
int iTy; /*y方向的步長變量*/
float fDx; /*x方向的差分變量*/
float fDy; /*y方向的差分變量*/
float fMinf; /*算法中的f*/
float fMaxF; /*算法中的F*/
float fS; /*終點判斷變量*/
fMinf=0.5; /*f=0.5*/
iX=x1;
iY=y1;
putpixel(x1,y1,color);
if(x1==x2y1==y2) /*如果終點和起始點相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx0)iTx=-1;
if(fDy0)iTy=-1;
fS=fDx0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF1) /*如果F1*/
{
fS+=fDy0?fDy:(-fDy);
while(fS0)
{
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fMinf+=1/fMaxF; /*f=f+1/F*/
fS--;
if(fMinf=1) /*如果f=1*/
{
iX+=iTx; /*x方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
else /*如果F1*/
{
fS+=fDy0?fDy:(-fDy);
while(fS0)
{
iX+=iTx; /*x方向走一步*/
putpixel(iX,iY,color);
fMinf+=fMaxF; /*f=f+F*/
fS--;
if(fMinf=1) /*如果f=1*/
{
iY+=iTy; /*y方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
}