• <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
            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            好友連接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

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


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

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

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

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

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


            有了這些概念后,可以編程出一些內(nèi)容了~~~
            由于在OpenGL中體是用面包裝起來表示的,因此我們必須找出n維立方體中點(diǎ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)可以渲染的標(biāo)志
            16
            17    float *Points;//n維空間中的點(diǎn)(以DimensionNum為一組為一個點(diǎn)坐標(biāo),PointNum為點(diǎn)數(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個點(diǎn)的x坐標(biāo)索引為起始)
            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    //初始化各個維度的立方體中,點(diǎn)、線、面的數(shù)量
            67    //輸入:maxDim最大維數(shù)
            68    void InitMaxPLF(int maxDim);
            69
            70    //計算Dim維度下的立方體的點(diǎn)、線、面分布
            71    void CaculatePLF(int Dim);
            72}
            ;


            初始化點(diǎn)、線、面在各個維度立方體中的數(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維空間中點(diǎn)、線、面的分布:
             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)那句開始就是算法的所在,目前只完成點(diǎn)空間分布的算法,思路是:先把所有點(diǎn)所有坐標(biāo)初始化為0.
            從0維開始往上計算坐標(biāo),0維時,得到第一個點(diǎn),坐標(biāo)為0;以后每次增加一個維度,都把前面計算好的所有點(diǎn)的原來維度復(fù)制到新的一批點(diǎn),對新的維度值設(shè)為Length,這個值即n維立方體的邊長:

             1void CSuperCube::CaculatePHelp(int currentDim)
             2{
             3    int i;
             4    //----------------------點(diǎn)計算
             5    if(currentDim==0)
             6        return;
             7    else
             8    {
             9        int targetStart=2<<(currentDim-1);//復(fù)制的起始點(diǎn)
            10        int targetEnd=2<<currentDim;//復(fù)制的結(jié)束點(diǎn)下一點(diǎn)
            11        for (i=targetStart;i<targetEnd;++i)
            12        {
            13            int index=DimensionNum*i;//目標(biāo)點(diǎn)的x坐標(biāo)索引
            14            int source=DimensionNum*targetStart;//來源點(diǎn)的x坐標(biāo)索引負(fù)偏移量
            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}

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

            接下來,面的空間分布計算又更進(jìn)一步難了,還有最后一個問題就是所有OpenGL渲染要素完成后,為了展示效果,還要旋轉(zhuǎn)這個n維超立方體,于是需要旋轉(zhuǎn)矩陣,n維矩陣的旋轉(zhuǎn)公式應(yīng)該如何推導(dǎo),這兩個問題各位圖形愛好者共同想想,一起努力~~~
            posted on 2009-07-31 21:32 陳昱(CY) 閱讀(2121) 評論(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 欲三更
            有一個紀(jì)錄片專門講述這方面,好像叫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ù)  更多評論
              
            99热成人精品热久久669| 久久久久久久97| 亚洲AV乱码久久精品蜜桃| 久久精品国产亚洲av麻豆蜜芽| 一级做a爰片久久毛片16| 久久99精品国产99久久6| 办公室久久精品| 色综合久久久久综合99| 欧美激情一区二区久久久| 人妻精品久久久久中文字幕一冢本| 国产精品九九九久久九九| 日韩精品无码久久久久久| 人妻少妇久久中文字幕一区二区| 久久国产亚洲精品| 精品免费tv久久久久久久| 欧美一级久久久久久久大片| 精品久久久久一区二区三区 | 国产V综合V亚洲欧美久久| 久久精品国产黑森林| 五月丁香综合激情六月久久 | 久久人人爽人人爽人人AV| 久久综合噜噜激激的五月天| 无码人妻久久久一区二区三区| 久久精品国产网红主播| 丰满少妇人妻久久久久久| 91精品国产乱码久久久久久 | 亚洲?V乱码久久精品蜜桃| 亚洲美日韩Av中文字幕无码久久久妻妇 | 99久久国产综合精品麻豆| 久久无码av三级| 久久精品蜜芽亚洲国产AV| 丰满少妇人妻久久久久久| 久久精品免费网站网| 国内精品久久久久影院亚洲| 亚洲国产美女精品久久久久∴| 久久精品国产99久久无毒不卡| 亚洲午夜久久影院| 三级三级久久三级久久| 狠狠狠色丁香婷婷综合久久五月 | 日韩人妻无码精品久久久不卡 | 久久久久18|