青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

XY

沒有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

分形的樂趣之_Hilbert曲線

Posted on 2008-10-13 18:45 路緣 閱讀(2146) 評論(2)  編輯 收藏 引用 所屬分類: 計算機圖形學

  作者:路緣

原文網址:http://www.cnblogs.com/xuyuan77/archive/2008/10/13/1310269.html

德國數學家David Hilbert發現了一種曲線,首先把一個正方形等分成四個小正方形,依次從西南角的正方形中心出發往北到西北正方形中心,再往東到東北角的正方形中心,再往南到東南角正方形中心,這是一次迭代,如果對四個小正方形繼續上述過程,往下劃分,反復進行,最終就得到一條可以填滿整個正方形的曲線,這就是Hibert曲線,其大致過程如下圖所示

 

                                Hibert曲線生成過程

 

下面我們來看如何寫程序生成這樣的曲線,其實不管迭代多少次,都是由如下的圖形

            基本圖 

構成,唯一所不同的是開口方向不一樣。開口方向不一樣就涉及到圖像旋轉,圖像旋轉的基本知識接下來會介紹。目前我們最關心的是這樣生成的曲線過程右什么規律,從上述描述生成的過程就已經看出了規律,當然人肯定一眼就看出來了,但計算機如何知道呢?這就是生成Hibert曲線算法的關鍵了:

為了便于找出規律,我們來看下面一副圖

 

上圖中應該是把所有開口方向(共四種)都涵蓋了。我們約定四種類型:

開口往南-0,開口往西-1,開口往北-2,開口往東-3。我們結合基本圖,就有這樣的規律,畫表如下:

點所在圖類型

以該點為中心產生的圖類型

dot1

0

1

dot1

1

2

dot1

2

3

dot1

3

0

 

其他的點類似也有類似的規律,這個規律才是我們編碼的基礎。是下次遞歸調用畫圖函數傳參數的前提。下面我們來看一下畫圖中涉及到的圖像旋轉的相關數學知識。

圖像旋轉

圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉一定的角度,通常是指繞圖像的中心以逆時針方向旋轉。

假設圖像的左上角為(left, top),右下角為(right, bottom),則圖像上任意點(x0, y0)繞其中心(xcenter, ycenter)逆時針旋轉angle角度后,新的坐標位置(x, y′)的計算公式為:

xcenter = (right left 1) 2 left;

ycenter = (bottom top 1) 2 top;

x =  (x0 xcenter) cosθ (y0 ycenter) sinθ xcenter;

y =  (x0 xcenter) sinθ (y0 ycenter) cosθ ycenter;

與圖像的鏡像變換相類似,也采用按行逐點變換的方式實現圖像的旋轉。

 

現在一切都準備就緒,我們來實現相關的算法如下:

 

/**********************************************************************************************
功能:實現繪制Hilbert曲線
參數:
    pDC:設備上下文
    n:維都
    len:邊長
    x:中心橫坐標
    y:中心縱坐標
    iType:繪畫類型,開口:0-南,1-西,2-北,3-東
    unit_length:最小單元長度
/*********************************************************************************************
*/

