【问题标题】:ActionScript 3 Trig Equations to create EllipseActionScript 3 Trig Equations 创建椭圆
【发布时间】:2011-06-26 14:21:38
【问题描述】:

我正在使用这个函数,它围绕一个中心点在一个完美的圆圈中移动一个对象,并试图修改它以将它移动为一个椭圆形,它的高度是宽度的 1/2?

基本上,我有一个固定的速度

var myVelocity:Number = 0.25;

然后我根据速度计算我的正弦和余弦

var myCos:Number = Math.cos(myVelocity);
var mySin:Number = Math.sin(myVelocity);

然后我计算对象到每个轴的固定中心点的距离,然后

var x1:Number = myBall.x - centerX;
var y1:Number = myBall.y - centerY;
var x2:Number = myCos * x1 - mySin * y1;
var y2:Number = myCos * y1 + mySin * x1;
myBall.x = centerX + x2;
myBall.y = centerY + y2;

我有另一个函数可以根据 myBall.x = centerX + cos(angle) * radius 计算 x 和 y;这很容易将半径修改为椭圆,但是有没有一种简单的方法可以将上面的半径修改为椭圆?我想这样做是为了提高代码效率并减少数学函数调用的次数

【问题讨论】:

  • 应该是var mySin:Number = Math.sin(myVelocity);
  • @weltraumpirat:编辑问题
  • @OXMO456:是的,我知道,但由于@user615460 是这里的新用户,所以我的速度很慢……那里。完成:)
  • @weltraumpirat : 这就是我所拥有的 :) 我正在尝试将它从圆形修改为椭圆。

标签: flash actionscript-3 adobe trigonometry


【解决方案1】:

这个问题与Keith PetersFoundation Actionscript 3.0: Making Things Move! 中所涵盖的内容几乎一字不差

我已经从书中快速为你准备了一个 sn-p。

import flash.display.Shape;
import flash.events.Event;

var box:Shape = new Shape();
box.graphics.beginFill(0xFF0000);
box.graphics.drawRect(0, 0, 50, 50);
box.graphics.endFill();
addChild(box);
var angle:Number = 0;
var centerX:Number = stage.stageWidth/2 - (box.width/2);
var centerY:Number = stage.stageHeight/2 - (box.height/2)
var radiusX:Number = 200;
var radiusY:Number = 100;
var speed:Number = .1;
stage.addEventListener(Event.ENTER_FRAME, loop, false, 0, true);

function loop(evt:Event):void
{
    box.x = centerX + Math.sin(angle) * radiusX;
    box.y = centerY + Math.cos(angle) * radiusY;
    angle += speed;
}

结果:http://www.swfupload.com/view/155573.htm

【讨论】:

  • 谢谢你,但我已经知道了。我正在尝试修改提供的代码以减少数学函数调用的数量。我最终将循环使用 25 个对象的代码。如果我必须在每次重复时为每个对象调用正弦和余弦,那就是很多数学函数调用。因为如果我可以计算一次 cos 和 sin 并没有改变,那么只需按照提供的方式遍历循环,它将使代码运行得更干净、更快。所以问题仍然是如何在不使用循环中的 sin 和 cos 函数的情况下将提供的代码修改为椭圆
  • @user615460 您刚刚回答了自己 :) ...查看“查找表”...基本上将 sin/cos 值存储在数组中一次,并使用一个 int 将递增并跳转到零'将用于引用 sin/cos 数组值...此外,如果没有查找表,如果在循环遍历对象之前存储 sin/cos 值,则每帧将有 25 个 sin/cos 调用,对吗?
  • 我很抱歉。我确实误读了你问题的最后一部分。我会删除它,但它产生了一些有用的喋喋不休。
  • 我自己想出来 var x1:Number = myBall.x - myCenterX; var y1:Number = myY - myCenterY; var x2:Number = (myCos * x1) - (mySin * y1); var y2:Number = (myCos * y1) + (mySin * x1);我的球.x = myCenterX + x2; myY = myCenterY + y2; myBall.y = (myY * 0.5) + (myCenterY / 2);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
相关资源
最近更新 更多