Regular Polygon 等边多边形
正多边形只需要边数和半径两个参数,不用自己算顶点坐标。
用法
要使用Konva添加正多边形, 我们可以实例化一个Konva.RegularPolygon()对象.
有关属性和方法的完整列表,请参阅Konva.RegularPolygon文档
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@10/konva.min.js"></script>
<meta charset="utf-8">
<title>Konva RegularPolygon Demo</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
background-color: #F0F0F0;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
var stage = new Konva.Stage({
container: 'container',
width: 300,
height: 300
});
var layer = new Konva.Layer();
var hexagon = new Konva.RegularPolygon({
x: 100,
y: 150,
sides: 6,
radius: 70,
fill: 'red',
stroke: 'black',
strokeWidth: 4
});
layer.add(hexagon);
// add the layer to the stage
stage.add(layer);
</script>
</body>
</html>
圆角
Konva 10 起 RegularPolygon 支持 cornerRadius,可以把正多边形的尖角磨圆:
const hexagon = new Konva.RegularPolygon({
x: 100,
y: 100,
sides: 6,
radius: 70,
fill: 'red',
stroke: 'black',
strokeWidth: 4,
cornerRadius: 10,
});
cornerRadius 不能为负值。Konva 10.4.0 之前负的 radius 或 cornerRadius
会在绘制时抛错,并导致它之后的图形全部不显示;10.4.0 起改为拒绝该值而不再中断绘制。
常见问题
radius 是边长还是半径?
是外接圆半径,即中心到任一顶点的距离,不是边长。
这意味着相同 radius 下,边数越多图形看起来越「大」——三角形的三个顶点之间空得多,
而十二边形几乎填满整个外接圆。做一组不同边数的图标时,想让它们视觉大小一致,
需要按边数反推 radius,而不是取同一个值。
sides 设成 2 或不设会怎样?
sides 必须至少为 3。Konva 10.4.0 修复了一个相关问题:此前不设置 sides 会让
该节点每次绘制都抛错,进而中断整个图层的渲染——表现为这个图形之后的所有内容
都不显示,很难定位到根源。
升级到 10.4.0 及以上后不再中断绘制,但仍然应当显式给出 sides。
第一个顶点朝哪个方向?
默认朝上(12 点方向),与 Konva.Star 一致。
用 rotation 调整朝向,x、y 是中心,旋转默认绕中心进行,不需要额外设 offset。
与其他方案的取舍
正多边形一律用 RegularPolygon,不要用 Konva.Line
手算顶点。手算的问题不在于算不出来,而在于边数一改就要重算整个数组,
而且很容易把外接圆半径和边长搞混。
反过来,需要不规则多边形——顶点不在同一个圆上、或者边长不等——RegularPolygon
就表达不了,这时才用 Line 配合 closed: true 自己给顶点。
有一种常见的误用是把 sides 设到 64 以上来模拟圆形。视觉上确实接近,
但顶点越多绘制越贵,而 Konva.Circle 是浏览器原生的
圆弧绘制,无论如何都更快也更圆。没有理由这样代替。