概述

本文档主要向大家介绍 G6 中锚点机制的原理和拓展,如有描述不清楚、有误的地方欢迎大家在 GitHub 上提 Issue 指正。或是直接 PR 修缮,根据您的贡献度,我们会视情况将您加入 AntV 共建者名录 :-)

定义

定义 解释 图解
锚点(Anchor) 用户设置可用于连接的点,从属于节点。 锚点详解 - 图1
相交点(IntersectPoint) 以两节点中心,为端点的线和其中任意一个节点的相交盒的交点。 锚点详解 - 图2
连接点(LinkPoint) 边和节点的连接点。 锚点详解 - 图3
相交盒(IntersectBox) 用于计算交点和盒模型,从属于节点。 锚点详解 - 图4
锚点平面(AnchorPlane) 用于设置锚点的坐标平面。 锚点详解 - 图5

逼近策略

在没有设置锚点的情况下,相交点就是连接点。在有锚点的情况下,连接点一定是其中一个锚点,但选择什么锚点,则需要有一个逼近策略。

points 值未定义

  • 步骤一:截取交点

锚点详解 - 图6

  • 步骤二:返回连接点

points 值为 array

  • 步骤一:截取交点

锚点详解 - 图7

  • 步骤二:按角度将所有自定义锚点增序排序

锚点详解 - 图8

  • 步骤三:返回排序后的锚点集合

接口

锚点相关的接口。

自定义节点锚点

可以采用以下方式配置相交盒:

  1. // 设置锚点
  2. G6.registerNode('customNode', {
  3. intersectBox: 'circle', // 'circle', 'rect'
  4. });

采用以下方式配置锚点:

  1. // 直接传值
  2. G6.registerNode('customNode', {
  3. anchor: [
  4. [0, 1, cfg],
  5. [0.5, 0.5, cfg]
  6. ],
  7. });
  8. // 回调函数
  9. G6.registerNode('customNode', {
  10. anchor(item) {
  11. return [
  12. [0, 1, cfg],
  13. [0.5, 0.5, cfg]
  14. ];
  15. },
  16. });

上述的 cfg 无实际影响,仅仅会在附加在 getAnchorPoints 输出的锚点里,便于标识锚点。

固定边的锚点连接

  1. // 在边的数据模型里设置需要连接的锚点的索引,则会固定住边的连接锚点
  2. {
  3. sourceAnchor: 1, // 锚点索引
  4. targetAnchor: 0, // 锚点索引
  5. }

获取锚点的方法

  1. // 获取锚点集合 (根据索引排序)
  2. const anchorPoints = node.getAnchorPoints();
  3. // 获取关于某点的连接点 (根据角度逼近排序)
  4. const linkPoints = node.getLinkPoints();

示例