❶ 利用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;
}
}