1. 程式人生 > 實用技巧 >通過數學模型用CSS繪製土耳其國旗

通過數學模型用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;
        }

瀏覽器中實現效果(非常接近效果圖,渲染較為理想)。