应用旋转变换后线长发生变化 修改点:修改后的脚本:注意:参考文献:

问题描述

行长,在一行上更新旋转时不一样。假设以大于45°的角度插入线并以相同角度进行旋转时,线的长度在旋转后出现不同,则该长度应与插入的线长度相同。屏幕截图如下。

function lineRotation() {

var selection = SlidesApp.getActivePresentation().getSelection();
if(selection.getPageElementRange() !== null){

var pageElements = selection.getPageElementRange().getPageElements()


if(pageElements[0].getPageElementType() == 'LINE'){
  //Getting Line left position and width
  var left = pageElements[0].asLine().getLeft(),width = pageElements[0].asLine().getWidth(),height = pageElements[0].asLine().getHeight(),top = pageElements[0].asLine().getTop()

  let sx1 = pageElements[0].asLine().getStart().getX();
  let sy1 = pageElements[0].asLine().getStart().getY();
  let ex1 = pageElements[0].asLine().getEnd().getX();
  let ey1 = pageElements[0].asLine().getEnd().getY();
  
  let dy = ey1 - sy1;
  let dx = ex1 - sx1;
  let theta = Math.atan2(dy,dx);
  theta *= 180/Math.PI;
  
   let dist = formatNum(Math.sqrt(dx * dx + dy * dy)); //formatNum used to format result negative to positive 
  
   //Updating Line  
   if(theta > 45){ //if angle greater than 45 then it will rotate vertically else horizontally
     pageElements[0].asLine().setLineCategory(SlidesApp.LineCategory.STRAIGHT).setEnd(left,dist);
 
   }else{
    pageElements[0].asLine().setLineCategory(SlidesApp.LineCategory.STRAIGHT)
               .setEnd(left+dist,pageElements[0].asLine().getTop());
  
   }
  
 }else{
  SlidesApp.getUi().alert('Please select line.');
 }

 }else{
   SlidesApp.getUi().alert('Please select elements.');
 }
}

enter image description here

未来的范围:我也希望旋转后的行长相同。

所需的输出:旋转线条时,水平或垂直两种情况下的长度都应相同。

enter image description here

解决方法

修改点:

  • 首先,Slide的坐标原点是左上角。

  • left
  • topsetEnd(left,top)是幻灯片的坐标,如下所示。

    • left:直线终点的水平位置,以从页面左上角开始的点数为单位。

    • top:直线终点的垂直位置,以从页面左上角开始的点数为单位。

  • 在您的脚本中,left,dist中的setEnd(left,dist)var left = pageElements[0].asLine().getLeft()let dist = formatNum(Math.sqrt(dx * dx + dy * dy))left是坐标。但是dist是不是坐标的长度。在这种情况下,需要添加坐标作为偏移量。我认为这是您遇到问题的原因。

当以上几点反映到您的脚本时,它如下所示。

修改后的脚本:

从:
if(theta > 45){ //if angle greater than 45 then it will rotate vertically else horizontally
  pageElements[0].asLine().setLineCategory(SlidesApp.LineCategory.STRAIGHT).setEnd(left,dist);

}else{
 pageElements[0].asLine().setLineCategory(SlidesApp.LineCategory.STRAIGHT)
            .setEnd(left+dist,pageElements[0].asLine().getTop());

}
至:
if(theta > 45){
  pageElements[0].asLine().setLineCategory(SlidesApp.LineCategory.STRAIGHT).setEnd(left,dist + sy1);
}else{
  pageElements[0].asLine().setLineCategory(SlidesApp.LineCategory.STRAIGHT).setEnd(sx1,sy1 - dist);
}
  • 在这种情况下,假设dist始终是脚本中formatNum used to format result negative to positive的正值。
结果:

当上面的修改反映到您的脚本时,它如下所示。

enter image description here

注意:

  • 在这个答案中,它假定像GIF动画一样创建了一条线。

参考文献:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...