當前位置:首頁 » 編程語言 » c語言走直線演算法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言走直線演算法

發布時間: 2022-08-24 15:31:27

❶ 利用c語言編寫 能夠畫出任意的直線演算法程序(利用畫點函數)

上次剛寫過,在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;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;
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(x<point[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(x<point[1].x)
{
if(d<0){
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(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;

}
else
{d+=incrNE;
x--;
y++;
}
pDC->SetPixel(x,y,50);
}

}

}

❷ C語言畫直線和填充的程序,要有演算法的

c 畫的指針式 Roma 表

#include <dos.h>
#include <stdio.h>
#include <math.h>
#include <graphics.h>

void drawhourbrick(int x, int y, int color, float arg);
void drawminutebrick(int x, int y, int color, float arg);
void drawsecondbrick(int x, int y, int color, float arg);
void polygon(int n, int x, int y, int r, int color, float arg, int fillstyle);

int main()
{
int GraphDriver;
int GraphMode;
float arg = 292.5;
float hourarg = 0;
float minuterarg = 0;
float secondrarg = 0;
char buffer[10];
int a, b;
int x, y, r;
int h;
int xmo[12] = {1, 2, -6, -1, -1, -2, -2, -1, 0, -4, -4, -5};
int ymo[12] = {-1, -2, -1, -1, -1, -5, 2, 1, -2, -4, -4, 0};
long delay;
float degree;
struct time time, time1;
GraphDriver = DETECT;
initgraph(&GraphDriver, &GraphMode, "");

x = 300;
y = 220;
r = 200;
degree = atan(1) / 45;

polygon(8, x, y, r, 12, arg, 0);
polygon(8, x, y, r - 2, 11, arg, 0);
polygon(8, x, y, r - 4, 14, arg, 0);

setcolor(12);

/*settextstyle(DEFAULT_FONT, 1, 0);*/
for (a = 0; a < 12; a++)
{
sprintf(buffer, "%d", a + 1);
outtextxy(x + (r - 22) * cos((a - 2) * 30 * degree) + xmo[a], y + (r - 22) * sin((a - 2) * 30 * degree) + ymo[a], buffer);
}
drawhourbrick(x, y, 14, hourarg);
drawminutebrick(x, y, 9, minuterarg);
drawsecondbrick(x, y, 13, secondrarg);

while(1)
{
gettime(&time);
if (time.ti_hour != time1.ti_hour || time.ti_min != time1.ti_min || time.ti_sec != time1.ti_sec)
{
h = time.ti_hour;
if (h > 12)
h -= 12;
drawhourbrick(x, y, 0, hourarg);
drawminutebrick(x, y, 0, minuterarg);
drawsecondbrick(x, y, 0, secondrarg);
hourarg = (h % 12) * 30 + time.ti_min * 0.5 + time.ti_sec * 0.1 / 60;
minuterarg = time.ti_min * 6 + time.ti_sec * 0.1;
secondrarg = time.ti_sec * 6;
setcolor(8);
outtextxy(x - 15, y + 120, "Roma");
drawhourbrick(x, y, 14, hourarg);
drawminutebrick(x, y, 9, minuterarg);
drawsecondbrick(x, y, 13, secondrarg);
time1 = time;
}
while(kbhit())
{
a = getch();
if (a == 27)
{
closegraph();
return 0;
}
}
}
}

void polygon(int n, int x, int y, int r, int color, float arg, int fillstyle)
{
double pi;
int i;
float x1[9], y1[9];

setcolor(color);

pi = atan(1) * 4;
arg = atan(1) / 45 * arg;
x1[1] = x + r * cos(2 * pi / n + arg);
y1[1] = y + r * sin(2 * pi / n + arg);
moveto(x1[1], y1[1]);
for (i = 2; i <= n; i++)
{
x1[i] = x + r * cos(2 * pi * i / n + arg);
y1[i] = y + r * sin(2 * pi * i / n + arg);
lineto(x1[i], y1[i]);
}
lineto(x1[1], y1[1]);

if (fillstyle != 0)
{
setfillstyle(SOLID_FILL, color);
floodfill(x, y, color);
}
}

void drawhourbrick(int x, int y, int color, float arg)
{
double pi;
int i;
float x1[4], y1[4];

setcolor(color);

pi = atan(1) / 45;
x1[0] = x;
y1[0] = y;
x1[1] = x + 20 * cos(pi * (arg - 90 - 23));
y1[1] = y + 20 * sin(pi * (arg - 90 - 23));
x1[2] = x + 25 * cos(pi * (arg - 90 + 23));
y1[2] = y + 25 * sin(pi * (arg - 90 + 23));
x1[3] = x + 120 * cos(pi * (arg - 90 + 0));
y1[3] = y + 120 * sin(pi * (arg - 90 + 0));
moveto(x1[1], y1[1]);
lineto(x1[0], y1[0]);
lineto(x1[2], y1[2]);
lineto(x1[3], y1[3]);
lineto(x1[1], y1[1]);

setfillstyle(SOLID_FILL, color);
/*
floodfill((x1[0] + x1[3]) / 2, (y1[0] + y1[3]) / 2, color);
*/
}

void drawminutebrick(int x, int y, int color, float arg)
{
double pi;
int i;
float x1[4], y1[4];

setcolor(color);

pi = atan(1) / 45;
x1[0] = x;
y1[0] = y;
x1[1] = x + 20 * cos(pi * (arg - 90 - 23));
y1[1] = y + 20 * sin(pi * (arg - 90 - 23));
x1[2] = x + 25 * cos(pi * (arg - 90 + 23));
y1[2] = y + 25 * sin(pi * (arg - 90 + 23));
x1[3] = x + 160 * cos(pi * (arg - 90 + 0));
y1[3] = y + 160 * sin(pi * (arg - 90 + 0));
moveto(x1[1], y1[1]);
lineto(x1[0], y1[0]);
lineto(x1[2], y1[2]);
lineto(x1[3], y1[3]);
lineto(x1[1], y1[1]);

setfillstyle(SOLID_FILL, color);
/*
floodfill((x1[0] + x1[3]) / 2, (y1[0] + y1[3]) / 2, color);
*/
}

void drawsecondbrick(int x, int y, int color, float arg)
{
double pi;
int i;
float x1[4], y1[4];

setcolor(color);

pi = atan(1) / 45;
x1[0] = x;
y1[0] = y;
x1[1] = x + 20 * cos(pi * (arg - 90 - 6));
y1[1] = y + 20 * sin(pi * (arg - 90 - 6));
x1[2] = x + 25 * cos(pi * (arg - 90 + 6));
y1[2] = y + 25 * sin(pi * (arg - 90 + 6));
x1[3] = x + 160 * cos(pi * (arg - 90 + 0));
y1[3] = y + 160 * sin(pi * (arg - 90 + 0));
moveto(x1[1], y1[1]);
lineto(x1[0], y1[0]);
lineto(x1[2], y1[2]);
lineto(x1[3], y1[3]);
lineto(x1[1], y1[1]);

setfillstyle(SOLID_FILL, color);
/*
floodfill((x1[0] + x1[3]) / 2, (y1[0] + y1[3]) / 2, color);
*/
}

❸ 求一用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--;
}
}
}
}