void CGraphicAppView::DrawHilbert(CDC* pDC, int n, int len, int x, int y, int iType, int unit_length)
{
    
//存儲以x,y為中心的西南、西北、東北、東南四角定點的坐標
    int arr[4][2];
    arr[
0][0= x -len/4; arr[0][1=y+len/4
    arr[
1][0= x -len/4; arr[1][1=y-len/4;
    arr[
2][0= x +len/4; arr[2][1=y-len/4;
    arr[
3][0= x +len/4; arr[3][1=y+len/4
    
//存儲以x,y為中心的(西南、西北、東北、東南四角定點)經過處理后的坐標
    int a[4][2];
    memset(a, 
0sizeof(a));

    
int sin_v=0,cos_v=1;//默認為0度的值
    switch(iType)//根據不同的開口方向,對旋轉三角函數賦值
    {
    
case 1://開口向左
        sin_v = 1; cos_v = 0;
        
break;
    
case 2://開口向上
        sin_v = 0; cos_v = -1;
        
break;
    
case 3:    //開口向右
        sin_v = -1; cos_v = 0;
        
break;
    }


    
for(int i = 0; i<4; i++)//完成旋轉
    {
        a[i][
0= (arr[i][0- x)*cos_v - (arr[i][1- y)*sin_v + x;
        a[i][
1= (arr[i][0- x)*sin_v + (arr[i][1- y)*cos_v + y;
    }


    CPen newPen(PS_DASHDOTDOT, 
2, RGB(y%255, x%255, (y+x)%255));
    pDC
->SelectObject(&newPen);        

    
if(n > 1)
    
{
        
int length = len/2;
        DrawHilbert(pDC, n
-1, length, a[0][0], a[0][1], (1+iType)%4,unit_length);
        DrawHilbert(pDC, n
-1, length, a[1][0], a[1][1], iType,unit_length);
        DrawHilbert(pDC, n
-1, length, a[2][0], a[2][1], iType,unit_length);
        DrawHilbert(pDC, n
-1, length, a[3][0], a[3][1], (3+iType)%4,unit_length);

        
switch(iType)
        
{
        
case 0:
        
case 2:
            pDC
->MoveTo(x-length + 0.5*unit_length, y + 0.5*unit_length);
            pDC
->LineTo(x-length + 0.5*unit_length, y - 0.5*unit_length);

            pDC
->MoveTo(x-0.5*unit_length, y - (1-iType)*0.5*unit_length);
            pDC
->LineTo(x+0.5*unit_length, y - (1-iType)*0.5*unit_length);

            pDC
->MoveTo(x+length - 0.5*unit_length, y + 0.5*unit_length);
            pDC
->LineTo(x+length - 0.5*unit_length, y - 0.5*unit_length);
            
break;
        
case 1:
        
case 3:
            pDC
->MoveTo(x-0.5*unit_length, y -length + 0.5*unit_length);
            pDC
->LineTo(x+0.5*unit_length, y -length + 0.5*unit_length);

            pDC
->MoveTo(x+(2-iType)*0.5*unit_length, y - 0.5*unit_length);
            pDC
->LineTo(x+(2-iType)*0.5*unit_length, y + 0.5*unit_length);

            pDC
->MoveTo(x-0.5*unit_length, y +length - 0.5*unit_length);
            pDC
->LineTo(x+0.5*unit_length, y +length - 0.5*unit_length);
            
break;
        }

    }

    
else
    
{        
        pDC
->MoveTo(a[0][0], a[0][1]);
        pDC
->LineTo(a[1][0], a[1][1]);
        pDC
->LineTo(a[2][0], a[2][1]);
        pDC
->LineTo(a[3][0], a[3][1]);
    }

}

算法中還涉及到了,連接迭代產生的圖像的過程,由于算法不是很優雅,在這兒就不細說了,其次如果把二維映射到三維,將會得到更美妙的曲線,最近忙著找工作,有時間再想了,有興趣的朋友可以研究下三維的情況。

 

其次希望有朋友能有更好的算法,希望不吝賜教,先謝過了。最后我們來看一下迭代6次的一個運行結果圖:

調用的代碼段如下:

void CGraphicAppView::OnDraw(CDC* pDC)
{
    CGraphicAppDoc
* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
if (!pDoc)
        
return;
    
// TODO: add draw code for native data here
    int n = 6;
    
long t = ::pow(2.0, n);
    
int length = 400;
    
int unit_length = length/t;
    DrawHilbert(pDC, n, length, 
2002000, unit_length);
}

Feedback

# re: 分形的樂趣之_Hilbert曲線  回復  更多評論   

2008-10-13 21:53 by 陳梓瀚(vczh)
there is a bug, the colors of connection lines are wrong. It seems that the color is not decided when you draw the picture.

# re: 分形的樂趣之_Hilbert曲線  回復  更多評論   

2008-10-13 22:50 by 路緣
@陳梓瀚(vczh)
Thank you for your reply. But I can't find the bug ,
and the program runs on my computer smoothly.

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩精品免费在线观看视频| 欧美激情在线观看| 国产欧美日韩一区二区三区| 欧美三级在线| 国产精品一区二区a| 国产午夜精品全部视频播放| 国产精品私拍pans大尺度在线 | 久久国产精品久久久| 久久久www成人免费毛片麻豆| 久久精品一区二区国产| 老司机免费视频一区二区三区| 欧美r片在线| 欧美日韩视频在线| 国产欧亚日韩视频| 亚洲国产精品v| 亚洲一级网站| 久久一日本道色综合久久| 欧美激情一区在线| 亚洲欧美日韩成人高清在线一区| 久久久精品久久久久| 欧美日韩国产精品专区| 国模精品一区二区三区色天香| 亚洲欧洲一级| 欧美在线视频全部完| 欧美激情91| 亚洲欧美资源在线| 欧美精品久久99久久在免费线| 日韩视频免费观看高清完整版| 亚洲麻豆国产自偷在线| 亚洲亚洲精品三区日韩精品在线视频| 欧美影院成年免费版| 亚洲国产精品ⅴa在线观看| 亚洲精品美女久久7777777| 欧美在线关看| 欧美三级乱人伦电影| 亚洲国产精品ⅴa在线观看 | 国产美女精品视频免费观看| 激情五月婷婷综合| 小嫩嫩精品导航| 亚洲国产国产亚洲一二三| 欧美一级视频精品观看| 欧美日韩国产在线看| 亚洲国产精品一区二区尤物区 | 日韩一级精品视频在线观看| 久久久精品国产99久久精品芒果| 欧美无砖砖区免费| 日韩亚洲欧美中文三级| 欧美14一18处毛片| 久久精品综合一区| 国产乱人伦精品一区二区| 亚洲美女黄网| 亚洲激情一区二区| 欧美大尺度在线观看| 亚洲国产精品一区| 欧美黑人多人双交| 免费看av成人| 亚洲欧洲综合另类| 亚洲国产精品一区二区尤物区| 久久全国免费视频| 亚洲大胆人体视频| 暖暖成人免费视频| 男人天堂欧美日韩| 日韩视频一区二区三区在线播放| 亚洲电影欧美电影有声小说| 另类激情亚洲| 亚洲美女在线观看| 日韩视频不卡| 国产精品国产精品| 欧美一区=区| 久久黄色级2电影| 黑人巨大精品欧美黑白配亚洲| 久久婷婷国产综合精品青草| 久久精品视频免费| 亚洲人成毛片在线播放| 亚洲日韩欧美视频| 国产精品美女在线| 久久天天躁夜夜躁狠狠躁2022| 久久动漫亚洲| 亚洲区免费影片| 久久久久免费观看| 免费成人性网站| 中日韩男男gay无套| 这里只有精品丝袜| 伊人精品久久久久7777| 亚洲综合色视频| 久久成人18免费观看| 韩国久久久久| 欧美日韩久久| 午夜精品久久久久久久蜜桃app| 午夜在线视频观看日韩17c| 亚洲激情视频网| 亚洲天堂成人在线观看| 亚洲毛片在线| 亚洲综合欧美日韩| 亚洲激情偷拍| 欧美一区网站| 亚洲最新视频在线播放| 亚洲激情在线播放| 欧美午夜精品久久久久久久| 欧美影院精品一区| 乱中年女人伦av一区二区| 尤物精品国产第一福利三区| 亚洲国产视频直播| 国产精品欧美一区二区三区奶水| 欧美中文在线观看| 男人的天堂亚洲在线| 欧美一乱一性一交一视频| 欧美成人蜜桃| 久久久成人精品| 裸体素人女欧美日韩| 一本一本久久a久久精品综合麻豆| 亚洲视频网在线直播| 在线精品福利| 小黄鸭视频精品导航| 国产精品99久久久久久白浆小说| 先锋影音久久| 亚洲一区在线视频| 欧美成人嫩草网站| 理论片一区二区在线| 国产精品免费观看视频| 91久久精品国产| 在线成人激情视频| 午夜久久美女| 欧美一区二区三区久久精品| 欧美喷潮久久久xxxxx| 免费亚洲一区二区| 国产欧美一区二区视频| 亚洲精品免费看| 亚洲福利视频网| 久久久www| 久久久亚洲午夜电影| 国产欧美日韩另类视频免费观看| 亚洲精品综合在线| 99re66热这里只有精品4| 免费成人高清视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧美日韩国产一区| 看欧美日韩国产| 亚洲欧美日韩精品久久| 欧美日韩专区| 一个人看的www久久| 亚洲最新视频在线| 欧美日韩一区综合| 在线亚洲美日韩| 先锋影音一区二区三区| 国产精品第2页| 亚洲综合色网站| 欧美在线一二三四区| 国产色视频一区| 久久国产视频网站| 蜜臀91精品一区二区三区| 永久免费精品影视网站| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产一区二区三区在线播| 亚洲精品永久免费精品| 欧美日韩国产首页在线观看| 一区二区三区欧美在线| 欧美一区二区三区另类| 在线精品国产成人综合| 欧美精品日韩综合在线| 亚洲一卡二卡三卡四卡五卡| 欧美中文在线观看| 在线观看亚洲精品视频| 欧美精品一区二区三区四区| 日韩视频精品在线| 久久精品99国产精品酒店日本| 一区二区三区我不卡| 欧美精品久久99久久在免费线| 亚洲先锋成人| 欧美激情一区二区三区不卡| 在线性视频日韩欧美| 国产一区在线播放| 欧美精品大片| 新67194成人永久网站| 亚洲第一综合天堂另类专| 亚洲一区二区视频在线| 国内精品视频一区| 欧美午夜精品理论片a级大开眼界| 欧美一区二区三区成人| 亚洲黄色免费电影| 久久av在线| 一区二区三区免费网站| 国产一区二区视频在线观看| 欧美精品九九| 久久综合狠狠综合久久综合88| 一区二区三区回区在观看免费视频| 久久综合图片| 久久国产精品一区二区三区四区| 亚洲美女中文字幕| 伊人婷婷久久| 国产伦精品一区二区三区高清版| 免费欧美视频| 久久疯狂做爰流白浆xx| 亚洲午夜激情| 亚洲毛片网站| 亚洲激情六月丁香| 猛男gaygay欧美视频| 久久精品国产第一区二区三区最新章节 | 久久美女性网| 亚洲女ⅴideoshd黑人|