扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
C语言的话画直线用MoveTo()和LineTo()很简单啊。
创新互联专注于企业营销型网站、网站重做改版、龙凤网站定制设计、自适应品牌网站建设、H5响应式网站、商城网站开发、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为龙凤等各大城市提供网站开发制作服务。
帮你复制一份我学习时老师给的画线两例:
#includegraphics.h
#includemath.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(y2y1)
{
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(iTx0)iSt=-1*iTx+iTy;; /*如果在第二象限,则x轴方向步长取负值*/
iXt=0;
iYt=0;
/*变量初始化结束*/
/*数据处理开始*/
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--;
}
}
/*
###############################################################################
功 能:本函数的作用是用来画一条直线
格 式: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==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--;
}
}
}
}
#include头文件这个库中有函数exp(x)相信能满足您的要求cmath是c++语言中的库函数,其中的c表示函数是来自c标准库的函数,math为数学常用库函数。cmath库函数列表:C语言提供了以下的数学函数,要使用这些函数时,在程序文件头必须加入:#include编译时,必须加上参数「-lm」(表示连结至数学函式库),例如「gcc-lmtest.c」。函数之自变量与传回之值型别见自变量或函数前之型别宣告。函数已经在「math.h」或其它标头档宣告过了,因此在使用时不必再加型别宣告,例如「y=sin(x);」,不用写成「y=doublesin(doublex);」。函数说明:using::abs;//绝对值using::acos;//反余弦using::acosf;//反余弦using::acosl;//反余弦using::asin;//反正弦using::asinf;//反正弦using::asinl;//反正弦using::atan;//反正切using::atan2;//y/x的反正切using::atan2f;//y/x的反正切using::atan2l;//y/x的反正切using::atanf;//反正切using::atanl;//反正切using::ceil;//上取整using::ceilf;//上取整using::ceill;//上取整using::cos;//余弦using::cosf;//余弦using::cosh;//双曲余弦using::coshf;//双曲余弦using::coshl;//双曲余弦using::cosl;//余弦using::exp;//指数值using::expf;//指数值using::expl;//指数值using::fabs;//绝对值using::fabsf;//绝对值using::fabsl;//绝对值using::floor;//下取整using::floorf;//下取整using::floorl;//下取整using::fmod;//求余using::fmodf;//求余using::fmodl;//求余using::frexp;//返回value=x*2n中x的值,n存贮在eptr中using::frexpf;//返回value=x*2n中x的值,n存贮在eptr中using::frexpl;//返回value=x*2n中x的值,n存贮在eptr中using::ldexp;//返回value*2exp的值using::ldexpf;//返回value*2exp的值using::ldexpl;//返回value*2exp的值using::log;//对数using::log10;//对数using::log10f;//对数using::log10l;//对数using::logf;//对数using::logl;//对数using::modf;//将双精度数value分解成尾数和阶using::modff;//将双精度数value分解成尾数和阶using::modfl;//将双精度数value分解成尾数和阶using::pow;//计算幂using::powf;//计算幂using::powl;//计算幂using::sin;//正弦using::sinf;//正弦using::sinh;//双曲正弦using::sinhf;//双曲正弦using::sinhl;//双曲正弦using::sinl;//正弦using::sqrt;//开方using::sqrtf;//开方using::sqrtl;//开方using::tan;//正切using::tanf;//正切using::tanh;//双曲正切using::tanhf;//双曲正切using::tanhl;//双曲正切using::tanl;//正切
inline float cosf(float _X) ——MSDN中的函数原型,也是求弧度值的余弦值。就是指针对flaot型的!是cos()的一个特例。建议使用cos()有多种重载形式,可保证无错!好运!
在单片机,ARM的裸机上,汇编真的比C精准。每条汇编指令用几个机器周期都是确定的,你用汇编写个排序算法用多少毫秒都是可以算出来的。
但是一旦上了操作系统,特别是分时的Windows,即使是汇编程序,也会变得“不精准”。
说C语言“不精准”,主要是编译器怎么生产汇编指令对你是透明的。你不知道你的C代码会编译成怎样的汇编代码。
以上是有关运行时间的问题。再看浮点计算的精度。
这个两者是完全一致的:加入你用汇编求sinx,cosx的值,你会使用fsin fcos这些指令。如果你用C语言,Math.h中的sinf cosf函数最终都是通过相同的汇编指令完成的。所以二者计算机过完全一致。你还能通过编译器选项,使调用过程内联不转跳,于是在效率上和汇编就一样了。
但是汇编在特别极端的情况下的却能优化计算速度,还是以求三角函数为例,在很多场合都需要同时求出正弦与余弦,Math.h中的函数必须两次调用,但却有指令fsincos能同时算出二者,且速度与单独计算fsin或者fcos是一样的。
总之,只要你的不是特别底层,特别最求速度的事情,汇编的精确性很难体现出来。
/*1)*/#include stdio.h
#include math.h
#include conio.h
main()
{
float x,y;
printf("X=");
scanf("%f",x);
if(x=0)
y=sinf(x)+cosf(x)/2;
else
y=sinf(x)-cosf(x)/2;
printf("Y=%f",y);
getch();
}/*---------------------*//*2)*/#include stdio.h
#include math.h
#include conio.h
main()
{
int i,j,res;
for(i=1;i=9;i++)
{
for(j=1;j=i;j++)
{
res=i*j;
printf("%d*%d=%d ",i,j,res);
}
printf("\n");
}
getch();
}/*------------------------------------*//*3*/#include stdio.h
#include conio.h
main()
{
int i,j,tmp,n,num[11];
printf("Input 10 integer:");
for(i=0;i10;i++)
scanf("%d",num[i]);
num[10]=9999; /*临时赋予第10个元素一个大值*/
for(j=9;j0;j--) /*冒泡法从小到大排序*/
{
for(i=0;i10;i++)
{
n=0;
if(num[i]num[i+1])
{
tmp=num[i+1];
num[i+1]=num[i];
num[i]=tmp;
n++;
}
}
}
for(i=0;i10;i++) /*显示排序后的数组前10项*/
printf("%d ",num[i]);
printf("\nInput an integer:");
scanf("%d",n);
for(i=0;i10;i++)
{
if(nnum[i])
break;
}
for(j=10;ji;j--)
{
num[j]=num[j-1];
}
num[i]=n;
for(i=0;i11;i++)
{
printf("%d,",num[i]);
}
getch();
}
#includecmath这个库包含exp(x)函数,可以解决此问题。
1.打开vc++6.0编译器,如图所示选择新函数。
2.在新函数中选择文件,然后选择c/c++头文件,然后在正确的文件名中输入要使用的头文件名**。
3.在新的头文件中输入你的头代码(如图所示是我刚写的一个调用函数),键入代码后,点击左上角保存。
4.找到新的头文件,复制或移动到VC98\Include目录下的vc++6.0安装目录。
5.再次打开vc++创建一个新的C语言文件,如下图所示,选择该文件,选择C/c++源文件,输入文件名**。C(记得带文件扩展名。C),确认。
6.在新的c文件中输入代码,并声明您在预处理命令中编写的用于调用头库的头文件的名称。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流