【问题标题】:Get bounds of rotated rectangle获取旋转矩形的边界
【发布时间】:2018-12-29 23:04:48
【问题描述】:

我正在尝试获取bounding box 内实际旋转矩形的position

矩形旋转120deg

我正在尝试实现您可以在此处看到的蓝色轮廓

我设法使用matrix 正确获得rotation,但我无法正确获得其余部分。

这是我的代码

let svg = document.querySelector('svg')
let overlay = document.querySelector('.overlay')
let rect = svg.children[0]

let bounds = rect.getBoundingClientRect()
let matrix = rect.getCTM()

overlay.style.top = bounds.top + 'px'
overlay.style.left = bounds.left + 'px'
overlay.style.width = bounds.width + 'px'
overlay.style.height = bounds.height + 'px'
overlay.style.transform = `matrix(${matrix.a},${matrix.b},${matrix.c},${matrix.d},0,0)`

http://jsfiddle.net/wjugqn31/67/

【问题讨论】:

  • stackoverflow.com/questions/41898990这些信息够计算你想要的吗?
  • 在我的情况下,我不知道矩形本身的高度和宽度,我只知道边界框的宽度/高度,所以我认为它在这种情况下不起作用
  • 已知数据是边界框宽度/高度和旋转角度?没有了?
  • 是的,我知道边界框的高度、宽度、顶部、左侧位置,最后是角度(120 度)。没有别的
  • @MBo 我有这个问题的确切反面,如何获得未旋转矩形的边界stackoverflow.com/questions/54072295/…

标签: math svg rotation geometry svg-transforms


【解决方案1】:

已知数据:边界框宽度W,高度H,旋转角度Fi
需要:旋转矩形顶点的坐标。

未知源矩形大小:w x h

此尺寸和旋转角度的边界框大小:

 H = w * Abs(Sin(Fi)) + h * Abs(Cos(Fi))
 W = w * Abs(Cos(Fi)) + h * Abs(Sin(Fi))
 denote 
 as = Abs(Sin(Fi))
 cs = Abs(Cos(Fi))

所以我们可以求解线性方程组并得到(注意Pi/4角度的奇异性)

 h = (H * cs - W * as) / (cs^2 - as^2)
 w = -(H * as - W * cs) / (cs^2 - as^2)

顶点坐标:

 XatTopEdge = w * cs      (AE at the picture)
 YatRightEdge = h * cs    (DH)
 XatBottomEdge = h * as   (BG)
 YatLeftEdge = w * as     (AF)

请注意,对于给定的数据,我们无法区分角度 Fi90+Fi,但这一事实可能不会影响解决方案(wh 也会相互交换)

【讨论】:

    【解决方案2】:

    我认为您可以直接获取rect 的尺寸,然后对其应用转换。在summary:

    let rect = svg.children[0]
    let matrix = rect.getScreenCTM()
    
    overlay.style.top = '0'
    overlay.style.left = '0'
    overlay.style.width = `${rect.width.animVal.value}px`
    overlay.style.height = `${rect.height.animVal.value}px`
    overlay.style.transformOrigin = '0 0'
    overlay.style.transform = `matrix(${matrix.a},${matrix.b},${matrix.c},${matrix.d},${matrix.e},${matrix.f})`
    

    【讨论】:

    • 我真的很喜欢这个解决方案,它适用于简单的形状,但在某些情况下似乎不起作用,你可以在这里看到小提琴jsfiddle.net/wjugqn31/113
    • @zaarr78 那是因为边界框很紧,而字母本身从坐标开始~11,31。您可以 fix that 通过向转换添加额外的偏移量:matrix(${matrix.a},${matrix.b},${matrix.c},${matrix.d},${matrix.e},${matrix.f}) translate(${bbox.x}px,${bbox.y}px)
    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多