仿射變換生成分形

2021-06-26 09:36:20 字數 1880 閱讀 7679

在學習仿射變換的時候,我們對仿射變換對二維圖形的作用很滿意,它能滿足平移,旋轉, 伸縮和錯切等特性。 而且相對於之前的共形幾何,仿射幾何變換似乎更強大,那麼我們之前用logo語言繪製出來的那些分形圖形是否也可以利用仿射幾何搞定呢?

那最簡單的三角形地墊來講: 首先是乙個大的三角形:然後分別以三個頂點a, b, c,按1/2的比例放縮, 可以得到

那麼從第二個到第三個圖形呢, 我們還是分別以三個頂點a, b, c,對第二個圖形,按1/2的比例放縮。

那麼具體是如何操作的呢?

操作的關鍵在於 :我們要保證乙個三角形在放縮了以後還是三角形。就是說我們要以三角形個體來考慮。

看一下以下**:

struct mypolygon

void draw(id2d1hwndrendertarget** render, id2d1solidcolorbrush** soildbrush)

(*render)->drawline(m_peaks[i], m_peaks[0], *soildbrush);

}std::vectorm_peaks; //儲存多邊形的頂點

};

上面的**是多邊形的,包含三角形。

我們對圖形的變換都是相同的:以a, b, c頂點, 按1/2 比例放縮。 然後針對所有的三角形。

看一下主**裡面是如何使用它的:

//1. 得到視窗的大小。

d2d1_size_f size = m_prendertarget->getsize();

//2. 給定多邊形的中心

d2d1_point_2f center = d2d1::point2f(size.width / 2, size.height / 2);

//3. 以200為半徑的多邊形, 得到初始多邊形所有的頂點。

const int length = 200;

std::vectorpeaks;

for (int i = 0; i != edgesnum; ++i)

//4. 得到所有以初始多邊形為頂點, 按0.5放縮的仿射變換矩陣。

std::vectormatrixscale;

for (auto& peak : peaks)

//5. 用來存放後續生成的所有多邊形。剛開始裡面只有乙個初始多邊形。

std::vectorvecpolygon;

vecpolygon.push_back(mypolygon(peaks));

int level = 5; //分層級數

while (level != 0)

temp.push_back(pg); //把該臨時多邊形放進容器。}}

vecpolygon = temp; //把變換後得到的所有多邊形頂點付給初始容器,使它作為下一次層級變換的初始圖形。

--level;

}//繪製最後生成的所有多邊形。

for (auto& poly : vecpolygon)

最後看看生成的吧。

上面這個是5邊形, 按照0.5的比例放縮的。

這個是五邊形,是按照0.4的比例縮放的。

這個是六邊形,按照0.4的比例縮放的

剛性仿射變換演算法 仿射變換

哎慢慢來吧,感覺一大堆東西看不懂.仿射變換就是affine transformation 這是乙個跟影象相關的變換,影象變換是通過矩陣變換來實現的。影象的幾個基本變換有平移 縮放 旋轉 仿射 透視。剛性變換 就像這個題目這樣顯示的,就是非常強硬的變換,在這個二維平面上開始是怎麼樣,後來就是怎麼樣 仿...

仿射變換生成玫瑰花結

這幾天學了仿射變換,我們之前的烏龜程式是共形變換,就是有點相似三角形一樣。而仿射變換 是一種新的變換,他有四種變換組成的 平移 translation 旋轉 rotation 伸縮 scale 扭曲 skew 大家可以在這裡看一下 當然我是參考 計算機圖形學和幾何造型導論 的 第四章 仿射變換 裡面...

仿射變換transform

void viewdidload void clickmeaction 2 仿射變換比例 uiview animatewithduration 1animations 3 仿射變換旋轉 uiview animatewithduration 1animations 4 三種變換的結合 1 transl...