# 2D绘图
[render2d](https://vjmap.com/map3d/api/modules/render2d.html) 是一个`Canvas`二维渲染的命名空间，里面包含了Canvas2D图形的渲染引擎、图形绘制及管理、图形（包含文字）动画管理、事件管理等。主要用于通过创建2D图形给三维场景中创建`纹理材质`。

## 做为`2d绘图渲染材质`使用

通过 [createRender2dTexture](https://vjmap.com/map3d/api/functions/createRender2dTexture.html) 创建 `2d绘图渲染材质`，通过`texture`获取材质。

```js
let image = await vjmap3d.loadImage(env.assetsPath + "image/imgbg2.png");
let elements = [];
// 增加image做为底图
elements.push(new vjmap3d.render2d.Image({
    style: {
        x: 0,
        y: 0,
        image: image,
        width: 270, // 像素宽，这里是图片像素宽高定的
        height: 250 // 像素高，这里是图片像素宽高定的
    }
}))
// 增加文本
elements.push(new vjmap3d.render2d.Text({
    style: {
        x: 138,
        y: 100,
        text: "VJMAP",
        fill: "#0ff",
        font: '50px Arial',
        verticalAlign: "middle",
        align: "center",
    }
}))
// 创建2d渲染材质
let renderTexture = vjmap3d.createRender2dTexture({
    autoCanvasSize: false, // 是否根据绘制的内容计算渲染的大小
    sharedCanvas: true, // 是否为了提高效率共享一个canvas（仅在 autoCanvasSize:true 且未设 canvasWidth 时生效，此处不起作用）
    canvasWidth: 270, // 像素宽，这里是根据底图的像素宽高定的
    canvasHeight: 250, // 像素高，这里是根据底图的像素宽高定的
    elements: elements,
});
let geoW = 2, geoH = 2;
let geom = new THREE.PlaneGeometry(geoW, geoH);
let mat = new THREE.MeshStandardMaterial({
    map: renderTexture.texture() // 获取材质对象
})
let mesh = new THREE.Mesh(geom, mat);
mesh.position.set(0, 1, 0);
app.scene.add(mesh);
```

## 通过`canvas`使用
可直接创建一个`canvas`，在canvas上面进行绘图。把此`canvas`做为`Marker2D`、`Marker3D`、`Popup2D`的`div`元素使用。

> 注意：一个元素只能属于一个 `Group`——`group.add(el)` 会先把它从原来的 Group 中移出。下例若复用上面已交给 `createRender2dTexture` 的 `elements`，它们会被移出纹理的 Group（纹理内容随之丢失）；两处都要显示时请分别创建元素。

```js
let canvas = document.createElement("canvas");
canvas.width = 270;
canvas.height = 250;
let render = vjmap3d.render2d.init(canvas);
let group = new vjmap3d.render2d.Group();
render.add(group);
for(let n = 0; n < elements.length; n++) {
    group.add(elements[n])
}
let marker = new vjmap3d.Marker2D({
    element: canvas,
    anchor: "bottom"
})
marker.setPosition(-5, 0, 3);
marker.addTo(app);
```

<mapFrame>
<pre>
let svc = new vjmap3d.Service(env.serviceUrl, env.accessToken);
let app = new vjmap3d.App(svc, {
    container: "map", // 容器id
    scene: {
        gridHelper: { visible: true } // 是否显示坐标网格
    },
    camera: {  // 相机设置
        viewHelper: { enable: true, position: "leftBottom" } // 是否显示视角指示器
    },
    control: { leftButtonPan: true } // 设置为左键用于平移 (同时右键将用于旋转) 和地图2d使用习惯一样
})
let image = await vjmap3d.loadImage(env.assetsPath + "image/imgbg2.png");
let elements = [];
// 增加image做为底图
elements.push(new vjmap3d.render2d.Image({
    style: {
        x: 0,
        y: 0,
        image: image,
        width: 270, // 像素宽，这里是图片像素宽高定的
        height: 250 // 像素高，这里是图片像素宽高定的
    }
}))
elements.push(new vjmap3d.render2d.Text({
    style: {
        x: 138,
        y: 100,
        text: "VJMAP",
        fill: "#0ff",
        font: '50px Arial',
        verticalAlign: "middle",
        align: "center",
    }
}))
// 做为2d绘图渲染材质使用
let renderTexture = vjmap3d.createRender2dTexture({
    autoCanvasSize: false, // 是否根据绘制的内容计算渲染的大小
    sharedCanvas: true, // 是否为了提高效率共享一个canvas（仅在 autoCanvasSize:true 且未设 canvasWidth 时生效，此处不起作用）
    canvasWidth: 270, // 像素宽，这里是根据底图的像素宽高定的
    canvasHeight: 250, // 像素高，这里是根据底图的像素宽高定的
    elements: elements,
});
let geoW = 2, geoH = 2;
let geom = new THREE.PlaneGeometry(geoW, geoH);
let mat = new THREE.MeshStandardMaterial({
    map: renderTexture.texture()
})
let mesh = new THREE.Mesh(geom, mat);
mesh.position.set(0, 1, 0);
app.scene.add(mesh);
// 通过`canvas`使用（注意：下面 group.add 会把 elements 从上面纹理的 Group 中移走——一个元素只能属于一个 Group，实际两处都用请分别创建元素）
let canvas = document.createElement("canvas");
canvas.width = 270;
canvas.height = 250;
let render = vjmap3d.render2d.init(canvas);
let group = new vjmap3d.render2d.Group();
render.add(group);
for(let n = 0; n < elements.length; n++) {
    group.add(elements[n])
}
let marker = new vjmap3d.Marker2D({
    element: canvas,
    anchor: "bottom"
})
marker.setPosition(-5, 0, 3);
marker.addTo(app);
</pre>
</mapFrame>

## 基本用法

以创建圆为例, 建了一个圆心在 [100, 200] 位置，半径为 10 像素的圆:
```js
let el = new render2d.Circle({
    shape: {
        cx: 100,
        cy: 200,
        r: 10
    },
    style: {
        fill: 'none',
        stroke: '#F00'
    }
});
```

### 修改图形元素属性

使用 元素的 attr(key, value) 的形式修改，如
```js
let circle = new render2d.Circle({
    shape: {
        cx: 100,
        cy: 200,
        r: 10
    }
});
circle.attr('shape', {
    r: 50 // 只更新 半径为50。cx、cy 将保持不变。
});
```

### 图形、组添加

```js
//添加分组
var group = new render2d.Group();
//添加图形
var rect = new render2d.Rect({
    shape:{
        x:0,
        y:0,
        width:100,
        height:100
    }
});
group.add(rect)
```

### 支持图形
`render2d` 封装了常用的图形，可以直接通过new render2d.xxx({})调用；并且开放了自定义图形方法，通过 `render2d.Path.extend` 拓展自己需要的图形（注意大写 `Path`；小写的 `render2d.path` 是 SVG 路径工具模块）。

- [Arc](https://vjmap.com/map3d/api/classes/render2d.Arc.html) 实心圆、半圆
- [BezierCurve](https://vjmap.com/map3d/api/classes/render2d.BezierCurve.html) 贝塞尔曲线
- [Circle](https://vjmap.com/map3d/api/classes/render2d.Circle.html) 实心圆、圆环
- [Image](https://vjmap.com/map3d/api/classes/render2d.Image.html)图片
- [Isogon](https://vjmap.com/map3d/api/classes/render2d.Isogon.html)正多边形
- [Line](https://vjmap.com/map3d/api/classes/render2d.Line.html)直线
- [Polygon](https://vjmap.com/map3d/api/classes/render2d.Polygon.html)多边形区域
- [Polyline](https://vjmap.com/map3d/api/classes/render2d.Polyline.html)多折线
- [Rect](https://vjmap.com/map3d/api/classes/render2d.Rect.html)矩形
- [Sector](https://vjmap.com/map3d/api/classes/render2d.Sector.html)扇形、空心扇形
- [Text](https://vjmap.com/map3d/api/classes/render2d.Text.html)文字
- [Ellipse](https://vjmap.com/map3d/api/classes/render2d.Ellipse.html)椭圆
- [Isogon](https://vjmap.com/map3d/api/classes/render2d.Isogon.html)等角多边形
- [Rose](https://vjmap.com/map3d/api/classes/render2d.Rose.html)玫瑰状
- [Star](https://vjmap.com/map3d/api/classes/render2d.Star.html)星星状
- [Droplet](https://vjmap.com/map3d/api/classes/render2d.Droplet.html)水滴状
- [Heart](https://vjmap.com/map3d/api/classes/render2d.Heart.html)心状
- [Ring](https://vjmap.com/map3d/api/classes/render2d.Ring.html)圆环
- [Trochoid](https://vjmap.com/map3d/api/classes/render2d.Trochoid.html)内外旋轮曲线

## 自定义图形
通过继承自[path](https://vjmap.com/map3d/api/classes/render2d.Path-1.html)，实现自定义图形的绘制

```js
var triangleSelf = render2d.Path.extend({
    type: 'triangleSelf',
    shape: {
        x: 0,
        y: 0,
        width: 0,
        height: 0
    },
    buildPath: function (ctx, shape) {
        var x = shape.x;
        var y = shape.y;
        var height = shape.height;
        var width = shape.width;
        ctx.moveTo(x,y);
        ctx.lineTo(x+width/2,y+height);
        ctx.lineTo(x-width/2,y+height);
        ctx.closePath();
    }
})
//使用
var sf = new triangleSelf({
    shape: {
        x: 200,
        y: 0,
        width: 100,
        height: 100
    }
})
```

## 事件
通过el.on()绑定事件，el.off()取消绑定事件；**group也可绑定事件，触发分组内具体对象才会触发**

- 支持事件

`'click'、 'dblclick'、 'mousedown'、 'mouseup'、 'mousemove'、 'mouseover'、 'mouseout'、 'mousewheel'、 'contextmenu'`，以及拖拽族 `'drag'、 'dragstart'、 'dragend'、 'dragenter'、 'dragleave'、 'dragover'、 'drop'`（被拖动的元素需设 `draggable: true`）

## 动画

动画主要分成两种`animate`和`animateTo`；`animate`可以监测动画执行，可以在during中控制其他相关联动和一些处理，并可以对某些属性设定循环

### animateTo

```js
el.animateTo(target, cfg)
```

`cfg` 为 `ElementAnimateConfig` 配置对象：

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| target | Object | \-- | 要动画到的目标属性 |
| cfg.duration | number | 500 | 动画时长，单位毫秒 |
| cfg.delay | number | 0 | 动画延迟执行的时长，单位毫秒 |
| cfg.easing | string | 'linear' | 缓动函数名称，支持的名称参见缓动函数 |
| cfg.done | Function | \-- | 动画执行完成后的回调函数 |
| cfg.during | Function | \-- | 每帧回调 `(percent) => void` |
| cfg.aborted | Function | \-- | 动画被中止时的回调 |
| cfg.force | boolean | false | 对于相同的属性，是否强制执行 |
| cfg.additive | boolean | false | 是否使用叠加动画 |

> 注意：`animateTo` 第二参是**配置对象**（`{duration, delay, easing, done, ...}`），不是旧版的位置参数 `(target, time, delay, easing, callback)`。

```js
let el = new render2d.Circle({
    shape: {
        cx: 100,
        cy: 200,
        r: 10
    },
    style: {
        fill: 'none',
        stroke: '#F00'
    }
});
el.animateTo({
    shape: {
        r: 50 // shape 的键须是该图形已有的键（Circle 为 cx/cy/r），写 width 对圆无效
    },
    style: {
        fill: 'red'
    },
    position: [10, 10]
}, {
    duration: 100,
    delay: 100,
    easing: 'cubicOut',
    done: function () {
        // done
    }
});
```

### animate

```js
el.animate('style', false)
.when(1000, {x: 10})
.delay(100)
.done(function () {
        // Animation done
})
.during(function(){
    
})
.start()
```

## 对象的销毁

离开页面或者组件不使用时及时销毁，节约内存开销

复制代码

 ```js
 let render = vjmap3d.render2d.init(canvas);
 // 
 render.dispose()
```

## API文档 

### render2d.init(dom, opts)

得到一个 render2d 的实例。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| dom | `HTMLElement` |   | render2d 容器，在调用该方法时，应该已有宽度和高度。 |
| opts | `Object` |   | 配置项 |
| opts.renderer | `string` | `'canvas'` | 渲染方式，支持：`'canvas'`、`'svg'` |
| opts.devicePixelRatio | `number` | 见描述 | 画布大小与容器大小之比，仅当 `renderer` 为 `'canvas'` 时有效。`dom` 为 `<canvas>` 时默认 `1`；`dom` 为容器元素时默认 `window.devicePixelRatio`。 |
| opts.width | `number|string` | 见描述 | 画布逻辑宽度。`dom` 为 `<canvas>` 时默认取 `canvas.width`（之后 canvas 实际像素宽被设为 `width × dpr`），**不支持 `'auto'`**（会得到 NaN）；`dom` 为容器元素时默认/`'auto'` 取容器宽度。 |
| opts.height | `number|string` | 见描述 | 画布逻辑高度，规则同 `opts.width`（`<canvas>` 时默认取 `canvas.height`）。 |
| opts.useCoarsePointer | `'auto'|boolean` | `'auto'` | 是否扩大可点击元素的响应范围。`'auto'` 表示对移动设备开启；`true` 表示总是开启；`false` 表示总是不开启。 |
| opts.pointerSize | `number` | `44` | 扩大元素响应范围的像素大小，配合 `opts.useCoarsePointer` 使用。 |

### render2d.Animatable.animate(path, loop)

创建一个动画对象。动画不会立即开始，如需立即开始，需调用 render2d.Animator.start

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| path | `string` |   | 对该对象的哪个属性执行动画，**只支持一级键**，如 `xxx.animate('style', true)` 表示对 `xxx.style` 执行动画（不支持 `'a.b'` 这类多级路径：内部直接取 `this['a.b']`，得到 `undefined`）。 |
| loop | `boolean` | `false` | 是否循环动画。 |

#### 例子

```js
el.animate('style', false)
    .when(1000, {x: 10})
    .done(function () {
         // Animation done
    })
    .start()
```

### render2d.Animatable.animateTo

为属性设置动画。

```js
el.animateTo(target, cfg)
```

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| target | `Object` |   | 设置动画的对象，应为 `this` 的属性。 |
| cfg | `ElementAnimateConfig` |   | 动画配置对象。 |
| cfg.duration | `number` | `500` | 动画时长，单位毫秒。 |
| cfg.delay | `number` | `0` | 动画延迟执行的时长，单位毫秒。 |
| cfg.easing | `string` | `'linear'` | 缓动函数名称。 |
| cfg.done | `Function` |   | 动画执行完成后的回调函数。 |
| cfg.during | `Function` |   | 每帧回调 `(percent) => void`。 |
| cfg.aborted | `Function` |   | 动画被中止时的回调。 |
| cfg.force | `boolean` | `false` | 对于相同的属性，是否强制执行（也就是不直接结束动画）。 |
| cfg.additive | `boolean` | `false` | 是否使用叠加动画。 |

#### 例子

```js
// Animate position
el.animateTo({
    position: [10, 10]
}, {
    done: function () {
        // done
    }
});

// Animate shape, style and position in 100ms, delayed 100ms,
// with cubicOut easing（以 Circle 为例：shape 的键须是该图形已有的键，圆为 cx/cy/r）
el.animateTo({
    shape: {
        r: 50
    },
    style: {
        fill: 'red'
    },
    position: [10, 10]
}, {
    duration: 100,
    delay: 100,
    easing: 'cubicOut',
    done: function () {
        // done
    }
});
```

### render2d.Animatable.stopAnimation(scope, forwardToLast)

停止动画。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| scope | `string` |   | 只停止该 `scope` 的动画；不传则停止全部动画。 |
| forwardToLast | `boolean` | `false` | 是否将动画跳到最后一帧。 |

> 注意：第一参是 `scope`（字符串）。直接调用 `stopAnimation(true)` 不会停止任何动画——要跳到最后一帧需写 `stopAnimation(undefined, true)` 或 `stopAnimation(null, true)`。

### render2d.BoundingRect

包围盒。

#### 构造函数

`render2d.BoundingRect(x, y, width, height)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` |   | 左上角横坐标。 |
| y | `number` |   | 左上角纵坐标。 |
| width | `number` |   | 包围盒宽度。 |
| height | `number` |   | 包围盒高度。 |

### render2d.BoundingRect.clone()

得到包围盒的副本。

#### 返回值

新的包围盒，类型：render2d.BoundingRect。

### render2d.BoundingRect.contain(x, y)

判断坐标 `(x, y)` 是否在图形上。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` |   | 横坐标。 |
| y | `number` |   | 纵坐标。 |

#### 返回值

返回是否在图形上，类型：`boolean`。

### render2d.BoundingRect.copy(other)

从另一个包围盒复制属性。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| other | render2d.BoundingRect |   | 另一个包围盒。 |

### render2d.BoundingRect.intersect(other)

判断两个包围盒是否相交。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| other | [`render2d.BoundingRect`](https://vjmap.com/map3d/api/classes/render2d.BoundingRect.html) |   | 另一个包围盒。 |

#### 返回值

是否相交，类型：`boolean`。

### render2d.BoundingRect.union(other)

与另一个包围盒求并集，将结果更新到原本的包围盒。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| other | `render2d.BoundingRect |   | 另一个包围盒。 |

### render2d.color

**静态类**

颜色。

### render2d.color.lift(color, level)

提亮颜色。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>color</td><td><code class="highlighter-rouge">string</code></td><td>&nbsp;</td><td>原始颜色。</td></tr><tr><td>level</td><td><code class="highlighter-rouge">number</code></td><td>&nbsp;</td><td>提亮指数，应介于 <code class="highlighter-rouge">0</code> 与 <code class="highlighter-rouge">1</code> 之间，如果小于 <code class="highlighter-rouge">0</code>，颜色也会被提亮。</td></tr></tbody></table>

#### 返回值

提亮后的颜色，类型：`string`，形如 `rgba(...)` 或 `rgb(...)`。

### render2d.color.lerp(normalizedValue, colors, fullOutput)

快速得到渐变色 `colors` 在 `normalizedValue` 位置的颜色，返回混合后的颜色。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>normalizedValue</td><td><code class="highlighter-rouge">number</code></td><td>&nbsp;</td><td>位置，范围 <code class="highlighter-rouge">0</code> 到 <code class="highlighter-rouge">1</code>。</td></tr><tr><td>colors</td><td><code class="highlighter-rouge">string[]</code></td><td>&nbsp;</td><td>渐变色的数组。</td></tr><tr><td>fullOutput</td><td><code class="highlighter-rouge">boolean</code></td><td><code class="highlighter-rouge">false</code></td><td>如果为 <code class="highlighter-rouge">true</code>，则返回包含 <code class="highlighter-rouge">color</code>、 <code class="highlighter-rouge">leftIndex</code>、 <code class="highlighter-rouge">rightIndex</code>、 <code class="highlighter-rouge">value</code> 的 <code class="highlighter-rouge">Object</code>，否则返回颜色。</td></tr></tbody></table>

#### 返回值

如果 `fullOutput` 为 `true`，则返回包含 `color`、 `leftIndex`、 `rightIndex`、 `value` 的 `Object`，否则返回颜色。类型：`Object|string`。

### render2d.color.modifyAlpha(color, alpha)

修改颜色的透明度维度。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>color</td><td><code class="highlighter-rouge">string</code></td><td>&nbsp;</td><td>颜色字符串。</td></tr><tr><td>alpha</td><td><code class="highlighter-rouge">number</code></td><td>&nbsp;</td><td>新的透明度。</td></tr></tbody></table>

#### 返回值

RGBA 形式的颜色字符串。

### render2d.color.modifyHSL(color, h, s, l)

修改颜色的 HSL 维度。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>color</td><td><code class="highlighter-rouge">string</code></td><td>&nbsp;</td><td>颜色字符串，可以不是 <code class="highlighter-rouge">hsl(...)</code> 形式的。</td></tr><tr><td>h</td><td><code class="highlighter-rouge">null|number</code></td><td>&nbsp;</td><td>如果为 <code class="highlighter-rouge">null</code>，则不改变。</td></tr><tr><td>s</td><td><code class="highlighter-rouge">null|number</code></td><td>&nbsp;</td><td>如果为 <code class="highlighter-rouge">null</code>，则不改变。</td></tr><tr><td>l</td><td><code class="highlighter-rouge">null|number</code></td><td>&nbsp;</td><td>如果为 <code class="highlighter-rouge">null</code>，则不改变。</td></tr></tbody></table>

#### 返回值

RGBA 形式的颜色字符串。

### render2d.color.parse(colorStr, rgbaArr)

将各种形式的颜色字符串，转成 RGBA 形式的数组输出。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>colorStr</td><td><code class="highlighter-rouge">string</code></td><td>&nbsp;</td><td>可以是：<code class="highlighter-rouge">'rgb(100, 0, 0)'</code>、 <code class="highlighter-rouge">'rgba(0, 100, 0, 0.4)'</code>、<code class="highlighter-rouge">'red'</code>、 <code class="highlighter-rouge">'#F00'</code>、 <code class="highlighter-rouge">'#F60000'</code>、 <code class="highlighter-rouge">'hsla(270, 60%, 70%, 0.2)'</code>、 <code class="highlighter-rouge">'hsl(270, 60%, 70%)'</code> 之类的形式。</td></tr><tr><td>rgba</td><td><code class="highlighter-rouge">number[]</code></td><td>&nbsp;</td><td>长度为 <code class="highlighter-rouge">4</code> 的数组，分别表示红色、绿色、蓝色、不透明度，前三者的取值范围是 <code class="highlighter-rouge">0</code> 到 <code class="highlighter-rouge">255</code>，不透明度的取值范围是 <code class="highlighter-rouge">0</code> 到 <code class="highlighter-rouge">1</code>。</td></tr></tbody></table>

#### 返回值

如果 `colorStr` 不是合法的颜色，则返回 `undefined`，否则返回 `rgbaArr`。类型：`undefined|number[]`。

> 如果希望知道颜色字符串是否合法，应该使用返回值；如果希望在任何情况下都得到颜色，则应该使用参数 `rgbaArr`，如果颜色字符串不合法，会返回 `[0, 0, 0, 1]`，也就是黑色。

### render2d.color.toHex(color)

将颜色转为十六进制的长度为 `6` 的字符串，开头没有 `'#'`。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>color</td><td><code class="highlighter-rouge">string</code></td><td>&nbsp;</td><td>颜色字符串。</td></tr></tbody></table>

#### 返回值

十六进制的颜色，类型：`string`。

#### 例子

`render2d.color.toHex('rgb(200, 0, 0)')` 返回 `'c80000'`。

### render2d.color.stringify(arrColor, type)

将数组形式的颜色转为字符串。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>arrColor</td><td><code class="highlighter-rouge">number[]</code></td><td>&nbsp;</td><td>可以是长度为 <code class="highlighter-rouge">3</code> 或 <code class="highlighter-rouge">4</code> 的数组，如 <code class="highlighter-rouge">[255, 0, 0, 0.2]</code>。</td></tr><tr><td>type</td><td><code class="highlighter-rouge">string</code></td><td>&nbsp;</td><td><code class="highlighter-rouge">arrColor</code> 的形式，可以为：<code class="highlighter-rouge">'rgb'</code>、 <code class="highlighter-rouge">'rgba'</code>、 <code class="highlighter-rouge">'hsv'</code>、 <code class="highlighter-rouge">'hsva'</code>、 <code class="highlighter-rouge">'hsl'</code>、 <code class="highlighter-rouge">'hsla'</code>。</td></tr></tbody></table>

#### 返回值

颜色字符串，如：`'rgba(255, 0, 0, 0.2)'`，类型：`string`。

### render2d.Displayable

**继承自 [render2d.Element](https://vjmap.com/map3d/api/classes/render2d.Element.html)**

**抽象类**

可显示的元素。

> **注意：**
> 
> `render2d.Displayable` 是一个抽象类，所以不要在代码中 `new render2d.Displayable(opts)`，这里的构造函数只是用于表明其子类（如 [Rect](https://vjmap.com/map3d/api/classes/render2d.Rect.html) 等）构造函数参数的共同部分。

元素初始化之后，需要通过 render2d.Element.attr 修改属性。

#### 构造函数

`render2d.Displayable(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts.culling | `boolean` | `false` | 是否进行裁剪。 |
| opts.cursor | `string` | `'pointer'` | 鼠标移到元素上时的鼠标样式。 |
| opts.draggable | `boolean` | `false` | 图形是否可拖曳。 |
| opts.invisible | `boolean` | `false` | 图形是否不可见，为 `true` 时不绘制图形，但是仍能触发鼠标事件。 |
| opts.progressive | `boolean` | `false` | 是否渐进式渲染。当图形元素过多时才使用。 |
| opts.incremental | `boolean` | `false` | 是否增量式渲染。增量式渲染的意思是，在每帧渲染的时候，不擦除之前帧的该元素直接再次渲染。增量渲染的元素在单独的层中进行渲染。SVG 模式不支持。具体请参考[源码](https://github.com/ecomfe/zrender/blob/master/src/graphic/IncrementalDisplayable.ts)。 |
| opts.ignoreCoarsePointer | `boolean` | `false` | 是否忽略增加响应范围。默认情况下，在移动设备上，为了提高用户体验，可点击元素的响应范围会被扩大处理。如果某些元素不希望扩大响应范围，则应设为 `true`。 |
| opts.rectHover | `boolean` | `false` | 是否使用包围盒检验鼠标是否移动到物体。`false` 则检测元素实际的内容。 |
| opts.silent | `boolean` | `false` | 是否**不**响应鼠标事件：`true` 时该元素不触发事件，事件穿透到下层元素。 |
| opts.style.fill | `string` | `'#000'` | 填充样式。 |
| opts.style.stroke | `string` | `null` | 描边样式。 |
| opts.style.opacity | `number` | `1` | 不透明度。 |
| opts.style.lineDash | `number[]` | `null` | 描边虚线样式，参考 [SVG stroke-dasharray](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)。 |
| opts.style.lineDashOffset | `number` | `null` | 描边虚线偏移，参考 [SVG stroke-dashoffset](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dashoffset)。 |
| opts.style.shadowBlur | `number` | `0` | 阴影模糊大小。 |
| opts.style.shadowColor | `string` | `'#000'` | 阴影颜色。 |
| opts.style.shadowOffsetX | `number` | `0` | 阴影横向偏移。 |
| opts.style.shadowOffsetY | `number` | `0` | 阴影纵向偏移。 |
| opts.style.lineWidth | `number` | `1` | 线宽。 |
| opts.style.strokeNoScale | `boolean` | `false` | 描边粗细不随缩放而改变，`false` 则会根据缩放同比例缩放描边粗细。 |
| opts.style.text | `string` | `null` | 文字内容。⚠️ **仅对 `render2d.Text` 有效**；在 `Rect`/`Circle` 等宿主图形的 `style` 里写 `text`/字体键不会显示文字，宿主图形挂文字请用 `textContent` + `textConfig`（见下方说明）。 |
| opts.style.font | `string` | `null` | 文字样式（仅 `render2d.Text`），由 `fontSize`、 `fontFamily`、 `fontStyle`、 `fontWeight` 组成，建议分别设置这几项而非直接设置 `font`。 |
| opts.style.fontStyle | `string` | `null` | 同 [CSS font-style](https://developer.mozilla.org/en-US/docs/Web/CSS/font-style)（仅 `render2d.Text`）。 |
| opts.style.fontWeight | `string` | `null` | 同 [CSS font-weight](https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight)（仅 `render2d.Text`）。 |
| opts.style.fontSize | `string` | `null` | 同 [CSS font-size](https://developer.mozilla.org/en-US/docs/Web/CSS/font-size)（仅 `render2d.Text`）。 |
| opts.style.fontFamily | `string` | `null` | 同 [CSS font-family](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family)（仅 `render2d.Text`）。 |
::: warning 文字样式键名（已对照发布包 `TextStyleProps` 更正）
本包内置的 2D 引擎是 **zrender 新版风格**：文字不再是宿主图形的 `style.textXxx` 平铺键，而是独立的 `render2d.Text` 元素（挂到宿主用 `opts.textContent` + `opts.textConfig`）。下面旧表里的 `textFill`/`textStroke`/`textAlign`/`textPosition`/`textDistance`/`textPadding`/`textRect`/`textOrigin`/`transformText`/`textRotation`/`textBoxShadow*`/`textBorder*`/`textBackgroundColor`/`truncate.outer*` 等键在本包 d.ts 与运行时中**均不存在**，对应正确写法见下。
:::

**`render2d.Text`（或宿主 `textContent`）的 `style`（`TextStyleProps`，键名）**：

| 键 | 类型 | 说明 |
|---|---|---|
| `text` | `string` | 文字内容 |
| `fill` / `stroke` | `string` | 文字填充 / 描边色（对应旧表 `textFill`/`textStroke`） |
| `align` / `verticalAlign` | `string` | 水平 / 垂直对齐（对应旧表 `textAlign`/`textVerticalAlign`） |
| `font` / `fontSize` / `fontFamily` / `fontStyle` / `fontWeight` / `textFont` | | 字体 |
| `lineHeight` | `number` | 行高（对应旧表 `textLineHeight`） |
| `width` / `height` | `number` | 宽 / 高（对应旧表 `textWidth`/`textHeight`；与 `overflow` 配合截断） |
| `padding` / `margin` | `number\|number[]` | 内 / 外边距（对应旧表 `textPadding`） |
| `backgroundColor` / `borderColor` / `borderWidth` / `borderRadius` | | 文字背景盒（对应旧表 `textBackgroundColor`/`textBorder*`） |
| `textShadowColor` / `textShadowBlur` / `textShadowOffsetX` / `textShadowOffsetY` | | 文字阴影（这几个保留 `text` 前缀，是真实键名） |
| `shadowColor` / `shadowBlur` / `shadowOffsetX` / `shadowOffsetY` | | 背景盒阴影（对应旧表 `textBoxShadow*`） |
| `overflow` / `lineOverflow` | `'none'\|'truncate'\|'break'` | 超出截断方式（`truncate` 对象写法不存在；宽度用 `width`） |
| `ellipsis` / `placeholder` / `truncateMinChar` | `string`/`number` | 截断省略号 / 最小保留（对应旧表 `truncate.ellipsis`/`truncate.placeholder`） |
| `rich` | `Object` | 富文本样式 |
| `x` / `y` / `opacity` / `fillOpacity` / `strokeOpacity` / `strokeNoScale` / `lineWidth` / `lineDash` / `lineDashOffset` / `borderDash` / `borderDashOffset` | | 位置与不透明度等 |

**宿主图形挂文字（`Path`/`Image`/`Rect` 等）**：`opts.textContent = new render2d.Text({style: {...}})` + `opts.textConfig = { position, rotation, offset, distance, origin, local, layoutRect, insideFill, insideStroke, outsideFill }`（`ElementTextConfig`，d.ts 可查）。旧表的 `textPosition`→`textConfig.position`、`textDistance`→`textConfig.distance`、`textRotation`→`textConfig.rotation`、`textOffset`→`textConfig.offset`、`textOrigin`→`textConfig.origin`、`textRect`→`textConfig.layoutRect`；`transformText` 无对应项（跟随变换由 `textConfig.local` 表达）。
| opts.style.blend | `string` | `'source-over'` | 混合模式，同 [Canvas globalCompositeOperation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation)。 |
| opts.zlevel | `number` | `0` | 决定绘画在哪层 Canvas 中。Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的 `zlevel`。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。`zlevel` 大的 Canvas 会放在 `zlevel` 小的 Canvas 的上面。 |
| opts.z | `number` | `0` | 控制图形的前后顺序。`z` 值小的图形会被 `z` 值大的图形覆盖。`z` 相比 `zlevel` 优先级更低，而且不会创建新的 Canvas。 |
| opts.z2 | `number` | `0` | 与 `z` 类似，优先级比 `z` 更低。 |

### render2d.Displayable.contain(x, y)

判断坐标 `(x, y)` 是否在图形上。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` |   | 横坐标。 |
| y | `number` |   | 纵坐标。 |

#### 返回值

返回是否在图形上，类型：`boolean`。

#### 相关

[render2d.Displayable.rectContain](https://vjmap.com/map3d/api/classes/render2d.Displayable.html#rectContain)。

### render2d.Displayable.dirty()[#](https://vjmap.com/map3d/api/classes/render2d.Displayable.html#dirty)

设为需要更新。

### [render2d.Displayable.getBoundingRect()](https://vjmap.com/map3d/api/classes/render2d.Displayable.html#getBoundingRect)

得到元素的包围盒。

#### 返回值

元素的包围盒，类型：[`render2d.BoundingRect`](https://vjmap.com/map3d/api/classes/render2d.BoundingRect.html)。

### [render2d.Displayable.rectContain(x, y)](https://vjmap.com/map3d/api/classes/render2d.Displayable.html#rectContain)

判断坐标 `(x, y)` 是否在图形包围盒内。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` |   | 横坐标。 |
| y | `number` |   | 纵坐标。 |

#### 返回值

返回是否在图形上，类型：`boolean`。

#### 相关

[render2d.Displayable.contain](https://vjmap.com/map3d/api/classes/render2d.Displayable.html#contain)

### [render2d.Arc](https://vjmap.com/map3d/api/classes/render2d.Arc.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

圆弧。

#### 构造函数

`render2d.Arc(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.r | `number` | `0` | 半径。 |
| opts.shape.startAngle | `number` | `0` | 起始弧度。 |
| opts.shape.endAngle | `number` | `Math.PI * 2` | 终止弧度。 |
| opts.shape.clockwise | `boolean` | `true` | 顺时针方向。 |

### [render2d.BezierCurve](https://vjmap.com/map3d/api/classes/render2d.BezierCurve.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

贝塞尔曲线。

#### 构造函数

`render2d.BezierCurve(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.x1 | `number` | `0` | 起始点横坐标。 |
| opts.shape.y1 | `number` | `0` | 起始点纵坐标。 |
| opts.shape.x2 | `number` | `0` | 终止点横坐标。 |
| opts.shape.y2 | `number` | `0` | 终止点纵坐标。 |
| opts.shape.cpx1 | `number` | `0` | 控制点横坐标。 |
| opts.shape.cpy1 | `number` | `0` | 控制点纵坐标。 |
| opts.shape.cpx2 | `number` |   | 第二控制点横坐标（可选；与 `cpy2` 同时设置时变为三次贝塞尔曲线，否则为二次）。 |
| opts.shape.cpy2 | `number` |   | 第二控制点纵坐标（可选）。 |
| opts.shape.percent | `number` | `1` | 已显示的百分比，用于绘制动画。 |

### [render2d.Circle](https://vjmap.com/map3d/api/classes/render2d.Circle.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

圆。

#### 构造函数

`render2d.Circle(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.r | `number` | `0` | 半径。 |

### [render2d.CompoundPath](https://vjmap.com/map3d/api/classes/render2d.CompoundPath.html)

**继承自 [render2d.Path](https://vjmap.com/map3d/api/classes/render2d.Path-1.html)**

复合路径。相当于多个路径的并集。

#### 构造函数

`render2d.CompoundPath(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape.paths | Path[] | `null` | 路径数组。 |

### [render2d.Droplet](https://vjmap.com/map3d/api/classes/render2d.Droplet.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

水滴。

#### 构造函数

`render2d.Droplet(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.width | `number` | `0` | 宽度。 |
| opts.shape.height | `number` | `0` | 高度。 |

### [render2d.Ellipse](https://vjmap.com/map3d/api/classes/render2d.Ellipse.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

椭圆。

#### 构造函数

`render2d.Ellipse(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.rx | `number` | `0` | 横向半径。 |
| opts.shape.ry | `number` | `0` | 纵向半径。 |

### [render2d.Heart](https://vjmap.com/map3d/api/classes/render2d.Heart.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

心形。

#### 构造函数

`render2d.Heart(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.width | `number` | `0` | 宽度。 |
| opts.shape.height | `number` | `0` | 高度。 |

### [render2d.Image](https://vjmap.com/map3d/api/classes/render2d.Image.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

图像。

#### 构造函数

`render2d.Image(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.style | `Object` |   | 样式。 |
| opts.style.image | `string|HTMLImageElement|HTMLCanvasElement` |   | 图片的内容，可以是图片的 URL，也可以是 [dataURI](https://tools.ietf.org/html/rfc2397)。 |
| opts.style.x | `number` |   | 图片左上角相对于父节点的横坐标。 |
| opts.style.y | `number` |   | 图片左上角相对于父节点的纵坐标。 |
| opts.style.width | `number` |   | 图片宽度。 |
| opts.style.height | `number` |   | 图片高度。 |

### [render2d.Isogon](https://vjmap.com/map3d/api/classes/render2d.Isogon.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

正多边形。

#### 构造函数

`render2d.Isogon(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.x | `number` | `0` | 圆心横坐标。 |
| opts.shape.y | `number` | `0` | 圆心纵坐标。 |
| opts.shape.r | `number` | `0` | 半径。 |
| opts.shape.n | `number` | `0` | 边数。 |

### [render2d.Line](https://vjmap.com/map3d/api/classes/render2d.Line.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

线段。

#### 构造函数

`render2d.Line(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.x1 | `number` | `0` | 起始点横坐标。 |
| opts.shape.y1 | `number` | `0` | 起始点纵坐标。 |
| opts.shape.x2 | `number` | `0` | 终止点横坐标。 |
| opts.shape.y2 | `number` | `0` | 终止点纵坐标。 |
| opts.shape.percent | `number` | `1` | 已显示的百分比，用于绘制动画。 |

### [render2d.Path](https://vjmap.com/map3d/api/classes/render2d.Path-1.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

路径。

#### 构造函数

`render2d.Path(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |

### [render2d.Path.extend(props)](https://vjmap.com/map3d/api/classes/render2d.Path-1.html)

扩展一个 `Path` 元素，用以生成比如星形，圆等。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.type | `string` |   | 类型，自定义的名称。⚠️ 仅作标识，**不会**写到实例上（实例 `type` 仍为 `'path'`）。 |
| opts.shape | `Object` | | 默认形状属性（实例未传的键取此默认值）。 |
| opts.style | `Object` | | 默认样式。 |
| opts.init | `Function` |   | 初始化时调用的函数。 |
| opts.buildPath | `Function` |   | 如何构建 `Path` 的函数，在绘制时候会调用。 |

> `extend` 实际只使用 `shape`/`style` 两个默认值键，其余**函数类型**的键（`buildPath`、`init`、`beforeBrush`、`afterBrush`、`getBoundingRect` 等）挂到子类原型上；非函数的其它键被忽略。

### [render2d.Polygon](https://vjmap.com/map3d/api/classes/render2d.Polygon.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

多边形。

#### 构造函数

`render2d.Polygon(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.points | `number[][]` | `0` | 每个元素是一个横纵坐标的数组。 |
| opts.shape.smooth | `number` | `0` | 圆滑程度，取值范围为 `0` 到 `1` 之间的数字，`0` 表示不圆滑（贝塞尔曲线插值）。**只接受数字**——本包不支持 `'spline'` 字符串，传字符串会算出 NaN 控制点。 |
| opts.shape.smoothConstraint | `number[][]` | `0` | 将计算出来的控制点约束在一个包围盒内。比如 `[[0, 0], [100, 100]]`，这个包围盒会与整个折线的包围盒做一个并集用来约束控制点。 |

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

多边形折线段。默认是不闭合的，如果需要闭合，请将最后一个点设为和第一个点同样的位置。

#### 构造函数

`render2d.Polyline(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.points | `number[][]` | `0` | 每个元素是一个横纵坐标的数组。 |
| opts.shape.smooth | `number` | `0` | 圆滑程度，取值范围为 `0` 到 `1` 之间的数字，`0` 表示不圆滑（贝塞尔曲线插值）。**只接受数字**——本包不支持 `'spline'` 字符串，传字符串会算出 NaN 控制点。 |
| opts.shape.smoothConstraint | `number[][]` | `0` | 将计算出来的控制点约束在一个包围盒内。比如 `[[0, 0], [100, 100]]`，这个包围盒会与整个折线的包围盒做一个并集用来约束控制点。 |

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

矩形。

#### 构造函数

`render2d.Rect(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.r | `number|number[]` | `0` | 用于创建圆角矩形。左上、右上、右下、左下角的半径依次为 r1、 r2、 r3、 r4。r 缩写为 1 相当于 \[1, 1, 1, 1\]；r 缩写为 \[1\] 相当于 \[1, 1, 1, 1\]；r 缩写为 \[1, 2\] 相当于 \[1, 2, 1, 2\]；r 缩写为 \[1, 2, 3\] 相当于 \[1, 2, 3, 2\]。 |
| opts.shape.x | `number` | `0` | 左上角的横坐标。 |
| opts.shape.y | `number` | `0` | 左上角的纵坐标。 |
| opts.shape.width | `number` | `0` | 宽度。 |
| opts.shape.height | `number` | `0` | 高度。 |

### [render2d.Rose](https://vjmap.com/map3d/api/classes/render2d.Rose.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

#### 构造函数

`render2d.Rose(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.r | `number[]` | `[]` | 半径。 |
| opts.shape.k | `number` | `0` | 玫瑰线参数，参见 [wiki](https://en.wikipedia.org/wiki/Rose_(mathematics))。 |
| opts.shape.n | `number` | `1` | 花瓣数。 |

### [render2d.Sector](https://vjmap.com/map3d/api/classes/render2d.Sector.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

扇形。

#### 构造函数

`render2d.Sector(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.r | `number` | `0` | 半径。 |
| opts.shape.r0 | `number` | `0` | 内半径。 |
| opts.shape.startAngle | `number` | `0` | 起始弧度。 |
| opts.shape.endAngle | `number` | `Math.PI * 2` | 终止弧度。 |
| opts.shape.clockwise | `boolean` | `true` | 顺时针方向。 |

### [render2d.Star](https://vjmap.com/map3d/api/classes/render2d.Star.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

星形。

#### 构造函数

`render2d.Star(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.n | `number` | `3` | 瓣数，如 `n` 等于 `5` 时，是我们熟悉的五角星。 |
| opts.shape.r | `number` | `0` | 半径。 |
| opts.shape.r0 | `number` | 自动计算 | 内半径。不设时自动计算：`n > 4` 取相隔外顶点连线的交点（`r·cos(2π/n)/cos(π/n)`），`n ≤ 4` 取 `r / 3`。 |

### [render2d.Text](https://vjmap.com/map3d/api/classes/render2d.Text.html)

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

文字。

#### 构造函数

`render2d.Text(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |

### [render2d.Trochoid](https://vjmap.com/map3d/api/classes/render2d.Trochoid.html)

内外旋轮曲线

**继承自 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)**

#### 构造函数

`render2d.Trochoid(opts)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项，继承得到的配置项参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html)。 |
| opts.shape | `Object` |   | 形状属性。 |
| opts.shape.cx | `number` | `0` | 圆心横坐标。 |
| opts.shape.cy | `number` | `0` | 圆心纵坐标。 |
| opts.shape.r | `number` | `0` | 半径。 |
| opts.shape.r0 | `number` | `0` | 内半径。 |
| opts.shape.d | `number` | `0` | 内外旋轮曲线参数，参见 [wiki](https://en.wikipedia.org/wiki/Trochoid)。 |
| opts.shape.location | `string` | `'out'` | `'out'` 或 `'in'`，表示曲线在内部还是外部（键名是 `location`，不是 `n`）。 |

### [render2d.Element](https://vjmap.com/map3d/api/classes/render2d.Element.html)

**抽象类**

元素，可以被添加到场景中。

> **注意：**
> 
> `render2d.Element` 是一个抽象类，所以不要在代码中 `new render2d.Element(opts)`，这里的构造函数只是用于表明其子类构造函数参数的共同部分。

### [render2d.Element.afterUpdate](https://vjmap.com/map3d/api/classes/render2d.Element.html#afterUpdate)

类型：`Function`，元素更新后的回调函数。

#### 相关

[render2d.Element.beforeUpdate](https://vjmap.com/map3d/api/classes/render2d.Element.html#beforeUpdate)。

### [render2d.Element.attr(key, value)](https://vjmap.com/map3d/api/classes/render2d.Element.html#attr)

设置元素属性。需要注意的是，应该始终调用该方法来修改属性，而不是直接 `element.xxx = ...` 这样的形式，因为后者不会重绘物体。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| key | `string|Object` |   | 设置的属性。可以是 `string` 类型的属性名称，或者 `Object` 类型的属性及其值。 |
| value | `*` |   | 属性值。 |

#### 例子

```
element.attr('position', [100, 200]);
element.attr({
    style: {
        fill: 'red'
    },
    shape: {
        x: 100
    }
});
```

### render2d.Element.beforeUpdate[#](https://vjmap.com/map3d/api/classes/render2d.Element.html#beforeUpdate)

类型：`Function`，元素更新前的回调函数。

#### 相关

[render2d.Element.afterUpdate](https://vjmap.com/map3d/api/classes/render2d.Element.html#afterUpdate)。

### render2d.Element.hide()[#](https://vjmap.com/map3d/api/classes/render2d.Element.html#hide)

隐藏元素，可以使用 [render2d.Element.show](https://vjmap.com/map3d/api/classes/render2d.Element.html#show) 恢复显示。

#### 相关

[render2d.Element.show](https://vjmap.com/map3d/api/classes/render2d.Element.html#show)。

### render2d.Element.removeClipPath()[#](https://vjmap.com/map3d/api/classes/render2d.Element.html#removeClipPath)

取消设置裁剪元素。

#### 相关

[render2d.Element.setClipPath](https://vjmap.com/map3d/api/classes/render2d.Element.html#setClipPath)。

### render2d.Element.setClipPath(clipPath)[#](https://vjmap.com/map3d/api/classes/render2d.Element.html#setClipPath)

设置裁剪元素，超出 `clipPath` 区域的部分将被裁剪掉。

一个元素只能被一个元素裁剪，如果要实现多个元素的裁剪，需要使用 [render2d.CompoundPath](https://vjmap.com/map3d/api/classes/render2d.CompoundPath.html)。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| clipPath | `Element` |   | 设置当前元素的裁剪元素。 |

#### 相关

[render2d.Element.removeClipPath](https://vjmap.com/map3d/api/classes/render2d.Element.html#removeClipPath)。

### render2d.Element.show()[#](https://vjmap.com/map3d/api/classes/render2d.Element.html#show)

显示元素。元素在默认情况下是显示状态，使用 [render2d.Element.hide](https://vjmap.com/map3d/api/classes/render2d.Element.html#hide) 隐藏后，可以使用此方法显示。

#### 相关

[render2d.Element.hide](https://vjmap.com/map3d/api/classes/render2d.Element.html#hide)。

### render2d.Element.traverse(cb, context)[#](https://vjmap.com/map3d/api/classes/render2d.Element.html#traverse)

深度优先遍历所有子孙节点（不含自身）。⚠️ 只有 `Group` 实现了遍历，普通图形元素上调用是空操作。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| cb | `Function` |   | 回调函数 `function (child) {}`：唯一参数是当前子孙元素，`this` 为 `context`；回调返回 `true` 时跳过该元素的子孙。 |
| context | `Object` |   | 执行回调函数的上下文。 |

### render2d.Eventful

支持事件的元素。

> ⚠️ `Eventful` 是内部混入类，`vjmap3d.render2d` 上**没有导出**（`new render2d.Eventful()` 会抛错）；下列方法通过 `Element`/`Group` 等图形元素使用，如 `el.on('click', cb)`。

### render2d.Eventful.isSilent(event)

该事件是否为静默（即**没有**绑定任何处理器）。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| event | `string` |   | 事件名。 |

#### 返回值

该事件没有绑定处理器时返回 `true`，类型：`boolean`。

### render2d.Eventful.off(event, handler)
解绑事件。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| event | `string` |   | 事件名。 |
| handler | `Function` |   | 响应函数。 |

#### 返回值

`this`。

### render2d.Eventful.on(event, handler, context)

绑定事件。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| event | `string` |   | 事件名。 |
| handler | `Function` |   | 响应函数。 |
| context | `Object` |   | 执行上下文。 |

#### 返回值

`this`。

### render2d.Eventful.one(event, handler, context)

⚠️ 本包的 `Eventful` **没有 `one` 方法**（`el.one(...)` 抛 TypeError）。需要单次触发时在回调里自行 `el.off(event, handler)`。

### render2d.Eventful.trigger(event)

触发事件。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| event | `string` |   | 事件名。 |

#### 返回值

`this`。

### render2d.Gradient

**抽象类**

渐变。

> **注意：**
> 
> `render2d.Gradient` 是一个抽象类，所以不要在代码中 `new render2d.Gradient(colorStops)`，这里的构造函数只是用于表明其子类构造函数参数的共同部分。

#### 构造函数

`render2d.Gradient(colorStops)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| colorStops | `Object[]` |   | 组成渐变色的颜色。每个颜色包括 `offset` 与 `color` 属性，前者表示渐变位置（类型：`number`），后者表示具体的颜色（类型：`string`） |

### render2d.Gradient.addColorStop(offset, color)

增加渐变色。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `offset` | `number` |   | 渐变位置。 |
| `color` | `string` |   | 颜色。 |

> 如果想要清除渐变色，可以使用 `this.colorStops = []`。

### [render2d.Group](https://vjmap.com/map3d/api/classes/render2d.Group.html)

**继承自 [render2d.Element](https://vjmap.com/map3d/api/classes/render2d.Element.html)**

组。Group 是一个容器，可以插入子节点，Group 的变换也会被应用到子节点上。

#### 构造函数

`render2d.Group()`

#### 例子

```
var g = new render2d.Group();
g.position[0] = 100;
g.position[1] = 100;
g.add(new render2d.Circle({
    shape: {   // 几何参数放 shape（圆为 cx/cy/r），不是 style
        cx: 100,
        cy: 100,
        r: 20,
    }
}));
```

### render2d.Group.add(child)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#add)

添加子节点到最后。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| child | [`Element`](https://vjmap.com/map3d/api/classes/render2d.Element.html#) |   | 待添加的元素。 |

### 返回值

`this`。

### render2d.Group.addBefore(child, nextSibling)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#addBefore)

添加子节点到 `nextSibling` 之前。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| child | [`Element`](https://vjmap.com/map3d/api/classes/render2d.Element.html#) |   | 待添加的元素。 |
| nextSibling | [`Element`](https://vjmap.com/map3d/api/classes/render2d.Element.html#) |   | 已经在 Group 中的元素。 |

### 返回值

`this`。

#### 相关

[render2d.Group.add](https://vjmap.com/map3d/api/classes/render2d.Group.html#add)、[render2d.Group.remove](https://vjmap.com/map3d/api/classes/render2d.Group.html#remove)。

### render2d.Group.childAt(idx)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#childAt)

返回特定序号的子元素，类型：[`Element`](https://vjmap.com/map3d/api/classes/render2d.Element.html#)。

#### 相关

[render2d.Group.childOfName](https://vjmap.com/map3d/api/classes/render2d.Group.html#childOfName)、 [render2d.Group.children](https://vjmap.com/map3d/api/classes/render2d.Group.html#children)。

### render2d.Group.childCount()[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#childCount)

返回子元素个数，类型：`number`。

### render2d.Group.childOfName(name)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#childOfName)

返回特定名字的子元素，类型：[`Element`](https://vjmap.com/map3d/api/classes/render2d.Element.html#)。

#### 相关

[render2d.Group.childAt](https://vjmap.com/map3d/api/classes/render2d.Group.html#childAt)、 [render2d.Group.children](https://vjmap.com/map3d/api/classes/render2d.Group.html#children)。

### render2d.Group.children()[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#children)

返回所有子元素，类型：[`Element[]`](https://vjmap.com/map3d/api/classes/render2d.Element.html#)。

#### 相关

[render2d.Group.childAt](https://vjmap.com/map3d/api/classes/render2d.Group.html#childAt)、 [render2d.Group.childOfName](https://vjmap.com/map3d/api/classes/render2d.Group.html#childOfName)。

### render2d.Group.dirty()[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#dirty)

将组设为需要更新。

### render2d.Group.eachChild(cb, context)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#eachChild)

遍历所有子节点。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| cb | `Function` |   | 回调函数。 |
| context | `Object` |   | 执行回调函数的上下文。 |

### render2d.Group.getBoundingRect(includeChildren)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#getBoundingRect)

得到 `includeChildren` 或组内所有元素的包围盒。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| includeChildren | [`render2d.Element[]`](https://vjmap.com/map3d/api/classes/render2d.Element.html#) |   | 组内元素的子集。如果 `includeChildren` 未设置，则获取所有元素的包围盒，否则获得 `includeChildren` 的包围盒。 |

### 返回值

`includeChildren` 或组内所有元素的包围盒，类型：[`render2d.BoundingRect`](https://vjmap.com/map3d/api/classes/render2d.BoundingRect.html)。

### render2d.Group.remove(child)[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#remove)

移除子节点。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| child | [`render2d.Element`](https://vjmap.com/map3d/api/classes/render2d.Element.html#) |   | 待移除的元素。 |

#### 相关

[render2d.Group.add](https://vjmap.com/map3d/api/classes/render2d.Group.html#add)、 [render2d.Group.removeAll](https://vjmap.com/map3d/api/classes/render2d.Group.html#removeAll)。

### render2d.Group.removeAll()[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#removeAll)

移除所有子节点。

#### 相关

[render2d.Group.add](https://vjmap.com/map3d/api/classes/render2d.Group.html#add)、 [render2d.Group.remove](https://vjmap.com/map3d/api/classes/render2d.Group.html#remove)。

### render2d.Group.silent[#](https://vjmap.com/map3d/api/classes/render2d.Group.html#silent)

类型：`boolean`，默认值：`false`，所有子孙元素是否响应鼠标事件。

### [render2d.LinearGradient](https://vjmap.com/map3d/api/classes/render2d.LinearGradient.html)

**继承自 `render2d.Gradient`
线性渐变。

#### 构造函数

`render2d.LinearGradient(x, y, x2, y2, colorStops, globalCoord)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` | `0` | 渐变起始位置横坐标。 |
| y | `number` | `0` | 渐变起始位置纵坐标。 |
| x2 | `number` | `1` | 渐变终止位置横坐标。 |
| y2 | `number` | `0` | 渐变终止位置纵坐标（默认 `0`，即缺省为水平渐变）。 |
| colorStops | `Object[]` |   | 组成渐变色的颜色。每个颜色包括 `offset` 与 `color` 属性，前者表示渐变位置（类型：`number`），后者表示具体的颜色（类型：`string`） |
| globalCoord | `boolean` | `false` | 如果为 `false`，则 `x`、 `y`、 `x2`、 `y2` 是相对元素包围盒的比例（`0` 到 `1`）；如果为 `true`，则它们是与元素一致的绝对坐标（也就是说，原先用 `1` 表示物体最右侧，这时需要用元素实际宽度表示最右侧）。`colorStops` 的 `offset` 始终是 `0` 到 `1`，不受此参数影响。 |

### [render2d.matrix](https://vjmap.com/map3d/api/modules/render2d.matrix.html)

**静态类**

`3x2` 的矩阵，用以表示二维物体的位移、旋转、缩放。

> 用长度为 `6` 的普通数组 `number[]` 表示矩阵（本包 `MatrixArray = number[]`，始终不是 `Float32Array`）。

### render2d.matrix.copy(out, m)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#copy)

将矩阵 `m` 复制给矩阵 `out`。不会创建新矩阵，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 待修改的矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |
| m | `number[]` |   | 参考矩阵。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### render2d.matrix.create()[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create)

创建一个单位矩阵。

#### 返回值

新创建的单位矩阵，类型：`number[]`，元素个数为 `6`。

### render2d.matrix.identity(out)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#identity)

将 `out` 设为单位矩阵，也就是 `[1, 0, 0, 1, 0, 0]`。不会创建新矩阵，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 待修改的矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### render2d.matrix.invert(out, m)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#invert)

求到矩阵 `m` 的逆矩阵，得到的结果赋值给 `out`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |
| m | `number[]` |   | 待求逆的矩阵，不会在改方法中被改变。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### render2d.matrix.mul(out, m1, m2)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#mul)

将矩阵 `m1` 与 `m2` 相乘，得到的结果赋值给 `out`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |
| m1 | `number[]` |   | 待相乘的矩阵。 |
| m2 | `number[]` |   | 待相乘的矩阵。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### render2d.matrix.rotate(out, m, rad)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#rotate)

将矩阵 `m` 旋转 `rad` 弧度，得到的结果赋值给 `out`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |
| m | `number[]` |   | 待修改的矩阵，不会在改方法中被改变。 |
| rad | `number` |   | 旋转弧度。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### render2d.matrix.scale(out, m, v)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#scale)

将矩阵 `m` 沿向量 `v` 缩放，得到的结果赋值给 `out`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |
| m | `number[]` |   | 待修改的矩阵，不会在改方法中被改变。 |
| v | `number[]` |   | 长度为 `2` 的缩放向量，表示横向和纵向的缩放量。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### render2d.matrix.translate(out, m, v)[#](https://vjmap.com/map3d/api/modules/render2d.matrix.html#translate)

将矩阵 `m` 沿向量 `v` 平移，得到的结果赋值给 `out`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出矩阵，由 [`render2d.matrix.create`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#create) 创建。 |
| m | `number[]` |   | 待修改的矩阵，不会在改方法中被改变。 |
| v | `number[]` |   | 长度为 `2` 的平移向量，表示横向和纵向的偏移量。 |

#### 返回值

修改后的 `out`，类型：`number[]`。

### [render2d.path](https://vjmap.com/map3d/api/classes/render2d.Path-1.html)

**静态类**

路径相关的辅助函数。

### render2d.path.createFromString(str, opts)[#](https://vjmap.com/map3d/api/functions/render2d.path.createFromString.html)

从字符串创建路径，字符串形如 [SVG Path](http://www.w3.org/TR/SVG/paths.html#PathData)。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| str | `string` |   | 构建路径的字符串。 |
| opts | `Object` |   | 配置项，参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html) 的配置项。 |

### render2d.path.extendFromString(str, opts)[#](https://vjmap.com/map3d/api/functions/render2d.path.extendFromString.html)

从字符串扩展路径，字符串形如 [SVG Path](http://www.w3.org/TR/SVG/paths.html#PathData)。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| str | `string` |   | 扩展路径的字符串。 |
| opts | `Object` |   | 配置项，参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html) 的配置项。 |

#### 相关

[render2d.Path.extend](https://vjmap.com/map3d/api/classes/render2d.Path-1.html#extend)。

### render2d.path.mergePath(pathEls, opts)[#](https://vjmap.com/map3d/api/functions/render2d.path.mergePath.html)

合并多条路径。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| pathEls | `Path[]` |   | 路径数组。 |
| opts | `Object` |   | 配置项，参见 [render2d.Displayable](https://vjmap.com/map3d/api/classes/render2d.Displayable.html) 的配置项。 |

### [render2d.Pattern](https://vjmap.com/map3d/api/classes/render2d.Pattern.html)

图案。

#### 构造函数

`render2d.Pattern(image, repeat)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| image | `HTMLImageElement` |   | 图片对象。 |
| repeat | `string` | `'repeat'` | 重复模式，可取值有：`'repeat'`、 `'repeat-x'`、 `'repeat-y'`、 `'no-repeat'`。 |

### [render2d.RadialGradient](https://vjmap.com/map3d/api/classes/render2d.RadialGradient.html)

**继承自 render2d.Gradient **

径向渐变。

#### 构造函数

`render2d.RadialGradient(x, y, r, colorStops, globalCoord)`

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` | `0.5` | 渐变中心位置横坐标。 |
| y | `number` | `0.5` | 渐变中心位置纵坐标。 |
| r | `number` | `0.5` | 渐变半径。 |
| colorStops | `Object[]` |   | 组成渐变色的颜色。每个颜色包括 `offset` 与 `color` 属性，前者表示渐变位置（类型：`number`），后者表示具体的颜色（类型：`string`） |
| globalCoord | `boolean` | `false` | 如果为 `false`，则 `x`、 `y`、 `r` 是相对元素包围盒的比例（`0` 到 `1`，`r` 相对宽高较小者）；如果为 `true`，则它们是与元素一致的绝对坐标。`colorStops` 的 `offset` 始终是 `0` 到 `1`，不受此参数影响。 |

### render2d.Transformable

可进行变换的对象，变换包括：位移、旋转、缩放。

#### 构造函数

`render2d.Transformable(opts)`

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| opts | `Object` |   | 配置项。 |
| opts.position | `number[]` | `[0, 0]` | 位移。 |
| opts.rotation | `number` | `0` | 旋转的弧度。 |
| opts.scale | `number[]` | `[1, 1]` | 缩放。 |
| opts.origin | `number[]` | `null` | 旋转和缩放的原点。 |

### render2d.Transformable.decomposeTransform()

分解 `transform` 矩阵到 `position`、 `rotation`、 `scale`。通常用于修改 `transform` 后同步`position`、 `rotation`、 `scale` 属性。

### render2d.Transformable.getGlobalScale()

获得全局的缩放。也就是说会祖先元素的缩放也会计算在内。

#### 返回值

缩放，类型： `number[]`。

### render2d.Transformable.origin

旋转和缩放的原点，类型： `number[]`。

### render2d.Transformable.position

位移，类型： `number[]`。

### render2d.Transformable.rotation

旋转的弧度，类型： `number`。

### render2d.Transformable.scale
缩放，类型： `number[]`。

### render2d.Transformable.transform

矩阵形式表示位移、旋转、缩放，类型： [`render2d.matrix`](https://vjmap.com/map3d/api/modules/render2d.matrix.html#)。

### render2d.Transformable.transformCoordToGlobal(x, y)

变换局部坐标位置到全局坐标空间。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` |   | 横坐标。 |
| y | `number` |   | 纵坐标。 |

### render2d.Transformable.transformCoordToLocal(x, y)

变换坐标位置到元素的局部坐标空间。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| x | `number` |   | 横坐标。 |
| y | `number` |   | 纵坐标。 |

### [render2d.util](https://vjmap.com/map3d/api/modules/render2d.util.html)

**静态类**

常用辅助函数。

### render2d.util.bind(func, context)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#bind)

修改执行上下文。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>func</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>待执行的函数。</td></tr><tr><td>context</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>执行上下文。</td></tr></tbody></table>

### render2d.util.clone(source)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#clone)

深度拷贝一个对象。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>source</td><td><code class="highlighter-rouge">Object|Array|TypedArray|number|string|null|undefined</code></td><td>&nbsp;</td><td>参考对象。如果是 <code class="highlighter-rouge">Object</code> 类型，则克隆的结果是不包含原型属性的纯对象。</td></tr></tbody></table>

#### 返回值

克隆结果，类型：`Object|Array|TypedArray|number|string|null|undefined`。

### render2d.util.createCanvas()[#](https://vjmap.com/map3d/api/modules/render2d.util.html#createCanvas)

获得一个 Canvas，不设置宽高。相当于 `document.createElement('canvas')`。

#### 返回值

Canvas，类型：`HTMLCanvasElement`。

#### 相关

`render2d.util.createCanvas().getContext('2d')` 获取 2D 上下文（本包无 `util.getContext`）。

### render2d.util.curry(func)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#curry)

函数柯里化。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>func</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>回调函数。</td></tr></tbody></table>

### render2d.util.defaults(target, source, overlay)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#defaults)

将一个对象中的元素赋给另一个元素。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>target</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>需要修改的对象。</td></tr><tr><td>source</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>参考对象。</td></tr><tr><td>overlay</td><td><code class="highlighter-rouge">boolean</code></td><td>&nbsp;</td><td>如果 <code class="highlighter-rouge">overlay</code> 为 <code class="highlighter-rouge">true</code>，则将 <code class="highlighter-rouge">source</code> 中非空的属性赋给 <code class="highlighter-rouge">targe</code>；如果 <code class="highlighter-rouge">overlay</code> 为 <code class="highlighter-rouge">false</code>，则将 <code class="highlighter-rouge">source</code> 中 <code class="highlighter-rouge">target</code> 不包含的属性赋给 <code class="highlighter-rouge">targe</code>。</td></tr></tbody></table>

#### 返回值

拷贝结果，即 `target`。

#### 相关

[render2d.util.mixin](https://vjmap.com/map3d/api/modules/render2d.util.html#mixin)。

### render2d.util.each(array, cb, context)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#each)

遍历数组。相当于 [Array.prototype.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>cb</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>遍历回调函数。</td></tr><tr><td>context</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>执行上下文。</td></tr></tbody></table>

### render2d.util.extend(target, source)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#extend)

将 `source` 中非继承来的属性赋给 `target`。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>target</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>需要修改的对象。</td></tr><tr><td>source</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>参考对象。</td></tr></tbody></table>

#### 返回值

拷贝结果，即 `target`。

### render2d.util.filter(array, cb, context)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#filter)

过滤元素。相当于 [Array.prototype.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>cb</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>回调函数。</td></tr><tr><td>context</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>执行上下文。</td></tr></tbody></table>

### render2d.util.find(array, cb, context)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#find)

相当于 [Array.prototype.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>cb</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>用以检查元素是否存在的函数，返回元素是否存在的 <code class="highlighter-rouge">boolean</code> 结果。</td></tr><tr><td>context</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>执行上下文。</td></tr></tbody></table>

#### 返回值

返回数组 `array` 中第一个找到的元素，类型：`*`。

### render2d.util.getContext()[#](https://vjmap.com/map3d/api/modules/render2d.util.html#getContext)

⚠️ 本包的 `render2d.util` **没有 `getContext`**（调用抛 TypeError）。需要 2D 上下文请写 `render2d.util.createCanvas().getContext('2d')`。

### render2d.util.indexOf(array, value)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#indexOf)

查询数组中元素，返回下标。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>value</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>寻找的对象。</td></tr></tbody></table>

#### 返回值

下标，类型：`number`。

### render2d.util.inherits(clazz, baseClazz)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#inherits)

构造类继承关系：`clazz`（子类）继承 `baseClazz`（基类）的原型方法、属性，`clazz` 会有 `superClass` 属性，指向 `baseClazz`。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>clazz</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>子类。</td></tr><tr><td>baseClazz</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>基类。</td></tr></tbody></table>

### render2d.util.isArray(data)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#isArray)

是否是数组。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>data</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>判断对象。</td></tr></tbody></table>

#### 返回值

是否是数组，类型：`boolean`。

#### 相关

[render2d.util.isArrayLike](https://vjmap.com/map3d/api/modules/render2d.util.html#isArrayLike)。

### render2d.util.isFunction(data)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#isFunction)

是否是函数。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>data</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>判断对象。</td></tr></tbody></table>

#### 返回值

是否是函数，类型：`boolean`。

### render2d.util.isObject(data)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#isObject)

是否是对象。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>data</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>判断对象。</td></tr></tbody></table>

#### 返回值

是否是对象，类型：`boolean`。

### render2d.util.isString(data)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#isString)

是否是字符串。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>data</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>判断对象。</td></tr></tbody></table>

#### 返回值

是否是字符串，类型：`boolean`。

### render2d.util.map(array, cb, context)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#map)

映射数组。相当于 [Array.prototype.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>cb</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>映射函数。</td></tr><tr><td>context</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>执行上下文。</td></tr></tbody></table>

### render2d.util.merge(target, source, overwrite)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#merge)

拷贝一个对象。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>target</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>需要修改的对象。</td></tr><tr><td>source</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>参考对象。</td></tr><tr><td>overwrite</td><td><code class="highlighter-rouge">boolean</code></td><td><code class="highlighter-rouge">false</code></td><td>是否覆盖 <code class="highlighter-rouge">target</code> 中已存在的键（<code class="highlighter-rouge">false</code> 时只补缺失的键）。两边都是普通对象的键总会递归合并，与此参数无关。</td></tr></tbody></table>

#### 返回值

拷贝结果，即 `target`。

### render2d.util.reduce(array, cb, memo, context)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#reduce)

相当于 [Array.prototype.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>cb</td><td><code class="highlighter-rouge">Function</code></td><td>&nbsp;</td><td>回调函数 <code class="highlighter-rouge">(prev, cur, index, arr)</code>。</td></tr><tr><td>memo</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>初始值（第三参是初始值，不是 context）。</td></tr><tr><td>context</td><td><code class="highlighter-rouge">*</code></td><td>&nbsp;</td><td>执行上下文。</td></tr></tbody></table>

### render2d.util.slice(array, start, end)[#](https://vjmap.com/map3d/api/modules/render2d.util.html#slice)

相当于 [Array.prototype.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)。

#### 参数

<table class="table"><tbody><tr><td>名称</td><td>类型</td><td>默认值</td><td>描述</td></tr><tr><td>array</td><td><code class="highlighter-rouge">[]</code></td><td>&nbsp;</td><td>数组。</td></tr><tr><td>start</td><td><code class="highlighter-rouge">number</code></td><td>&nbsp;</td><td>起始下标。</td></tr><tr><td>end</td><td><code class="highlighter-rouge">number</code></td><td>&nbsp;</td><td>终止下标。</td></tr></tbody></table>

#### 返回值

数组 `array` 在 `start`（包含）位置到 `end`（不包含）位置的浅拷贝数组，类型：`[]`。

### [render2d.vector](https://vjmap.com/map3d/api/modules/render2d.vector.html)

**静态类**

长度为 `2` 的向量。

> 向量始终是普通数组 `number[]`（本包 `VectorArray = number[]`，不是 `Float32Array`）。

### render2d.vector.add(out, v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#add)

将向量 `v1` 与 `v2` 相加，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

输出向量，类型：`number[]`。

#### 相关

[render2d.vector.scaleAndAdd](https://vjmap.com/map3d/api/modules/render2d.vector.html#scaleAndAdd)。

### render2d.vector.applyTransform(out, v, m)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#applyTransform)

矩阵 `m` 左乘向量 `v`，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v | `number[]` |   | 向量。 |
| m | `number[]` |   | 矩阵，参见 [render2d.matrix](https://vjmap.com/map3d/api/modules/render2d.matrix.html#)。 |

#### 返回值

输出向量，类型：`number[]`。

### render2d.vector.copy(out, v)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#copy)

将向量 `v` 复制给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 待修改的向量。 |
| v | `number[]` |   | 参考向量。 |

#### 返回值

输出向量，类型：`number[]`。

### render2d.vector.clone(v)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#clone)

将向量 `v` 复制，产生一个新副本。

#### 返回值

新创建的向量，类型：`number[]`。

### render2d.vector.distance(v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#distance)

得到向量 `v1` 与 `v2` 间距离。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

距离，类型：`number`。

### render2d.vector.distanceSquare(v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#distanceSquare)

得到向量 `v1` 与 `v2` 间距离的平方。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

距离的平方，类型：`number`。

### render2d.vector.div(out, v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#div)

将向量 `v1` 与 `v2` 的每个元素分别相除，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

输出向量，类型：`number[]`。

### render2d.vector.dot(v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#dot)

将向量 `v1` 与 `v2` 点乘，返回点积。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

点积，类型：`number`。

### render2d.vector.len(v)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#len)

求向量 `v` 的模长，即 `√(x² + y²)`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| v | `number[]` |   | 待求模长的向量，不会在该方法中被改变。 |

#### 返回值

模长，类型：`number`。

### render2d.vector.lenSquare(v)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#lenSquare)

求向量 `v` 的模长的平方。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| v | `number[]` |   | 待求模长平方的向量，不会在该方法中被改变。 |

#### 返回值

模长平方，类型：`number`。

### render2d.vector.lerp(out, v1, v2, t)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#lerp)

将向量 `v1` 与 `v2` 在 `t` 位置进行插值，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |
| t | `number` |   | 位置，`0` 到 `1`，`1` 表示 `v2` 处。 |

#### 返回值

插值后的向量 `out`，类型：`number[]`。

### render2d.vector.max(out, v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#max)

求两个向量每个元素的最大值，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

输出向量，类型：`number[]`。

#### 相关

[render2d.vector.min](https://vjmap.com/map3d/api/modules/render2d.vector.html#min)。

### render2d.vector.min(out, v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#min)

求两个向量每个元素的最小值，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

输出向量，类型：`number[]`。

### render2d.vector.mul(out, v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#mul)

将向量 `v1` 与 `v2` 相乘，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

输出向量，类型：`number[]`。

### render2d.vector.negate(out, v)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#negate)

将向量 `v` 的负向量输出到 `out`，也就是每个元素都变成相反数。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v | `number[]` |   | 输入向量。 |

#### 返回值

负向量 `out`，类型：`number[]`。

### render2d.vector.normalize(out, v)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#normalize)

将向量 `v` 归一化输出到 `out`，也就是将其模长变为 `1`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v | `number[]` |   | 输入向量。 |

#### 返回值

归一化后的 `out`，类型：`number[]`。

### render2d.vector.scale(out, v, s)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#scale)

将向量 `v` 缩放 `s` 倍，得到的结果赋值给 `out`。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v | `number[]` |   | 待修改的向量，不会在改方法中被改变。 |
| s | `number` |   | 缩放量。 |

#### 返回值

输出向量，类型：`number[]`。

#### 相关

[render2d.vector.scaleAndAdd](https://vjmap.com/map3d/api/modules/render2d.vector.html#scaleAndAdd)。

### render2d.vector.scaleAndAdd(out, v1, v2, scale)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#scaleAndAdd)

将向量 `v2` 缩放 `scale` 倍后，与 `v1` 相加，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |
| scale | `number` |   | 缩放比例，`1` 表示不缩放。 |

#### 返回值

输出向量，类型：`number[]`。

#### 相关

[render2d.vector.add](https://vjmap.com/map3d/api/modules/render2d.vector.html#add)、[render2d.vector.scale](https://vjmap.com/map3d/api/modules/render2d.vector.html#scale)。

### render2d.vector.set(out, a, b)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#set)

将值 `(a, b)` 赋给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 待修改的向量。 |
| a | `number` |   | 向量的第一个维度。 |
| b | `number` |   | 向量的第二个维度。 |

#### 返回值

输出向量，类型：`number[]`。

### render2d.vector.sub(out, v1, v2)[#](https://vjmap.com/map3d/api/modules/render2d.vector.html#sub)

将向量 `v1` 与 `v2` 相减，赋值给向量 `out`。不会创建新向量，而是将 `out` 的元素进行改变。

#### 参数

| 名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| out | `number[]` |   | 输出向量。 |
| v1 | `number[]` |   | 第一个向量。 |
| v2 | `number[]` |   | 第二个向量。 |

#### 返回值

输出向量，类型：`number[]`。
