我有一个名为point的对象,我可以用鼠标在屏幕上移动。这个对象有一个通过它映射的向量(_v1)使用舞台的中心和“点”的x,y位置来绘制向量(注意所有这一切工作正常)。当我设置一个按钮时,我的问题就出现了,如果你按下它就会将值设置为true。这个按钮背后的想法是,当按下时,无论“点”位置是什么位置,它将围绕舞台中心顺时针旋转1度(这一切都发生在frameHandler中,所以我可以继续点击按钮来制作它继续在舞台上)。我使用的代码基于下面列出的if语句:
if(clockwisePressed) {
var v1angle:Number = _v1.angle;
v1angle++; //increase the angle by 1 degree
if(v1angle>180) {
v1angle -= 360;
}
//Now just move the crosshair and get it ready to be redrawn
point.x = centerX - _v1.m * Math.cos(v1angle);
point.y = centerY - _v1.m * Math.sin(v1angle);
clockwisePressed = false; //remove button pressed boolean
}
所以这里发生的事情就是将sequenPressed设置为true,这样就会触发。我的向量(_v1)设置为告诉我角度(已经从弧度转换为度数),但它是一个只读值。所以我将它(_v1.angle)分配给v1angle,这样我就可以把它弄乱并将它增加1,所以我顺时针绕着舞台的中心移动。然后我只是检查以确保它落在-180和180之间的范围内(如果我在舞台周围跟踪_v1.angle,0度向左,90度是向上,180度是在右边,并且-90直降)。现在使用从this thread派生的公式,但转换为0度指向左边的值,Y的值在你走的阶段越往上,我想出了
x = centerX - radius * cos(angle)
y = centerY - radius * sin(angle)
现在,当我在纸上制作样本图表并在我的计算器上使用这些值时,这就像一个魅力。如果我插入一个角度,半径和中心,我会在我的圆圈上得到一个点,我在一张方格纸上绘制。然而,当我在闪光灯中实际尝试这个时,“点”会在整个舞台上跳跃。 (注意,_v1.m只是舞台中心和“点”之间矢量的大小,与半径相同)。
所以我追踪一切,而cos和罪的价值似乎并不正确。例如,如果我的角度是-1.9581并且我在我的计算器上取了它的cos,我会得到0.9994的线条,但闪光跟踪Math.cos(角度)为-0.3777。是不是使用Math.cos(-1.9581)和将-1.9581放入计算器并命中cos一样?
所以在我上面的例子中,我的point.x从139.95变为261.3。应该是1度的相当大的跳跃。所以我在这里不知道是什么导致这个代码如此彻底失败。我在这里做错了吗?
更新:如果搜索此主题的任何人感兴趣,则以下是有效的更正代码:
if(clockwisePressed) {
var v1RadAngle:Number = Math.atan2(_v1.vy, _v1.vx); //get angle in radians
v1RadAngle += 0.0174; //increase the angle by ~1 degree more or less
//Now just move the crosshair and get it ready to be redrawn
point.x = centerX - _v1.m * Math.cos(v1RadAngle); //_v1.m = radius
point.y = centerY - _v1.m * Math.sin(v1RadAngle);
clockwisePressed = false; //remove button pressed boolean
}
答案 0 :(得分:3)
Flash中的trig函数期望以弧度为单位输入,但您使用的是度数。在使用之前,您必须将度数值转换为弧度:
var angle:Number = -1.9581;
var radAngle:Number = angle * Math.PI / 180;
trace(Math.cos(radAngle)); // 0.9994160815411552