吸附与锚点是 ht for web 中两个比较重要的概念。这两个概念在执行交互和动画时会经常被用到。
吸附,顾名思义,是一个节点吸附到另一个节点上。就像船底的贝类一样,通过吸附到船身,在船移动的时候自己也会跟着移动;而锚点,则决定了哪个位置是该节点的坐标点位置。这里继续以船舶为例,锚点就是船舶抛锚后船锚所在点,只不过船的锚点在船外面,而 ht 节点的锚点通常在其中心。并且这里的锚链是刚性的不能弯曲。
吸附
ht 既支持 2d 吸附,也支持 3d 吸附。这里我们以 2d 为例说明一下其用法。在使用之前,有几个方法先在这里介绍一下:
gethost()和sethost(host)获取和设置吸附宿主对象,当节点吸附上宿主图元时,宿主移动或旋转时会带动所有吸附者。
getattaches()获取吸附到自身的所有节点的ht.list类型数组。
onhostchanged(oldhost, newhost)当吸附宿主对象发生变化时回调该函数,可重载做后续处理。
handlehostpropertychange(event)当吸附宿主对象属性发生变化时回调该函数,可重载做后续处理。
ishoston(node)判断该图元是否吸附到指定图元对象上。
isloopedhoston(node)判断是否与指定图元形成环状吸附,如a吸附b,b吸附c,c吸附回a,则a,b和c图元相互环状吸附。
在上例中,我们创建了4个服务器,并且在他们之间配置了连线。另外我们在这里为它们配置了吸附关系:
server 4 吸附到 server 3, server 3 吸附到 server 2, server 2 吸附到 server 1。
这样,如果 server 1 动,那么 server 2 便会跟着动。由于 server 3 吸附在 server 2 上,server 3 也会跟着移动。同理,server 4 也会跟着 server 3 移动。
由于前两篇文章已经讲过 2d 图纸及节点,连线的创建。这里主要是配置吸附关系。关键代码如下:
/**************** 分别创建 ht 节点并添加到图纸中 ************************/// 创建4个服务器节点const server1 = createservernode(100, 100, 'server 1 (host)', {'label.color': 'red'});const server2 = createservernode(300, 100, 'server 2');const server3 = createservernode(100, 300, 'server 3');const server4 = createservernode(300, 300, 'server 4');/****************************** 创建连线 *************************************/....../****************************** 连线动画 *************************************/....../****************************** 设置吸附 *************************************/server2.sethost(server1);server3.sethost(server2);server4.sethost(server3);
这里面主要的代码就是 sethost() 那三句。在设置了 host 节点之后,我们可以通过 host.getattaches() 方法获取所有吸附到 host 上的所有节点。
const attaches = server1.getattaches(); // 获取的 ht.list 长度为1,即只有 server2
需要注意的是,尽管这里获取的吸附节点个数为1,但由于吸附节点的递归关系,server 3 和 server 4 也会被间接吸附到 server 1 上面。
吸附旋转
前面提过,设置吸附后的节点,不但会跟随 host 节点移动,还会根据 host 节点旋转,这是非常有用的一个功能。其逻辑由 ht for web 内部实现,我们在这里调用即可。
锚点
如上图所示,4台服务器都围绕着一个中心点旋转,该中心点就是 server 1 的锚点。同时,它也是 server 1 坐标所在点。也就是说:锚点影响着节点的坐标位置,锚点同时也是节点旋转和缩放的中心点。
在 ht 中,锚点是node上一个重要的概念。节点绘制的是一个矩形区域,而锚点是决定了矩形区域中哪个位置是节点的坐标点位置。
锚点的值是一个百分比数值,{x:0,y:0}是在区域左上角,{x:1,y:1}是在区域右下角,ht 默认以{x:0.5,y:0.5}为锚点,也就是图元中心点。如果为节点配置大于1或者小于0则锚点则该锚点将处于节点矩形区域之外。可以通过node.getanchor和node.setanchor获取和设置锚点,也可以通过node.getanchorx、node.setanchorx、node.getanchory、node.setanchory方法单独设置获取。
• getanchor()和setanchor(x, y | {x:0.5,y:0.5})获取和设置图元的锚点,锚点影响着节点坐标位置,锚点同时也是旋转和缩放的中心点
hightopo 的官网示例从多个维度展示了锚点的作用:
在 3d 场景中,其锚点原理上与 2d 类似,只不过这里增加了一个维度。获取和设置锚点的方法如下:
• getanchor3d()和setanchor3d(x, y, z | [x, y, z])获取和设置图元的 3d 锚点。需要注意的是,要想单独获取 z 轴方向上的锚点,这里需要使用 node.getanchorelevation 而不是 node.getanchorz
下图展示的是一个六面体在 3d 场景中的锚点位置。ht 节点默认的锚点是 {x: 0.5, y: 0.5, z: 0.5}。这里我们将其改成了 {x: 0, y: 0, z: 0},因此,这里的坐标轴显示在六面体的一角而不是中心位置。
小结
本节我们主要介绍了 ht 的吸附和锚点功能。节点的吸附可以让节点跟随它所吸附的宿主对象一起移动或旋转。使用 ht 的 sethost() 方法可以设置节点的宿主对象,使用 getattaches() 方法可以获取所有吸附到该宿主对象上的节点。此外,还介绍了节点旋转和缩放的中心点——锚点。锚点的值是一个百分比数值,ht 默认以 {x:0.5,y:0.5} 为锚点,也就是图元中心点。可以通过 node.getanchor() 和 node.setanchor(x, y | {x:0.5,y:0.5}) 等方法获取和设置锚点。
光纤传感器为能源安全“保驾护航”
PCB技术硬件开发的基本准则(一)
努比亚Z17发布会在即:骁龙835+8GB运存,配置、性能轻松超越三星S8和小米6!
采用非分散红外技术的气体传感器电路
单品解读JL-320C灯座式多功能电子光控开关
HT for Web (Hightopo) 使用心得(3)- 吸附与锚点
影响锂离子电池PACK放电容量的因为有哪些?
iPhone 12成苹果短命产品?
浅谈汽车连接器应用特点
USB转无线通信模块电路设计方案解析
热烈庆祝东方集成荣获泰克2014年度五项大奖
关于OPPOR15 5000万关注量的几点思考
因泄露三星OLED技术,TOPTECH被判有罪
OPPO R17 Pro正式开售:软硬件结合,打造出了出色的夜拍效果
三星将于10月11日发布Galaxy新机 或是折叠屏幕手机?
OPPOR11将于5.15日发布搭配骁龙660+4G+64G
实现抗振端接的MAG-MATE IDC插入式连接器
农业通证运用区块链技术,创建更健全的食品安全体系
华为nova8 Plus:预计使用麒麟芯采用高刷屏
matlab输入矩阵的格式的方法步骤