• <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>
            隨筆 - 32  文章 - 94  trackbacks - 0
            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            好友連接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            以前還在學(xué)校時,有過強烈的目睹高維物體的愿望,也想自己實現(xiàn)一個4維立方體試試,于是先在網(wǎng)絡(luò)上到處找n維立方體有關(guān)的展示視頻,在youtobe上發(fā)現(xiàn)了不少,一看就是一整天,結(jié)果第二天有別的事情,干別的事去了,當(dāng)時連規(guī)律都沒有找,想法就此結(jié)束。

            今天突然又有了興致,于是決定好好分析一番。


            從最基本開始,點,我們?nèi)菀淄瞥觯?維到n維,超立方體的點數(shù)是2的n次方。

            另外還容易推出:每增加一維,就會誕生新的空間概念,例如,0維只有點的空間概念,1維誕生了線,2維誕生了面,3維誕生了體,4維誕生了4維體.......
            并且新空間概念的定義都是由上一個概念往新的維度拉伸產(chǎn)生的。

            而比較難推出的關(guān)鍵一點就是:往新的維度拉伸的時侯,已有的某個概念增加的數(shù)量=原來的數(shù)量*2+低一級的概念的數(shù)量。例如,2維往3維拉伸正方形時,面數(shù)量即立方體的面數(shù)=正方形的面數(shù)*2+正方形線的數(shù)量;立方體線數(shù)=正方形線數(shù)*2+正方形點的數(shù)量

            證明方法,比較嚴密的方法還想不出,不過很容易想到:往新的維度拉伸時,拉伸的起點和終點使某空間概念的數(shù)量拷貝了一份,另外拉伸時,比該空間概念底一級的空間概念拉伸產(chǎn)生了該空間概念。

            這個說得比較抽象,具體公式可以由下面的圖表示出:


            有了這些概念后,可以編程出一些內(nèi)容了~~~
            由于在OpenGL中體是用面包裝起來表示的,因此我們必須找出n維立方體中點、線、面之間的規(guī)律,至于更高一層概念的規(guī)律可以暫時不理了。先給出一個還不完整類聲明:

             1#pragma once
             2#include "mainWindowStyle.h"
             3
             4class CSuperCube:public CY_Screen
             5{
             6    //-----------------------------------------------------------
             7    int MaxDim;//維度數(shù)量
             8    int *PointsCount;
             9    int *LinesCount;
            10    int *FaceCount;
            11    //-----------------------------------------------------------
            12
            13    float Length;//邊長
            14    //-----------------------------------------------------------------------------------------
            15    bool isDone;//已經(jīng)可以渲染的標志
            16
            17    float *Points;//n維空間中的點(以DimensionNum為一組為一個點坐標,PointNum為點數(shù)量,所以該float數(shù)組大小為DimensionNum*PointNum)
            18    int    DimensionNum;
            19    int PointNum;
            20
            21    struct SLine
            22    {
            23        float *points1;
            24        float *points2;
            25        SLine()
            26        {
            27            points1=0;
            28            points2=0;
            29        }

            30    }
            ;
            31    SLine *Lines;//n維空間中的線(以2個點的x坐標索引為起始)
            32    int LineNum;
            33
            34    struct SFace
            35    {
            36        float *points1;
            37        float *points2;
            38        float *points3;
            39        float *points4;
            40        SFace()
            41        {
            42            points1=0;
            43            points2=0;
            44            points3=0;
            45            points4=0;
            46        }

            47    }
            ;
            48    int FaceNum;
            49    SFace *Faces;//n維空間中的面
            50    //---------------------------------------------------------------------------------------------
            51
            52
            53    void CaculatePHelp(int currentDim);
            54    void CaculateLHelp(int currentDim);
            55    void CaculateFHelp(int currentDim);
            56    inline int PtAtIndex(int i)const
            57    {
            58        return i*DimensionNum;
            59    }

            60public:
            61    CY_TextBox *DimensionInput;
            62    
            63
            64    CY_Button  *CreateBtn;
            65
            66    //初始化各個維度的立方體中,點、線、面的數(shù)量
            67    //輸入:maxDim最大維數(shù)
            68    void InitMaxPLF(int maxDim);
            69
            70    //計算Dim維度下的立方體的點、線、面分布
            71    void CaculatePLF(int Dim);
            72}
            ;


            初始化點、線、面在各個維度立方體中的數(shù)量:其中maxDim表示最大維度,一般設(shè)一個小于16的值,

             1void CSuperCube::InitMaxPLF(int maxDim)
             2{
             3    if (MaxDim || maxDim<3)
             4        return;
             5    
             6    MaxDim=maxDim+1;
             7
             8    PointsCount=new int[MaxDim];
             9    LinesCount=new int[MaxDim];
            10    FaceCount=new int[MaxDim];
            11
            12    int i;
            13
            14    PointsCount[0]=1;
            15    for (i=1;i<MaxDim;++i)
            16        PointsCount[i]=PointsCount[i-1]*2;
            17
            18    LinesCount[0]=0;
            19    LinesCount[1]=1;
            20    for (i=2;i<MaxDim;++i)
            21        LinesCount[i]=LinesCount[i-1]*2+PointsCount[i-1];
            22
            23    FaceCount[0]=0;
            24    FaceCount[1]=0;
            25    FaceCount[2]=1;
            26    for(i=3;i<MaxDim;++i)
            27        FaceCount[i]=FaceCount[i-1]*2+LinesCount[i-1];
            28}

            下一步開始定位在Dim維空間中點、線、面的分布:
             1void CSuperCube::CaculatePLF(int Dim)
             2{
             3    if(!MaxDim || Dim<2 || Dim>=MaxDim)return;
             4
             5    if(isDone)
             6    {
             7        delete []Points;
             8        delete []Lines;
             9        delete []Faces;
            10    }

            11    
            12    //-------------------------------------分配好內(nèi)存空間
            13    DimensionNum=Dim;
            14    PointNum=PointsCount[DimensionNum];
            15    LineNum=LinesCount[DimensionNum];
            16    FaceNum=FaceCount[DimensionNum];
            17
            18    Points=new float[PointNum*DimensionNum];
            19    for (int i=0;i<PointNum*DimensionNum;++i)
            20    {
            21        Points[i]=0;
            22    }

            23    
            24    Lines=new SLine[LineNum];
            25    Faces=new SFace[FaceNum];
            26
            27    //-------------------------------------計算值
            28    int currentDim=0;
            29    while (currentDim<=DimensionNum)
            30    {
            31        CaculatePHelp(currentDim);
            32        //CaculateLHelp(currentDim);
            33        //CaculateFHelp(currentDim);
            34        ++currentDim;
            35    }

            36}
            其中從while (currentDim<=DimensionNum)那句開始就是算法的所在,目前只完成點空間分布的算法,思路是:先把所有點所有坐標初始化為0.
            從0維開始往上計算坐標,0維時,得到第一個點,坐標為0;以后每次增加一個維度,都把前面計算好的所有點的原來維度復(fù)制到新的一批點,對新的維度值設(shè)為Length,這個值即n維立方體的邊長:

             1void CSuperCube::CaculatePHelp(int currentDim)
             2{
             3    int i;
             4    //----------------------點計算
             5    if(currentDim==0)
             6        return;
             7    else
             8    {
             9        int targetStart=2<<(currentDim-1);//復(fù)制的起始點
            10        int targetEnd=2<<currentDim;//復(fù)制的結(jié)束點下一點
            11        for (i=targetStart;i<targetEnd;++i)
            12        {
            13            int index=DimensionNum*i;//目標點的x坐標索引
            14            int source=DimensionNum*targetStart;//來源點的x坐標索引負偏移量
            15            for (int j=0;j<currentDim;++j)
            16            {
            17                Points[index+j]=Points[index-source+j];//復(fù)制
            18            }

            19            Points[index+currentDim]=Length;//新加的維度設(shè)為邊長
            20        }

            21    }

            22}

            線的空間分布比點的分布計算難了些,不過已經(jīng)初步分析出來,思路大概如下:
            初始化1維的線的兩端點分別是索引點1,索引點2;以后每增加一個維度,把原來已經(jīng)初始化了的線復(fù)制過來,再把線的兩個索引點的值全部偏移“2的(當(dāng)前維度-1)次方”,再初始化“2的(當(dāng)前維度-1)次方”條邊,起始點索引分別為前“2的(當(dāng)前維度-1)次方”個點,終點的索引點分別為接著的“2的(當(dāng)前維度-1)次方”個點。
            線的空間分布代碼明天貼出。

            接下來,面的空間分布計算又更進一步難了,還有最后一個問題就是所有OpenGL渲染要素完成后,為了展示效果,還要旋轉(zhuǎn)這個n維超立方體,于是需要旋轉(zhuǎn)矩陣,n維矩陣的旋轉(zhuǎn)公式應(yīng)該如何推導(dǎo),這兩個問題各位圖形愛好者共同想想,一起努力~~~
            posted on 2009-07-31 21:32 陳昱(CY) 閱讀(2122) 評論(8)  編輯 收藏 引用 所屬分類: 圖形學(xué)算法

            FeedBack:
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1)[未登錄] 2009-07-31 23:25 hdqqq
            演示4維立方體的falsh
            http://4d.shadowpuppet.net/4d.php  回復(fù)  更多評論
              
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1)[未登錄] 2009-08-01 00:04 欲三更
            有一個紀錄片專門講述這方面,好像叫dimensions,你可以去找找  回復(fù)  更多評論
              
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1) 2009-08-01 11:02 凡客誠品
            不錯  回復(fù)  更多評論
              
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1) 2009-08-01 11:08 mybios
            屏幕只是二維,要表現(xiàn)四維的東西,還是有困難的。
            就好比在一維顯示器上顯示三維畫面一樣困難。
            三維的畫面可以投影到二維屏幕上,那四維畫面就應(yīng)該投影到三維屏幕上才對。  回復(fù)  更多評論
              
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1) 2009-08-01 20:21 haskell
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1) 2009-08-01 22:17 陳昱(CY)
            感謝各位提供資料,目前程序初步成功~  回復(fù)  更多評論
              
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1) 2009-08-02 12:07 mybios
            @陳昱(CY)
            可喜可賀  回復(fù)  更多評論
              
            # re: 一個想法,用程序畫出高維超立方體在三維上的投影!!!(1)[未登錄] 2009-08-03 14:45 欲三更
            @mybios
            一維的顯示器?您沒事吧?

            另外,這個投影是成立的,4維投3維,三維再投成2維。  回復(fù)  更多評論
              
            东京热TOKYO综合久久精品| 国产精品一区二区久久国产| 99久久精品费精品国产一区二区| 久久久高清免费视频| 久久国产综合精品五月天| 久久精品国产影库免费看| 久久影院综合精品| 狠狠精品久久久无码中文字幕| 久久久久久无码国产精品中文字幕 | 久久高清一级毛片| 伊人久久免费视频| 99久久免费国产精品| 岛国搬运www久久| 久久精品无码一区二区app| 国产精品欧美久久久久天天影视| 国产999精品久久久久久| 久久九九久精品国产| 色诱久久av| 伊人久久大香线蕉综合影院首页 | 久久www免费人成看片| 久久久久久一区国产精品| 久久免费视频一区| 7777久久亚洲中文字幕| 国产精品视频久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 狠狠色婷婷综合天天久久丁香| 国产精品一区二区久久不卡| 欧美久久综合性欧美| 久久久久女教师免费一区| 久久精品综合网| 99精品久久精品一区二区| 久久99精品国产麻豆蜜芽| 思思久久精品在热线热| 久久国产精品成人片免费| 999久久久国产精品| 综合久久久久久中文字幕亚洲国产国产综合一区首| 要久久爱在线免费观看| 国内精品伊人久久久久AV影院| 精品久久久久久久久久中文字幕| 久久午夜福利无码1000合集| 久久成人精品视频|