⑴ 请问怎么用c语言画出希尔伯特曲线呢
#include<graphics.h>
#include<conio.h>
intg_len; //Hilbert曲线的单位长度
//递归绘制Hilbert曲线
voidhilbert(LPCTSTRcmd,intlevel)
{
staticBYTEd=0; //方向
staticPOINTc[4]={1,0,0,-1,-1,0,0,1}; //方向对应的轴系数
if(level<0)return;
//处理命令字符串
inti=0;
while(cmd[i])
{
switch(cmd[i++])
{
case'+': d=(d+1)&3; break;
case'-': d=(d-1)&3; break;
case'X': hilbert("+YF-XFX-FY+",level-1); break;
case'Y': hilbert("-XF+YFY+FX-",level-1); break;
case'F': linerel(c[d].x*g_len,c[d].y*g_len); break;
}
}
}
//主函数
voidmain()
{
//设置绘图环境
initgraph(800,600); //设置窗口大小
outtextxy(20,550,"按1~8显示不同级别的Hilbert曲线,按ESC退出。");
rectangle(143,23,657,537); //绘制表示范围的矩形框
setorigin(144,24); //设置原点坐标
setcolor(RED); //设置颜色
setfillstyle(BLACK);
intlevel='5'; //设置初始级别
do
{
if(level>='1'&&level<='8') //仅处理1~8
{
level-='0'; //转换为对应的数字值
bar(0,0,511,511); //清空绘图区
g_len=512>>level; //计算单位长度
moveto(g_len/2,512-g_len/2); //设定起点
hilbert("X",level); //递归绘制Hilbert曲线
}
}
while((level=getch())!=27); //按ESC退出
closegraph();
}
⑵ 怎样用c语言画函数曲线图
DOS里面可以直接操作显存,windows里就不行了,尤其是NT系统。建议用GDI获DX吧
⑶ 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;
}
⑷ 采用c语言绘制任意函数曲线(双曲线,二次函数,一次函数)怎么做
在c的标准库中有graphic.h头文件,实现了很多画图函数 比如 lineto, moveto, arc,(函数名可能记错,好久没用了-.-!)
直线:起点加终点就行。
二次曲线,比如抛物线,那就以定长拆分成小直线。双曲线同理。
抛物线,和双曲线用定长拆分,估计很难计算。要是精度要求不高就根据情况改成定x,或者定y偏移的拆分,要是精度要求高那就去找直线拟合曲线的算法或者双圆弧拟合曲线的算法。
⑸ 希尔伯特曲线的希尔伯特曲线的作法
其构造方法如图:取一个正方形并且把它分出9个相等的小正方形,然后从左下角的正方形开始至右上角的正方形结束,依次把小正方形的中心用线段连接起来;下一步把每个小正方形分成9个相等的正方形,然后上述方式把其中中心连接起来……将这种操作手续无限进行下去,最终得到的极限情况的曲线就被称作希尔伯特曲线。
⑹ 什么是希尔伯特曲线
希尔伯特曲线是一种奇妙的曲线,只要恰当选择函数,画出一条连续的参数曲线,当参数t在0,1区间取值时,曲线将遍历单位正方形中所有的点,得到一条充满空间的曲线。 希尔伯特曲线是一条连续而又不可导的曲线。
⑺ 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;
}
求采纳为满意回答。
⑻ 如何用C语言编程画出nurbs曲线
NURBS曲线本身的表达比较复杂,如果完全用C语言写,显示用MFC会耗费很大的工作量,比较方便的方法是用OPENGL。你可搜下OPENGL的使用方法,和VC是可以完全集成的。
VC里配置好OPENGL后(可以参阅NeHe或者洞庭散人的文章,google下就知道了),可以直接google OpENGL和NURBS,OPENGL有直接的命令根据NURBS的控制点画NURBS曲线的。
很多人更关心的是如何基于NURBS做曲线拟合,网上这方面的开源程序很难找到,基本没有。需要自己去学习啊算法,比如参阅Piegl的NURBS book。这是项很大的工作。
关于NURBS有一些C的开源代码,你可以容易搜到的是如NURBS++之类,但是这些代码一般不是在windows平台下开发,想要很快的学习和编译这些代码对于初学者来说并不比直接学习算法自己编程来的快。
希望以上的内容对你有帮助。
⑼ 怎样用C语言画出二阶系统单位脉冲响应函数的动态曲线
#include <graphics.h>#include <conio.h> int g_len; // Hilbert 曲线的单位长度 // 递归绘制 Hilbert 曲线void hilbert(LPCTSTR cmd, int level){ static BYTE d = 0; // 方向 static POINT c[4] = {1, 0, 0, -1, -1, 0, 0, 1}; // 方向对应的轴系数 if (level < 0) return; // 处理命令字符串 int i = 0; while(cmd[i]) { switch(cmd[i++]) { case '+': d = (d + 1) & 3; break; case '-': d = (d - 1) & 3; break; case 'X': hilbert("+YF-XFX-FY+", level - 1); break; case 'Y': hilbert("-XF+YFY+FX-", level - 1); break; case 'F': linerel(c[d].x * g_len, c[d].y * g_len); break; } }} // 主函数void main(){ // 设置绘图环境 initgraph(800, 600); // 设置窗口大小 outtextxy(20, 550, "按 1~8 显示不同级别的 Hilbert 曲线,按 ESC 退出。"); rectangle(143, 23, 657, 537); // 绘制表示范围的矩形框 setorigin(144, 24); // 设置原点坐标 setcolor(RED); // 设置颜色 setfillstyle(BLACK); int level = '5'; // 设置初始级别 do { if (level >= '1' && level <= '8') // 仅处理 1~8 { level -= '0'; // 转换为对应的数字值 bar(0, 0, 511, 511); // 清空绘图区 g_len = 512 >> level; // 计算单位长度 moveto(g_len / 2, 512 - g_len / 2); // 设定起点 hilbert("X", level); // 递归绘制 Hilbert 曲线 } } while( (level = getch()) != 27 ); // 按 ESC 退出 closegraph();}