❹ 怎樣用C語言繪制直線

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)的直線。

❺ c語言求直線方程最簡式

intgcd(inta,intb){
intk;
if(a>b){
k=a;a=b;b=k;
}
while(1){
intk=a%b;
if(k==0)returnb;
a=b;
b=k;
}
}
voidsimplify(int*coef,int*out){
intg=gcd(coef[0],coef[1]);
out[0]=coef[0]/g;
g=coef[1]/g;
out[1]=-g;
out[2]=coef[2]*g;
if(out[0]==1)printf("x");
elseprintf("%dx",out[0]);
if(out[1]==-1)printf("-y");
elseprintf("%dy",out[1]);
printf("+%d=0 ",out[2]);
}

intmain()
{
intn=0,i;
intcoef[3],out[3];
charstr[256];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("y=%d/%dx+%d",&coef[0],&coef[1],&coef[2]);
simplify(coef,out);
}
return0;
}

❻ 求C語言編寫一個勻速直線運動物體,從一端運動到另一端。

#include <stdio.h>
#include <windows.h>
int main()
{
printf("\n\n");
for (int i=0;i<50;i++)
{
printf("=");
Sleep(80);//暫停一下,要不會一閃而過
printf("\b ");
}
printf("\n");
return 0;
}
//看看是不是要你的效果吧...

