如何使用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" />
表示:未缩放的偏移量是y
1160,x
2161。未缩放的范围是高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,现在与组之前的缩放比例相同。
这是一个带有子形状的 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" />
表示:未缩放的偏移量是y
1160,x
2161。未缩放的范围是高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,现在与组之前的缩放比例相同。