SVG

博客分类: 江河计划

SVG

算法

打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

迭代的方式

var rob = function(nums) {
    let last = 0;
    let total = 0;
    for(let i=0; i<nums.length; i++){
        var temp = last;
        last = total;
        total = Math.max(temp + nums[i], last);
    }
    return total;
};

递归的解法

var rob = function(nums) {
    var cacheRes = {};
    function robInfo(i){
        if(i < 0) return 0;
        if(i === 0) return nums[0];
        if(!cacheRes[i]){
            if(i === 1){
                cacheRes[i] = Math.max(nums[0], nums[1]);
            }else{
                cacheRes[i] = Math.max(nums[i] + robInfo(i - 2), nums[i - 1] + robInfo(i - 3))
            }
        }
        return cacheRes[i]
    }
    return robInfo(nums.length - 1);
};

SVG

什么是 SVG

使用方式

可以用一些外链的方式引入,也可以是一些在 HTML 中直接写。svg 也能允许嵌套

<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     >
    <circle cx="64" cy="64" r="64" style="fill: #00ccff;"></circle>
</svg>

上图如果没有 viewbox,会根据 svg 元素的宽高来固定画布,内部的大小由实际大小决定,如果要进行同比缩放,就可以设定 viewbox,相当于设定画布的大小,这个时候再设定 svg 的宽高,就会根据 svg 的款高和 viewbox 的宽高进行等比缩放

SVG 坐标系

左上角为原点,右为 x 正向,下为 y 正向。如果没有指定单位,那么单位为像素,可以指定 cm 和 mm 的单位。

Unit  Description
em    The default font size - usually the height of a character.
ex    The height of the character x
px    Pixels
pt    Points (1 / 72 of an inch)
pc    Picas (1 / 6 of an inch)
cm    Centimeters
mm    Millimeters
in    Inches

g 元素

SVG中g元素被用来将图形进行分组。一旦分组,你可以把它当作一个单一的形状,对整个图形组进行转换。与嵌套的svg元素相比,将元素作为整体转换是它的一个优点。

g元素的样式由它的子元素继承,但是G元素没有X和Y属性

SVG 形状

SVG 有一些预定义的形状元素,可被开发者使用和操作:

SVG 矩形 rect

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100"
  style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/>
</svg>

属性

SVG 圆 circle

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <circle cx="40" cy="40" r="24" style="stroke:#006600; fill:#00cc00"/>
</svg>

属性

SVG 椭圆 ellipse

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

  <ellipse cx="40" cy="40" rx="30" ry="15"
           style="stroke:#006600; fill:#00cc00"/>

</svg>

属性

SVG 线 line

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <line x1="0"  y1="10" x2="0"   y2="100" style="stroke:#006600;"/>
        <line x1="10" y1="10" x2="100" y2="100" style="stroke:#006600;"/>
        <line x1="20" y1="10" x2="100" y2="50"  style="stroke:#006600;"/>
        <line x1="30" y1="10" x2="110" y2="10"  style="stroke:#006600;"/>
</svg>

属性

SVG 折线 polyline

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <polyline points="0,0  30,0  15,30"
        style="stroke:#006600;"/>
</svg>

SVG 多边形 polygon

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
  <polygon points="10,0  60,0  35,50"
         style="stroke:#660000; fill:#cc3333;"/>

</svg>

属性

SVG 路径 path

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <path d="M50,50
             A30,30 0 0,1 35,20
             L100,100
             M110,110
             L100,0"
          style="stroke:#660000; fill:none;"/>    
</svg>
命令 参数 名称 描述
M x,y 移至 将虚拟画笔移动到指定点x,y处而不绘制图。
m x,y 移至 将虚拟画笔移动至相对于其当前坐标的x,y处而不进行绘图操作。
L x,y 线路 从虚拟画笔当前位置绘制一条到x,y点的直线。
l x,y 线路 从虚拟画笔当前位置绘制一条到相对于画笔当前位置的x,y点的直线。
H x 水平线 绘制一条到指定点(x坐标由参数指定,y坐标为虚拟画笔当前的纵坐标)的水平线。
h x 水平线 与H相同,但是坐标点为相对于画笔坐标的位置。
V y 垂直线 绘制一条到指定点(x坐标为虚拟画笔当前横坐标,y坐标由参数指定)的垂直线。
v y 垂直线 与V相同,但是坐标点为相对于画笔坐标的位置。
C x1,y1 x2,y2 x,y 曲线 从画笔当前点到x,y点绘制一条三次贝塞尔曲线。x1,y1和x2,y2是曲线的开始和结束控制点,控制其如何弯曲。
c x1,y1 x2,y2 x,y 曲线 与C相同,但是坐标点为相对于画笔坐标的位置。
S x2,y2 x,y 平滑曲线缩写 从画笔位置到点x,y绘制一条三次贝塞尔曲线。x2,y2为结束控制点。开始控制点与前一条曲线的结束控制点相同。
s x2,y2 x,y 平滑曲线缩写 与S相同,但是坐标点为相对于画笔坐标的位置。
Q x1,y1 x,y 二次贝塞尔曲线 从画笔当前坐标到x,y点绘制一条二次贝塞尔曲线。x1,y1是控制曲线如何弯曲的控制点。
q x1,y1 x,y 二次贝塞尔曲线 与Q相同,但是坐标点为相对于画笔坐标的位置。
T x,y 平滑二次贝塞尔曲线缩写 从画笔位置到点x,y绘制一条三次贝塞尔曲线。控制点与所使用的的最后一个控制点相同。
t x,y 平滑二次贝塞尔曲线缩写 与T相同,但是坐标点为相对于画笔坐标的位置。
A rx,ry x-axis-rotation large-arc-flag,sweepflag x,y 椭圆弧 从当前点到x,y点绘制一条椭圆弧。rx和ry为椭圆在x和y方向上的半径。x-rotation确定圆弧围绕x轴旋转的角度。当rx和ry的值不同时,它才会有效果。large-arc-flag似乎没有被使用(可以为0或1)。值(0或1)都不会改变圆弧。
a rx,ry x-axis-rotation large-arc-flag,sweepflag x,y 椭圆弧 与A相同,但是坐标点为相对于画笔坐标的位置。
Z   闭合路径 通过从当前点到第一个点绘制一条线来关闭路径。
z   闭合路径 通过从当前点到第一个点绘制一条线来关闭路径。