❼ 一道c語言題目 求大神指點下演算法

根據題意,隨機生成紅綠藍球任意個數,並任意順序排列。這里採用隨機數實現。

統計按紅綠藍順序排列最少交換次數,我的思路是:

第一步:循環將最後一個紅色球與最靠前的其它兩色球(並且滿足位置在紅球之前)交換。

第二步:循環將最後一個綠球與最靠前的藍球(必須在綠球之前)交換。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MR 5//每種顏色的球隨機生成的最大數量

void showList(int qs[],int len);

int jh(int qs[],int len);//返回交換次數

int main()

{

int i,len,qs[MR*3],n;

int r,g,b;//紅綠藍數量

srand(time(NULL));

r=rand()%MR+1;//1~MR的隨機數

g=rand()%MR+1;

b=rand()%MR+1;

len=r+g+b;

printf("隨機生成紅球%d個,綠球%d個,籃球%d個 ",r,g,b);

printf("開始隨機排列。。。。。。 ");

for(i=0;i<len;i++)

{

n=rand()%3+1;//位置採取抽簽,生成1~3的隨機數,1表示紅,2表示綠,3表示藍

switch(n)

{

case 1:

if(r>0) qs[i]=n,r--;

else i--;

break;

case 2:

if(g>0) qs[i]=n,g--;

else i--;

break;

case 3:

if(b>0) qs[i]=n,b--;

else i--;

break;

}

}

printf("隨機排列後的隊列情況為: ");

showList(qs,len);

printf(" ");

jh(qs,len);

return 0;

}

int jh(int qs[],int len)//返回交換次數

{

int cnt=0;

int jhbl(int qs[],int len,int lq,int bq);

//最後的紅和最前的綠或藍(且綠球或籃球位置在紅球之前)交換

cnt+=jhbl(qs,len,1,0);

//最前的籃球和最後的綠球交換

cnt+=jhbl(qs,len,2,3);

printf("總交換次數至少%d: ",cnt);

return cnt;

}

int jhbl(int qs[],int len,int lq,int bq)//lq:交換中最靠後的球色編號(1~3),bq:交換中最靠前的球色編號(1~3),bq=0:lq與其他兩種顏色任意交換

{

int i,j,qSave,cnt=0;

for(i=len-1;i>=0;i--)

{

if(qs[i]==lq)

{

for(j=0;j<len;j++)

if(((bq==0 && qs[j]!=lq)||(bq!=0 && qs[j]==bq)) && j<i)

{

printf("第%d個%s%s%s與第%d個%s%s%s交換,交換後(交換%d次): ",i+1,lq==1?"紅球":"",lq==2?"綠球":"",lq==3?"藍球":"",j+1,qs[j]==1?"紅球":"",qs[j]==2?"綠球":"",qs[j]==3?"藍球":"",cnt+1);

qSave=qs[j],qs[j]=qs[i];qs[i]=qSave,cnt++;

showList(qs,len);

printf(" ");

i=len-1;

break;

}

}

}

return cnt;

}

void showList(int qs[],int len)

{

int i;

for(i=0;i<len;i++)

printf("%s%s%s ",qs[i]==1?"紅":"",qs[i]==2?"綠":"",qs[i]==3?"藍":"");

printf(" ");

}

❽ 誰有用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;
}
}