zoukankan      html  css  js  c++  java
  • SVG 曲线与文字

    在SVG中除了可以利用<path>元素来画路径外,还可以画曲线(椭圆的一段弧),例子如下:

    <svg >
    
        <path d="M50,50
                 A30,50 0 0,0 100,100"
              style="stroke:black; fill:none;"/>
      <path d="M50,50
                 A30,50 0 1,0 100,100"
              style="stroke:red; fill:none;"/>
       <path d="M50,50
                 A30,50 0 0,1 100,100"
              style="stroke:green; fill:none;"/>
      <path d="M50,50
                 A30,50 0 1,1 100,100"
              style="stroke:blue
                     ; fill:none;"/>
    </svg>

     在上面的例子中M50,50是指移动到(50,50),将(50,50)作为曲线的起点。

    A30,50是指曲线所在椭圆的x和y轴的半轴长度,30是x半轴长,50是y半轴长(两个数字相等是圆弧,不等是椭圆弧)。

    后面的0和1三个数字规定了曲线的大小和方向

    (最后一个位置的0或1代表逆顺时针、中间那个位置的0或1代表小弧或大弧,第一个位置一般固定是0):

    0 0,0是从起点向终点沿着逆时针方向画条小弧(黑色)

    0 1,  1是从起点向终点沿着顺时针方向画条大弧(蓝色) 

    PS:这两条弧接在一起是一个完整的椭圆

    0 0,  1是从起点向终点沿着顺时针方向画条小弧(绿色)

    0 1,  0是从起点向终点沿着逆时针方向画条大弧(红色) 

    PS:这两条弧接在一起也是一个完整的椭圆

     除了把曲线看成椭圆的一部分外,在计算机图形学中有一种叫作贝塞尔曲线的曲线也很常用。

    绘制贝塞尔曲线的算法叫作德卡斯特里奥算法,关于贝塞尔曲线和德卡斯特里奥算法的原理大家请参考以下链接:

    https://zh.javascript.info/bezier-curve

     绘制贝塞尔曲线的代码如下

    <html>
    <head>
      
    </head>
    <body>
      <svg>
    <path d="M50,50 Q50,100 100,100" 
          style="stroke: red; fill:none;"/> 
      </svg>
    </body>
    </html>

     在上面的代码中A(50,50),B(100,100)是曲线的两个端点

    字母Q代表要从A到B连接一条二贝塞尔曲线,Q后面的那个50,100是点C的坐标

    点C像磁铁一样把曲线上的点向该点方向吸引,曲线上离C近的点受到的吸引力大,离C远的点受到的吸引力小。

    在SVG中可以很容易把直线和曲线组合起来绘制图形,下面是一个例子

    <html>
    <head>
      
    </head>
    <body>
      <svg>
    <path d="M50,50 Q50,100 100,100 L50,50" 
          style="stroke: green; fill:none;"/> 
      </svg>
    </body>
    </html>

     上面这段代码的含义是移动(M代表移动)到50,50,从(50,50)画一条二次贝塞尔曲线(Q代表二次曲线)到(100,100),再从(100,100)画一条直线到(50,50)

    同学们还记得Z吗(Z代表从最后一个点连接到出发点),上面这个例子是从终点又连接回到了起点,这时可以用Z来代替L50,50

    <html>
    <head>
      
    </head>
    <body>
      <svg>
    <path d="M50,50 Q50,100 100,100 z" 
          style="stroke: green; fill:yellow;"/> 
      </svg>
    </body>
    </html>

     我们可以在起点和终点加上相应的文字,代码如下:

    <html>
    <head>
      
    </head>
    <body>
      <svg>
        <text x="50" y="50" fill="red">A</text>
    <path d="M50,50 Q50,100 100,100 " style="stroke: green; fill:none;"/> 
        <text x="100" y="100" fill="blue">B</text>
      </svg>
    </body>
    </html>

  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/gezhaoatdlnu/p/13720663.html
Copyright © 2011-2022 走看看