isHitOnSticker function

bool isHitOnSticker(
  1. Sticker currentSticker,
  2. Offset position, {
  3. Size scaleSize = const Size(0, 0),
})

Implementation

bool isHitOnSticker(Sticker currentSticker, Offset position, { Size scaleSize = const Size(0, 0) }) {
  final centerX = currentSticker.offset.dx + currentSticker.width / 2;
  final centerY = currentSticker.offset.dy + currentSticker.height / 2;

  // 贴图位置矩阵
  final transform = Matrix4.identity()
    ..translate(centerX, centerY)
    ..rotateZ(currentSticker.rotation)
    ..scale(currentSticker.scale)
    ..translate(-currentSticker.width / 2, -currentSticker.height / 2);

  // 逆变换矩阵
  final inverseTransform = Matrix4.inverted(transform);

  // 将点击位置转换到贴图的局部坐标系
  final localPosition = MatrixUtils.transformPoint(inverseTransform, position);

  // 计算考虑 scaleSize 后的贴图范围
  final adjustedWidth = currentSticker.width + scaleSize.width;
  final adjustedHeight = currentSticker.height + scaleSize.height;
  final adjustedLeft = -scaleSize.width / 2;
  final adjustedTop = -scaleSize.height / 2;

  // 判断点击位置是否在调整后的贴图范围内
  if (localPosition.dx >= adjustedLeft && localPosition.dx <= adjustedLeft + adjustedWidth &&
      localPosition.dy >= adjustedTop && localPosition.dy <= adjustedTop + adjustedHeight) {
    return true;
  }
  return false;
}