通过数学模型用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;
        }

浏览器中实现效果(非常接近效果图,渲染较为理想)。

 

posted @ 2020-12-16 18:25  请叫我二狗哥  阅读(618)  评论(0编辑  收藏  举报