c语言平曲线
TC下调试通过
/*******************************************************
*Author :Wacs5
*Date :20090105(YYYY-MM-DD)
*Function :画简易的曲线图 *********************************************************/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <Graphics.h>
#define n 8
int main()
{
int i,j;
float data[]={7,3,12,6,9,5,8,11};
char str[40];
int gdrive=DETECT,gmode,errorcode;
int maxx,maxy;
int perx,pery;
int x0,x1,y0,y1;
int coloraxis=2,colorline=3;
float mindata,maxdata,ndata;
initgraph(&gdrive,&gmode,""); /*初始化设备*/
if ((errorcode=graphresult())!=grOk) /*查错*/
{
printf("Graphics error:%s\nPress any key to exit:",grapherrormsg(errorcode));
getch();
exit(1);
}
maxx=getmaxx();
maxy=getmaxy();
mindata=maxdata=data[0];
for (i=1;i<n;i++)
{
if (mindata>data[i])
mindata=data[i];
if (maxdata<data[i])
maxdata=data[i];
}
mindata=floor(mindata);
maxdata=ceil(maxdata);
perx=maxx/(n+4);
pery=maxy/(maxdata-mindata+4);
x0=2*perx;
y0=maxy-2*pery;
x1=maxx-2*perx;
y1=2*pery;
setcolor(coloraxis);
line(x0,y0,x1,y0);
line(x0,y0,x0,y1);
line(x1,y0,x1-4,y0+3);
line(x1,y0,x1-4,y0-3);
line(x0,y1,x0+3,y1+4);
line(x0,y1,x0-3,y1+4);
settextjustify(CENTER_TEXT,TOP_TEXT);
for (i=0;i<n;i+=n/3)
{
j=x0+i*perx;
line(j,y0,j,y0+2); /*刻度线*/
sprintf(str,"%d",i);
outtextxy(j,y0+4,str);
}
settextjustify(RIGHT_TEXT,CENTER_TEXT);
for (i=(maxdata-mindata)/3;i<=maxdata-mindata;i+=(maxdata-mindata)/3)
{
j=y0-i*pery;
line(x0,j,x0-2,j); /*刻度线*/
sprintf(str,"%d",(int)mindata+i);
outtextxy(x0-4,j,str);
}
setcolor(colorline);
x1=x0+perx;
y1=y0-(data[0]-mindata)*pery;
circle(x1,y1,2);
moveto(x1,y1);
i=1;
do
{
x1+=perx;
y1=y0-(data[i]-mindata)*pery;
lineto(x1,y1);
circle(x1,y1,2);
moveto(x1,y1);
i++;
}while(i<n);
getch();
closegraph();
return 0;
}
B. 用C语言绘制曲线
楼上的观珠仔很久不见啦(挺挂念那段时光的)!想不到路过此地看到你,这是高科技呀?你还这么老班牙啊,大考小考把你弄糊涂了,高考顺利呀!别忘了我这位老兄了,C语言略懂 ~~~~~~杰
1.绘制余弦曲线
*程序说明与注释
#include<stdio.h>
#include<math.h>
void main()
{
double y;
int x,m;
for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/
{
m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/
for(x=1;x<m;x++) printf(" ");
printf("*"); /*控制打印左侧的 * 号*/
for(;x<62-m;x++)printf(" ");
printf("*\n"); /*控制打印同一行中对称的右侧*号*/
}
}
*运行结果
2.绘制正弦曲线
在屏幕上用“*”显示0-360度的余弦函数sin(x)曲线。
1.
/**//*
sin() line.
62 of line width
*/
#include <stdio.h>
#include <math.h>
int main(void)
...{
int j ,k,d,h;
double i ;
for(i=1.0 ; i> 0.0; i-=0.1)
...{
k = (int)(asin(i)*10) ;
for(j=0; j< k ; j++) /**//*print the left */
printf(\" \");
printf(\"*\");
for( ; j< 31-k ; j++)
printf(\" \");
C. C语言曲线拟合原理
虽然我知道什么是曲线拟合,怎么做,但是我不清楚你问题的具体内容,
从chuaike24的回答
“请高手 说实话 我是菜鸟 但你的程序感觉好凌乱 好多地方可以精简说最明显的问题 power函数返回值无论怎样都返回0 ”来看,我可能是没看到你的程序,所以信息不全。
我只回答什么是曲线拟合
曲线拟合,简单来说,是指以近似的方法用一条曲线逼近一组数据点。
逼近的方法最常用的事最小二乘法,当然也有其他方法。
逼近的曲线可以是直线,也可以是多项式曲线,二次,三次,多次,也可以是分段多项式曲线,也可以是B样条曲线。在这里,如果不需要深入研究,你只要把B样条曲线理解为一种近似于分段多项式曲线即可。
你问的不多,这些对你的回答已经足够,需要深入了解再问
D. 采用c语言绘制任意函数曲线(双曲线,二次函数,一次函数)怎么做
在c的标准库中有graphic.h头文件,实现了很多画图函数 比如 lineto, moveto, arc,(函数名可能记错,好久没用了-.-!)
直线:起点加终点就行。
二次曲线,比如抛物线,那就以定长拆分成小直线。双曲线同理。
抛物线,和双曲线用定长拆分,估计很难计算。要是精度要求不高就根据情况改成定x,或者定y偏移的拆分,要是精度要求高那就去找直线拟合曲线的算法或者双圆弧拟合曲线的算法。
E. C语言绘制而次函数曲线~~高手请进~~~!!!
我又试了一下 还是可以运行,输入a,b,c 也可以的 。 运行后,屏幕左上角不是有三个值输入输出的显示吗
你所说的“无法输入a b c的值”能不能说的再具体一些。
#include<graphics.h>
#define BKC 9
#define COLOR 8 /* 抛物线颜色*/
main()
{int gd=DETECT,gm,p=1,i;
double a,b,c,x,y,x1,y1,t;
char ch;
initgraph(&gd,&gm,"");
while(p==1) /*主循环体*/
{
setbkcolor(BKC);
setcolor(14);
setlinestyle(0,0,1);
rectangle(0,0,639,479); /*画边框*/
line(20,460,639,460); /*画横坐标*/
line(20,0,20,460); /*画纵坐标*/
/* outtextxy(8,467,"-180");*/
setlinestyle(1,0,1);
setcolor(15);
for(i=20;i<640;i+=20)line(i,460,i,0);
for(i=460;i>0;i-=20)line(20,i,640,i);
setcolor(12);
setlinestyle(SOLID_LINE,0,3);
line(300,460,300,0);
line(0,360,640,360);
setcolor(15);
gotoxy(1,1);
printf("Please Enter a:" );
scanf("%lf",&a);
printf("Please Enter b:" );
scanf("%lf",&b);
printf("Please Enter c:" );
scanf("%lf",&c);
gotoxy(300,440);
printf("y= %5.2f *x^2 + %5.2f *x + %5.2f ",a,b,c);
setlinestyle(SOLID_LINE,0,1);
moveto(200,460-(a*(0-100)*(0-100)+b*(0-100)+c+100));
for(t=0.0;;t+=0.0002)
{
x=t+200;
y=a*(t-100)*(t-100)+b*(t-100)+c+100;
x1=x; /*画笔定位在用户坐标原点 (200,460) */
y1=460-y;
if(x1>640.0||x1<0||x>640) break;
if(y1<=480.0 &&y<=480) lineto(x1,y1);
}
setcolor(12);
outtextxy(250,8,"Finished! Continue(Y/N)?");
p=-1;
while(p==-1)
{
ch=getch();
if(ch=='y'||ch=='Y') { cleardevice();p=1;}
else if(ch=='n'||ch=='N') p=0;
else outtextxy(220,200,"ERROR! Please Press 'Y' or 'N'_" );
}
}
closegraph();
}
F. 怎么用C语言把一个函数的曲线画出来
c语言中表达n次方可以用pow函数。
函数原型:double
pow(double
x,
double
y)
功
能:计算x^y的值
返
回
值:计算结果
举例:
double
a;a
=
pow(3.14,
2);
//
计算3.14的平方,并将结果保存在变量a中
注:使用pow函数必须将头文件#include包含进源文件中
G. 请教:如何用c语言画曲线
最简单的办法是对区域均匀划分,计算各点的函数值,然后把这些点用直线连接起来。例如,下面是绘制正弦曲线:
moveto(0, 100);
for (i=0; i<=100;i++)
lineto(i, 100 + 100 *sin(M_PI * 2/100.0*i));
但是用直线连接起来不够平滑,也有一些插值方法进行改进。比如采用不等间隔划分区域,或把曲线使用一段段的二次、三次曲线连接起来。你可以参考清华大学出版社出版的《C语言常用算法程序集》
H. C语言线性曲线拟合
可以直接在线进行拟合,下面是地址(已验证)
http://3.14159.biz/math/Fit.html
建议你直接对数据用Matlab的cftool拟合(可以自由的自定义拟合函数形式)
I. 求教:用C语言怎么实现实时曲线
可以利用 GLUT 程序包 (OpenGL 功能) 动态绘图,例如,一边实时采样,一边显示。
简单的实时曲线可以用 固定 坐标,x 时间轴,y1, y2, ..yn 为实时量,例如 温度,压力,速度..., 用 沿 x 移动的 一根垂线, 表示当前时间分界点,左边的已更新,但垂线移动到x 最右端时,更新 x 坐标刻度,垂线 在从 最左端开始,绘制 新的时段数值。
另一种方法是 固定 x 轴 总时段长度,但是不断更新 x 轴 刻度 和 yi 数据,使整段曲线看上去 是 从右向左 光滑移动动。
参数设置,显示,采样控制等,都 可以在屏幕上用按钮,Text 等 实现。
直接用 OpenGL 则需 用 c++ 程序,MFC + OpenGL 之类 实现。
J. 用C语言平滑曲线中的突起
b[y-2] b[y-1] b[y] b[y+1] b[y+2]
if(b[y]相比b[y-1]与b[y+1]的平均值差的太大)
{
if(b[y]相比b[y-2]与b[y+2]的平均值差的太大)
{
if(b[y]相比b[y-3]与b[y+3]的平均值差的太大)
去掉b[y];
}
}
前提是前3个数不是奇点;而且不会连续出现3个奇点;则第4个数开始可以把奇点去掉;
