當前位置:首頁 » 編程語言 » c語言希爾伯特曲線的繪制
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言希爾伯特曲線的繪制

發布時間: 2022-07-24 16:40:16

⑴ 請問怎麼用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();}