You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Konva Transformer针对任意形状的锚点位置?

获取Transformer包围盒锚点坐标的解决方案

问题描述

需要获取Transformer包围盒的8个锚点位置(即多边形外蓝色矩形的8个白色方形点),当前仅在目标形状为矩形时,e.target.getAbsoluteTransform().point({ x: 0, y: 0 }) 能生效,但针对多边形这类形状无法直接使用该方法。

解决方案

Transformer的包围盒对应元素的轴对齐边界框,可以通过以下步骤获取8个锚点:

步骤1:获取元素的绝对边界框

调用元素的getBoundingRect(true)方法,获取经过所有变换(平移、旋转、缩放)后的实际边界框:

const boundingRect = e.target.getBoundingRect(true);

该方法返回的对象包含四个核心属性:

  • left:边界框左上角的绝对X坐标
  • top:边界框左上角的绝对Y坐标
  • width:边界框的宽度
  • height:边界框的高度

步骤2:计算8个锚点的绝对坐标

基于边界框的尺寸,定义8个锚点的相对位置,再转换为绝对坐标:

// 定义8个锚点相对于边界框左上角的位置
const relativeAnchors = [
  { x: 0, y: 0 },          // 左上角
  { x: boundingRect.width/2, y: 0 }, // 上边缘中点
  { x: boundingRect.width, y: 0 },   // 右上角
  { x: boundingRect.width, y: boundingRect.height/2 }, // 右边缘中点
  { x: boundingRect.width, y: boundingRect.height },   // 右下角
  { x: boundingRect.width/2, y: boundingRect.height }, // 下边缘中点
  { x: 0, y: boundingRect.height },   // 左下角
  { x: 0, y: boundingRect.height/2 }  // 左边缘中点
];

// 转换为绝对坐标
const absoluteAnchors = relativeAnchors.map(anchor => ({
  x: boundingRect.left + anchor.x,
  y: boundingRect.top + anchor.y
}));

此时absoluteAnchors数组就是Transformer包围盒的8个锚点绝对坐标,适用于所有形状(矩形、多边形等)。

关键说明

  • getBoundingRect(true) 会忽略元素的旋转角度,返回始终与坐标轴对齐的边界框,这和Transformer显示的蓝色矩形完全对应。
  • 无论目标元素是什么形状,只要它被Transformer选中,这个方法都能准确获取到包围盒的锚点位置。

内容的提问来源于stack exchange,提问作者Vikas Acharya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:49:52