分形幾何學是一門以不規則幾何形態為研究物件的幾何學。乙個數學意義上分形的生成是基於乙個不斷迭代的方程式,即一種基於遞迴的反饋系統。雖然分形是乙個數學構造,它們同樣可以在自然界中被找到,這使得它們被劃入藝術作品的範疇。
計算機協助了人們推開分形幾何的大門。法國數學家曼德爾勃羅特這位計算機和數學兼通的人物,開創了新的數學分支——分形幾何學。分形在醫學、土力學、**學和技術分析中都有應用。
畢達哥拉斯樹(pythagoras tree)是由畢達哥拉斯根據勾股定理所畫出來的乙個可以無限重複的圖形。又因為重複數次後的形狀好似一棵樹,所以被稱為畢達哥拉斯樹,也叫「勾股樹」。
這個程式,展示了畢達哥拉斯樹的生成。執行效果如下:
我的求解思路是:
確定直線 p1-p2,並在 p1-p2 的左側求出 p11-p22,使 p1-p2-p22-p11 構成正方形。
求出點 p,使 p-p11-p22 構成含 60 度角的直角三角形。
分別將直線 p-p11 和 p-p22 看作 p1-p2,遞迴。遞迴的條件是正方形的邊長大於 3。
完成的 c 語言源**如下:
///
// 程式名稱:畢達哥拉斯樹(pythagoras tree)
// 編譯環境:mictosoft visual studio 2010, easyx_20200315(beta)
// 作 者:love my d.o. <[email protected]>
// 最後修改:2020-4-10
//#include #include #include const double pi = 3.1415926536;
// 定義乙個結構體 point,儲存點的座標
struct point
;// 直線的旋轉(p1 是定點)
point rotate(point p1, point p2, double angle)
// 直線的縮放(p1 是定點)
point zoom(point p1, point p2, double ratio)
// 畫出正方形
void draw(point p1, point p2)
, // +0.5 是為了四捨五入,,
};static int color_h = 270;
setfillcolor(hsvtorgb(float(color_h), 1, 1)); // 設定正方形的填充顏色
setlinecolor(hsvtorgb(float((color_h + 80) % 360), 0.5, 0.5)); // 設定正方形的邊框顏色
color_h = (color_h + 1) % 360;
fillpolygon(pts, 4); // 填充正方形顏色
if (((p22.x - p11.x) * (p22.x - p11.x) + (p22.y - p11.y) * (p22.y - p11.y)) > 3 * 3 ) // 正方形的邊長 >3 時遞迴 }
// 主函式
int main()
; point p2 = ;
draw(p1, p2);
_getch();
closegraph(); // 關閉視窗
return 0;
}
數學三次危機(一)畢達哥拉斯學派的數學發現
畢達哥拉斯建立的學派在他生前與死後都進行了大量的數學研究,並得到了眾多的數學發現。他們的成果後來被歐幾里得收入 幾何原本 中,稱為希臘數學的重要組成部分。不過,這些數學成果究竟是由何人在何時做出的,大都很難考證清楚了。因此,我們下面介紹的發現除個別有據可查的歸於個人外,其餘則只要歸於整個畢達哥拉斯學...
克魯斯卡爾重構樹
處理給出無向圖,會出現重邊,共m條路徑,每條路徑有乙個困難值,q次詢問,求從點x出發只經過困難值小於等於v的路徑,求某個值。克魯斯卡爾重構樹的核心思想是,當新增最小生成樹的邊的時候,不在兩個點之間直接加邊,而是新建節點,讓邊的兩個節點分別成為它的左右兒子節點,然後這個新建的點,就成為整個聯通塊的代表...
克魯斯卡爾重構樹
克魯斯卡爾重構樹就是在用克魯斯卡爾演算法計算最小生成樹時,構造出一棵樹。當題目需要用到最小生成樹時,常常利用重構樹將其轉化為樹上問題。重構過程 在連線兩個點時,將其連向乙個新點,新點的點權為這條邊的邊權。並查集上就把這兩點的父親設為這個新點。這樣我們就維護了一棵從底向上點權遞增的一棵二叉樹。這棵樹具...