可视化中常见的数学函数
·
Yin灏
利用 G2 5.0 的自定义图形能力,试着做了两个自定义图表:
发现,在做可视化图表过程中,特别是需要自定义绘图的时候后,经常会用到的一些函数,这些方法在 G2 中也有,所以这里抽出来大概说一说。收藏一下,后续内容有扩充,会继续更新文章。
两个点之间的向量
计算两个点之间的向量,输出参数其实是两个点相对于原点(0, 0)的向量。
function sub([x1, y1], [x2, y2]): [number, number] {
return [x1 - x2, y1 - y2];
}
计算两个坐标点之间的距离
非常常见的方法,经常用来计算线的长度、原的半径等等。
function dist([x1, y1], [x0, y0]): number {
return Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
}
计算两个点的中点
比如会找一些关键点,用于绘制 Q 的控制点等等,会需要用到这个函数。
function mid([x1, y1], [x2, y2]): [number, number] {
return [(x1 + x2) / 2, (y1 + y2) / 2];
}
计算一个向量的弧度
特别在极坐标、螺旋坐标下,经常需要用到弧度计算的公式。
function angle([x, y]): number {
return Math.atan2(y, x);
}
根据弧度以及半径,计算点的位置
非常常见,根据弧度来确定一个点在圆弧上的坐标。
function getPointInArc(angle: number, radius: number): [number, number] {
return [Math.cos(angle) * radius, Math.sin(angle) * radius];
}
计算在圆弧上的两个点,在圆弧上的中点
比如,计算饼图每个扇形上数据标签显示的位置,就需要这个方法。
function midInArc(p1, p2, center): [number, number] {
const m = mid(p1, p2);
const v = sub(m, center);
const a = angle(v);
const radius = dist(p1, center);
const p = getPointInArc(a, radius);
return [p[0] + center[0], p[1] + center[1]];
}
总结
可视化本身并不难,在上手了基本的绘图 API 之后,这些 API 无论是浏览器原生的 Canvas、SVG,还是封装之后的 d3,AntV G2,在绘图上,最难的还是各种各样的图形数学计算。