① 求一用c語言畫直線的程序
C語言的話畫直線用MoveTo()和LineTo()很簡單啊。
幫你復制一份我學習時老師給的畫線兩例:
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函數的作用是用逐點比較法來畫一條直線
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
參數說明:x1,y1是起始點坐標,x2,y2是終止點,color是畫線的顏色
調用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*變數定義開始(2007/10/16增加)*/
int iTx; /*x軸終點的相對坐標xa或臨時變數*/
int iTy; /*y軸終點的相對坐標ya或臨時變數*/
int iDx; /*x軸方向的步長dx*/
int iDy; /*y軸方向的步長dy*/
int iFt; /*偏差Fm*/
int iSt; /*記數循環數(dx+dy)S*/
int iXt; /*x方向循環變數xm*/
int iYt; /*y方向循環變數ym*/
/*變數定義結束*/
/*變數初始化開始*/
/*如果是第三象限或第四象限則換成第一或第二象限*/
if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x軸的相對坐標*/
iTy=y2-y1; /*取y軸的相對坐標*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;; /*如果在第二象限,則x軸方向步長取負值*/
iXt=0;
iYt=0;
/*變數初始化結束*/
/*數據處理開始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小於0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大於或等於0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt<0) /*如果偏差小於0*/
{
iXt-=iDx; /*負x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大於或等於0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函數的作用是用來畫一條直線
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
參數說明:x1,y1是起始點坐標,x2,y2是終止點,color是畫線的顏色
調用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐標變數*/
int iY; /*y方向的坐標變數*/
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==x2&&y1==y2) /*如果終點和起始點相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
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 /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
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--;
}
}
}
}
② 想把結果輸出到txt:直線插補的一個程序
不清楚 數字積分法插補的細節,程序輸出到文件按下法。
void CShukongView::DDA_Line(CDC* pDC) 是MFC Doc-View 結構程序,改為普通的C程序,去掉繪圖語句。
您要給初值:
lst; lsx,lsy,lex,ley,lv;
程序 輸出 到 stdout.
你可轉向輸出 到 磁碟文件:
命令格式:
程序名.exe > abc.txt
輸出轉向到 文件 abc.txt
#include<windows.h>
#include<stdio.h>
#include <math.h>
void main ()
{
double xe,ye;
int n,i;
int jrx=0,jry=0,jvx,jvy;
double sx,sy,ex,ey;
char buf[50];
int lst=8;
double lsx=5.0,lsy=5.0,lex=100.0,ley=100.0,lv=3.0;
if(lst==0)
printf("re-eneter step\n");
else
{
// lsx,lsy,lex,ley
fprintf(stdout,"%d\n",(int)(lsx));
fprintf(stdout,"%d\n",(int)(lsy));
fprintf(stdout,"%d\n",(int)(lex));
fprintf(stdout,"%d\n",(int)(ley));
fprintf(stdout,"%d\n",(int)(lst));
xe=fabs(lex-lsx)/lst;
ye=fabs(ley-lsy)/lst;
for(n=2;(n<=xe)||(n<=ye);)
{
n=n*2;
}
jvx= (int)(xe);
jvy= (int)(ye);
sx=lsx;
sy=lsy;
ex=lex;
ey=ley;
fprintf(stdout,"sx=%lf sy=%lf ex=%lf ey=%lf\n",sx,sy,ex,ey);
if((lsx<=lex)&&(ley>=lsy))
for(i=0;i<=n;i++)
{
jrx=jrx+jvx;
jry=jry+jvy;
ex=(jrx/n)*lst+sx;
ey=(jry/n)*lst+sy;
// sx,sy,ex,ey
sx=ex;
sy=ey;
fprintf(stdout,"sx=%lf sy=%lf\n",sx,sy);
jrx=jrx%n;
jry=jry%n;
if(lv==1)
{
Sleep(200);
}
}
else if((lsx<=lex)&&(ley<lsy))
for(i=0;i<=n;i++)
{
jrx=jrx+jvx;
jry=jry+jvy;
ex=sx+(jrx/n)*lst;
ey=sy-(jry/n)*lst;
sx=ex;
sy=ey;
fprintf(stdout,"sx=%lf sy=%lf\n",sx,sy);
jrx=jrx%n;
jry=jry%n;
if(lv==1)
{
Sleep(200);
}
}
else if((lsx>lex)&&(ley>=lsy))
for(i=0;i<=n;i++)
{
jrx=jrx+jvx;
jry=jry+jvy;
ex=sx-(jrx/n)*lst;
ey=sy+(jry/n)*lst;
// sx,sy,ex,ey,5,RGB(0,128,0));
sx=ex;
sy=ey;
fprintf(stdout,"sx=%lf sy=%lf\n",sx,sy);
jrx=jrx%n;
jry=jry%n;
if(lv==1)
{
Sleep(200);
}
}
else if((lsx>lex)&&(ley<lsy))
for(i=0;i<=n;i++)
{
jrx=jrx+jvx;
jry=jry+jvy;
ex=sx-(jrx/n)*lst;
ey=sy-(jry/n)*lst;
// sx,sy,ex,ey,
sx=ex;
sy=ey;
fprintf(stdout,"sx=%lf sy=%lf\n",sx,sy);
jrx=jrx%n;
jry=jry%n;
if(lv==1)
{
Sleep(200);
}
}
fprintf(stdout,"sx=%lf sy=%lf\n",sx,sy);
}
}
③ 怎樣用C語言繪制直線
【C語言的用MoveTo()和LineTo()】
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函數的作用是用逐點比較法來畫一條直線
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
參數說明:x1,y1是起始點坐標,x2,y2是終止點,color是畫線的顏色
調用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*變數定義開始(2007/10/16增加)*/
int iTx; /*x軸終點的相對坐標xa或臨時變數*/
int iTy; /*y軸終點的相對坐標ya或臨時變數*/
int iDx; /*x軸方向的步長dx*/
int iDy; /*y軸方向的步長dy*/
int iFt; /*偏差Fm*/
int iSt; /*記數循環數(dx+dy)S*/
int iXt; /*x方向循環變數xm*/
int iYt; /*y方向循環變數ym*/
/*變數定義結束*/
/*變數初始化開始*/
/*如果是第三象限或第四象限則換成第一或第二象限*/
if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x軸的相對坐標*/
iTy=y2-y1; /*取y軸的相對坐標*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;; /*如果在第二象限,則x軸方向步長取負值*/
iXt=0;
iYt=0;
/*變數初始化結束*/
/*數據處理開始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小於0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大於或等於0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt<0) /*如果偏差小於0*/
{
iXt-=iDx; /*負x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大於或等於0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函數的作用是用來畫一條直線
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
參數說明:x1,y1是起始點坐標,x2,y2是終止點,color是畫線的顏色
調用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐標變數*/
int iY; /*y方向的坐標變數*/
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==x2&&y1==y2) /*如果終點和起始點相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
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 /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
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--;
}
}
}
}【能夠畫出任意斜率的直線演算法程序】
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;y<point[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].y>point[1].y){
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;<br> x++;<br> y--;<br> }
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(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;<br> x++;<br> y++;<br> }
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(x<point[1].x)
{
if(d<0){
d+=incrE;
y++;
}
else
{d+=incrNE;<br> pDC->SetPixel(x,y,50);<br> x++;<br> y++;<br> }
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(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;
}
else
{d+=incrNE;<br> x--;<br> y++;<br> }
pDC->SetPixel(x,y,50);
} }
}
④ 誰有用C語言編寫的直線,圓弧插補程序
/*************************************************************************
Function:intArcXY(doubledfx0,doubledfy0,doubledfrx,
doubledfry,intangle);
Description:在X-Y軸所構成的平面上,以圓弧運動的方式從目前位置經過指
定的參考點到目的點。調用此函數成功將增加運動命令的庫存數目。
Parameters:dfx0,dfy0參考點的X-Y軸座標值
dfrx,dfry圓心的X-Y軸座標值
angle插補角度
Calls:無
ReturnValue:大於或等於0給予此運動命令的編碼
小於0失敗,傳回值的意義可參考錯誤信息代碼
**************************************************************************/
#include<stdio.h>
#include<math.h>
intArcXY(doubledfx0,doubledfy0,doubledfrx,doubledfry,intangle);
intsymbol(doublenumber);
main()
{
ArcXY(0,0,-3,5,360);
getch();
}
intArcXY(doubledfx0,doubledfy0,doubledfrx,doubledfry,intangle)
{
FILE*f1;
doublei,j,dx,dy,dfr,x,y,ang,step,f=0.01;
intflag,tempx,tempy,statex,statey,direction=1;
dfr=sqrt((dfrx-dfx0)*(dfrx-dfx0)+(dfry-dfy0)*(dfry-dfy0));
if(dfx0==0)
{
dfx0=1;
dfrx=dfrx+1;
statex=1;
}
if(dfy0==0)
{
dfy0=1;
dfry=dfry+1;
statey=1;
}
dfrx=2*dfx0-dfrx;
i=dfx0-dfrx;
j=dfy0-dfry;
x=dfx0;
y=dfy0;
step=ang=180*2*asin(f/(2*dfr))/3.1415926;
if(((dfx0>0)&&(dfy0>0))||((dfx0<0)&&(dfy0<0)))
{
flag=direction;
}
if(((dfx0<0)&&(dfy0>0))||((dfx0>0)&&(dfy0<0)))
{
flag=-direction;
}
f1=fopen("c:\c.txt","w+");
if(statex==1)
{
x=x-1;
}
if(statey==1)
{
y=y-1;
}
fprintf(f1,"%f,",x);
fprintf(f1,"%f ",y);
while(ang<angle)
{
dx=f*(j+flag*(f*i)/(2*dfr))/dfr;
dy=f*(i-flag*(f*j)/(2*dfr))/dfr;
tempx=symbol(x);
tempy=symbol(y);
x=x+dx;
y=y+dy;
fprintf(f1,"%f,",x);
fprintf(f1,"%f ",y);
if((tempx!=symbol(x))||(tempy!=symbol(y)))
{
flag=-flag;
}
i=i-dx;
j=j+dy;
ang=ang+step;
}
return0;
}
intsymbol(doublenumber)
{
if(number>0)
{
return1;
}
else
{
return-1;
}
}
⑤ c語言直線插補程序,高手請進採納後追加20分
程序問題是自己檢查的,沒有人會跟你看程序。
你只要說明方法或者是流程圖。
你做的是直線逐點比較。
先砍掉插補程序,看能否畫劃線,在添加第一象限插補,最後全加上去。
確保每個步驟添加進去的代碼沒有問題。
⑥ 如何用C語言寫出空間圓弧或者空間直線插補運動
程序問題是自己檢查的,沒有人會跟你看程序。 你只要說明方法或者是流程圖。 你做的是直線逐點比較。 先砍掉插補程序,看能否畫劃線,在添加第一象限插補,最後全加上去。 確保每個步驟添加進去的代碼沒有問題。