【问题标题】:Position one object based on another that's rotated根据旋转的另一个对象定位一个对象
【发布时间】:2015-11-20 03:19:15
【问题描述】:

我有一组可以任意角度旋转的积木。我的任务是在集合的一侧创建一个额外的块,与最后一个块相邻。我正在使用 Flex/AS3 和 openscales。插图将很好地解释我想要实现的目标。我提前为我的图片的粗糙道歉,我手头只有 MS Paint!

我目前对图 2 的公式很简单:

block5XPos += block4XPos - block3XPos;
block5YPos += block4YPos - block3YPos;

** 编辑 **

我无法以通常的方式使用显示对象,即旋转、addChild。我仅限于使用 x 和 y 值并且必须重新计算这些值。

【问题讨论】:

    标签: actionscript-3 math geometry polygon


    【解决方案1】:

    我想通了。我利用 Math.cos 和 Math.sin 根据与最后一个块的角度和距离来计算新块的位置。

        private function calculateNewSlotPosition(slot:SlotDO):void {
            var blockToRadians:Number = blockDegrees * Math.PI / 180;
            var cos:Number = Math.cos(blockToRadians);
            var sin:Number = Math.sin(blockToRadians);
    
            for(var k:uint = 0; k < block.polygon.length; k++) {
                block.polygon[k].x += ((block.width + workBlock.gap) * cos);
                block.polygon[k].y -= ((block.width + workBlock.gap) * sin);
            }
        }
    

    【讨论】:

      【解决方案2】:

      如果您的解决方案允许,您可以将所有块放在父影片剪辑中,然后旋转该影片剪辑。然后在将新块添加到父动画剪辑时只需修改 x 参数。这将沿旋转父级的“本地”x 轴平移块。

      伪代码:

      var parent:MovieClip = new MovieClip()
      parent.rotation = 45
      addChild(parent)
      
      var block1 = new BlockClip()
      block1.x = 10
      parent.addChild(block1)
      
      
      var block2 = new BlockClip()
      block2.x = 20
      parent.addChild(block2)
      

      【讨论】:

      • 这里不需要MovieClip(它带来的问题多于它解决的问题),而是使用简单的Sprite作为容器。
      • 是的,一个movieclip 是矫枉过正,但它不会引入任何问题。愿意分享那些“比它解决的问题更多”吗?
      • 矫枉过正的问题。如果不需要时间线,则不要使用时间线。您也没有添加一些您不打算显示到容器中的视频。使用适当的类/类型使代码更加自我记录。如果我看到MovieClip,我会期待一些时间线交互。最重要的是,它是dynamic,这意味着new MovieClip().adChild(o); 在运行时会静默失败,而new Sprite().adChild(o); 会导致编译时 错误。祝你在一个大型项目中找到那个错字。 Sprite 应该是首选。
      • 为好的一般观点点赞。但正如你提到的,这里没有介绍实际问题,只是猜测和偏好。 adChild() 也会在运行时抛出错误
      • 实际问题是MovieClip的使用。
      最近更新 更多