通過數學模型用CSS繪製土耳其國旗
根據百度百科中土耳其國旗的相關繪製數學關係式:
字母 |
含義 |
長度 |
G |
寬 |
1 |
A |
新月外邊構成的圓(後稱外圓)的圓心和接縫的距離 |
1/2 G |
B |
外圓的直徑 |
1/2 G |
C |
外圓的直徑和新月內邊構成的圓(後稱內圓)的直徑的距離 |
1/16 G |
D |
內圓直徑 |
2/5 G |
E |
內圓最左端和星的五個角構成的圓(後稱星圓)的距離 |
1/3 G (注) |
F |
星圓的直徑 |
1/4 G |
L |
長 |
1 ½ G |
M |
接縫的寬 |
1/30 G |
設計尺寸(不包括接縫M的寬度):寬度L=600px,高度G=400px。
新月模型:
由兩個圓的剪下組成,外圓相關資料A=200,圓心座標(200,200),B=200,那麼半徑為100。
內圓直徑D=160,半徑為80,C=25,圓心座標(225,200)。
A+C=200+25=225
水平方向距離左側邊緣:
225-80=145
垂直方向距離上部邊緣:
200-80=120
五角星模型:
F=100
那麼根據《CSS繪製正五角星原理(數學模型)》中可以獲取構成五角星的基礎三角形資料:(R為外接圓半徑50)
H=R·cos18°·tan36°=34.5491
基礎三角形上邊緣長度的一半:
R·cos18°= F·cos 18°/2=47.5528
五角星外心資料:
距離基礎三角形上邊緣距離
R·sin18°=F·sin18°/2=15.4508
基礎三角形上邊緣長度的一半:47.5528
五角星的外心位置水平位置:
A+E+F/2=383.3333
垂直位置:200-50=150
五角星旋轉資料構建數學模型:
數學模型如下:在三角形ABO中,OA=OB=R,BC是三角形垂線。已知∠OBD=18°,BD//AO,求線段AC的長度。
BD代表初始三角形的上邊緣位置,B代表初始三角形左頂點,O為五角星的外心(初始三角形的旋轉基點)。在旗幟中,由於五角星的頂點與五角星的外心、外圓、內圓的圓心在同一直線上,故而需要將正五角星進行旋轉。即旋轉後其中一個角的角平分線與外圓、內圓的圓心在同一條直線上。相當於頂點由位置B移動到位置A。
由於BD//AO,即∠AOB=∠OBD=18°。正三角初始位置與達到要求三角形位置為以外心為旋轉基點,逆時針旋轉18°才能達到。
AC=R(1-cos18°)=2.447
構成五角星的初始三角形實際座標位置:
水平方向:
【(A-(D/2 -C)】+E+2.447
=(200-(80-25))+ 400/3+2.447
=65+2.447+400/3
=280.7803
垂直方向:
200-15.4508=184.5492
HTML程式碼:
<div class="flag"> <div class='star'></div> </div>
CSS程式碼:
* { border-width: 0; } .flag { width: 600px; height: 400px; background: red; position: relative; } .flag::before { content: ''; display: block; width: 200px; height: 200px; border-radius: 100px; position: absolute; background: white; left: 100px; top: 100px; } .flag::after { content: ''; display: block; width: 160px; height: 160px; border-radius: 80px; position: absolute; background: red; left: 145px; top: 120px; } .star { position: absolute; width: 0; height: 0; border-top: 34.5491px solid white; border-left: 47.5528px solid transparent; border-right: 47.5528px solid transparent; transform: rotate(-18deg); transform-origin: 47.5528px 15.4508px; top: 184.5492px; left: 280.7803px; z-index: 999; } .star::before { content: ''; position: absolute; width: 0; height: 0; border-top: 34.5491px solid white; border-left: 47.5528px solid transparent; border-right: 47.5528px solid transparent; transform: rotate(-72deg); transform-origin: 47.5528px 15.4508px; top: -34.5491px; left:-47.5528px; } .star::after { content: ''; position: absolute; width: 0; height: 0; border-top: 34.5491px solid white; border-left: 47.5528px solid transparent; border-right: 47.5528px solid transparent; transform: rotate(72deg); transform-origin: 47.5528px 15.4508px; top: -34.5491px; left: -47.5528px; }
瀏覽器中實現效果(非常接近效果圖,渲染較為理想)。