在对象

时间:2016-05-21 19:22:47

标签: javascript jquery rotation

我已经找到了一个围绕主要物体旋转物体的功能,比如围绕太阳的行星。

我希望能够通过单击按钮更改其他对象旋转的对象。例如,我有对象A,B和C.B和C围绕A旋转。但是我希望C能够围绕B旋转,而B保持围绕A旋转。我试图在此处解决这个问题。代码:

var objectX = "black";
function switchObject(){
  objectX = "blue";
}

function rotation(coorX, coorY, object) {
    object.side +=  (1.0 / object.speed); 
    var ang = object.side * 2.0 * Math.PI / 180.0; 
    var r = object.spin;

    return {
        x: Math.cos(ang) * r - Math.sin(ang) * r + coorX, 
        y: Math.sin(ang) * r + Math.cos(ang) * r + coorY 
    };
  }  

  function rotationball ( circle ) {
    var x, y, x_black, y_black, e, newpos;
    e = document.getElementById ( circle );
    x_black = parseFloat ( document.getElementById ( objectX ).getAttribute ( "cx" ) );
    y_black = parseFloat ( document.getElementById ( objectX ).getAttribute ( "cy" ) );
    newpos = rotation( x_black, y_black, ball[circle] );

    e.setAttribute ( "cx", newpos.x );
    e.setAttribute ( "cy", newpos.y );
    }

我已经知道如何通过您在代码中看到的objectX变量轻松切换哪个对象是其他对象旋转的对象。但这种情况会立即发生,我需要逐渐进行,这就是我认为更难以解决的数学代码。

我的问题是:

为了让红色物体开始围绕蓝色物体旋转,我的代码应该是什么样子,而蓝色物体围绕黑色物体旋转。这需要在许多轮换中逐步完成。我感谢任何帮助,无论是我需要的一些代码还是指向正确的方向!提前谢谢。

这是我的JsFiddle

PS:我还计划将每个添加的行星定位在离中心点(太阳)稍远的位置,而不是之前添加的行星。

1 个答案:

答案 0 :(得分:1)

我写了相对移动球。只需设置第二个" planet"的相对坐标,数学保持不变,只需改变 frame of reference。请参阅JsFiddle

rotationball("red"); 
relativeRotationBall("blue", "red");

var ball = { 
  blue: {speed: 1.2,    spin: 100,  side: 0.0} , 
  red:  {speed: 2.2,    spin: 200,  side: 0.0} // speed up
};

<强>更新   在点击开关按钮上更改参考框架。

function preSetObjectRotation(dedfaultObject, frameReference) {    
    var self = this;
      this.defaultObject = dedfaultObject;
      this.defaultFrameReference = frameReference;
      this.setFrameReference = function (frameReference) {
          self.defaultFrameReference = frameReference;
      };
      this.relativeRotationBall = function relativeRotationBall () {
        var e, newpos;
        e = document.getElementById ( self.defaultObject );
        newpos = relativeRotation( self.defaultFrameReference, ball[self.defaultObject] );
        e.setAttribute ( "cx", newpos.x );
        e.setAttribute ( "cy", newpos.y );
      }  
 }

JsFiddle

更新2 当点在一行上时自动切换,在isEclipse函数(JsFiddle