如何使用apache poi获取子图形的绝对位置

How to get the absolute position of child shapes by using apache poi

这是一个带有子形状的 groupShape:

<p:nvgrpsppr> 
   <p:cnvpr name="Group 256" id="260" /> 
   <p:cnvgrpsppr> 
    <a:grpsplocks nochangeaspect="1" /> 
   </p:cnvgrpsppr> 
   <p:nvpr /> 
  </p:nvgrpsppr> 
  <p:grpsppr bwmode="auto"> 
   <a:xfrm> 
    <a:off y="1940518" x="2952779" /> 
    <a:ext cy="2209679" cx="1219680" /> 
    <a:choff y="1052" x="1972" /> 
    <a:chext cy="1116" cx="616" /> 
   </a:xfrm> 
   <a:solidfill> 
    <a:srgbclr val="F7B63E" /> 
   </a:solidfill> 
  </p:grpsppr> 
  <p:sp> 
   <p:nvsppr> 
    <p:cnvpr name="Freeform 257" id="262" /> 
    <p:cnvsppr> 
     <a:splocks noeditpoints="1" /> 
    </p:cnvsppr> 
    <p:nvpr /> 
   </p:nvsppr> 
   <p:sppr bwmode="auto"> 
    <a:xfrm> 
     <a:off y="1160" x="2161" /> 
     <a:ext cy="287" cx="288" /> 
    </a:xfrm>
   </p:sppr>
  </p:sp>

当我取消组合时,得到这个:

  <p:grpsppr> 
   <a:xfrm> 
    <a:off y="0" x="0" /> 
    <a:ext cy="0" cx="0" /> 
    <a:choff y="0" x="0" /> 
    <a:chext cy="0" cx="0" /> 
   </a:xfrm> 
  </p:grpsppr> 
  <p:sp> 
   <p:nvsppr> 
    <p:cnvpr name="Freeform 257" id="262" /> 
    <p:cnvsppr> 
     <a:splocks noeditpoints="1" /> 
    </p:cnvsppr> 
    <p:nvpr /> 
   </p:nvsppr> 
   <p:sppr bwmode="auto"> 
    <a:xfrm> 
     <a:off y="2154358" x="3326999" /> 
     <a:ext cy="568260" cx="570240" /> 
    </a:xfrm>
   </p:sppr>
  </p:sp>

childShape转换为绝对定位。

<a:xfrm> 
 <a:off y="1160" x="2161" /> 
 <a:ext cy="287" cx="288" /> 
</a:xfrm>

converted to:

<a:xfrm> 
 <a:off y="2154358" x="3326999" /> 
 <a:ext cy="568260" cx="570240" /> 
</a:xfrm>

我是通过计算算出长宽的。

width = (group a:ext:cx) / (group a:chExt:cx) * (child a:ext:x);

身高=(组a:ext:cy)/(组a:chExt:cy)*(子a:ext:y);

但是我试了很多种操作,都不知道怎么转换x坐标和y坐标。

我应该通过什么操作来将y:1160转换为y:2154358。

请多多指教

在你的群组中XML

<a:off y="1940518" x="2952779" /> 
<a:ext cy="2209679" cx="1219680" /> 

表示:该组从 y 1940518、x 2952779 开始,高度为 2209679,宽度为 1219680。

<a:choff y="1052" x="1972" /> 
<a:chext cy="1116" cx="616" /> 

表示:组的 child 部分从 y 1052、x 1972 开始,高度为 1116,宽度为 616。这是形状的原始值分组时。

这表明您的组形状严重缩放。它很小,然后用 1980 倍缩放。

scale_factor_y = ext_cy / chext_cy 
               = 2209679 / 1116 
               ≈ 1980

scale_factor_x = ext_cx / chext_cx 
               = 1219680 / 616
               = 1980

为了你在群里的child

 <a:off y="1160" x="2161" /> 
 <a:ext cy="287" cx="288" /> 

表示:未缩放的偏移量是y1160,x2161。未缩放的范围是高287,宽288。

如果未分组,缩放后的偏移量为:

off_y = (not_scaled_off_y - choff_y) * scale_factor_y + group_off_y
      = (1160  - 1052) * 1980 + 1940518
      = 2154358

off_x = (not_scaled_off_x - choff_x) * scale_factor_x + group_off_x
      = (2161  - 1972) * 1980 + 2952779
      = 3326999

缩放范围为:

ext_cy = not_scaled_ext_cy * scale_factor_y
       = 287 * 1980
       = 568260

ext_cx = not_scaled_ext_cx * scale_factor_x
       = 288 * 1980
       = 570240

这导致你的

<a:off y="2154358" x="3326999" /> 
<a:ext cy="568260" cx="570240" /> 

对于组中的 child,现在与组之前的缩放比例相同。