Flash Actionscript 3.0: тип числа и десятичная точность (векторные поля и частицы) - PullRequest
3 голосов
/ 12 ноября 2010

Я моделирую векторное поле во вспышке и порождаю беспорядок частиц, чтобы визуализировать поток поля. Использование векторного поля F (x, y) = yi-xj

Это векторное поле имеет завиток, частицы должны двигаться по кругу, что они и делают. Моя проблема в том, что частицы расходятся от начала координат, хотя это конкретное векторное поле не имеет расходимости. Я подозреваю, что мои типы данных могут терять десятичную точность во время самых базовых вычислений для этого поля или, возможно, я делаю какую-то логическую ошибку, я не уверен.

Этот код порождает частицы на экране (это 800x450). Этот код, вероятно, не в беде, но для полноты я включил его.

//spawn particles
var i:int;
var j:int;
//spread is the spacing between particles
var spread:Number;
spread = 10.0;
//spawn the particles
for (i=0; i<=800/spread; i++)
{
 for (j=0; j<=450/spread; j++)
 {
  //computes the particles position and then constructs the particle.
  var iPos:Number = spread * Number(i) - 400.0;
  var jPos:Number = 225.0 - spread * Number(j);
  var particle:dot = new dot(iPos,jPos,10.0);
  addChild(particle);
 }
}

Это «точечный» класс, который содержит все важное, что касается порождаемых частиц.

package 
{
 //import stuff
 import flash.display.MovieClip;
 import flash.events.Event;
 public class dot extends MovieClip
 {
  //variables
  private var xPos:Number;
  private var yPos:Number;
  private var xVel:Number;
  private var yVel:Number;
  private var mass:Number;
  //constructor
  public function dot(xPos:Number, yPos:Number, mass:Number)
  {
   //Defines the function to be called when the stage advances a frame.
   this.addEventListener(Event.ENTER_FRAME, moveDot);
   //Sets variables from the constructor's arguments.
   this.xPos = xPos;
   this.yPos = yPos;
   this.mass = mass;
   //Set these equal to 0.0 so the Number type knows I want a decimal (hopefully).
   xVel = 0.0;
   yVel = 0.0;
  }
  //Controlls the particle's behavior when the stage advances a frame.
  private function moveDot(event:Event)
  {
   //The vector field is a force field. F=ma, so we add F/m to the velocity. The mass acts as a time dampener.
   xVel += yPos / mass;
   yVel +=  -  xPos / mass;
   //Add the velocity to the cartesian coordinates.
   xPos +=  xVel;
   yPos +=  yVel;
   //Convert the cartesian coordinates to the stage's native coordinates.
   this.x = xPos + 400.0;
   this.y = 225.0 + yPos;
  }
 }
}

В идеале все частицы будут двигаться по кругу вокруг источника навсегда. Но код создает ситуацию, когда частицы вращаются вокруг начала координат и движутся по спирали наружу, в итоге покидая сцену. Я очень ценю руку помощи. Спасибо!

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Вы можете нормализовать расстояние каждой частицы от начала координат (возможно, не на каждом шаге, чтобы сохранить вычисления).Также кажется, что ваш код не оптимизирован - вы создаете прослушиватель ENTER_FRAME для каждой частицы, а их 3600.Одного слушателя должно быть достаточно.И я бы поменял все эти деления на умножение на обратное значение.

0 голосов
/ 09 февраля 2011

Для установки десятичных разрядов используйте функцию toFixed ().

//Set these equal to 0.0 so the Number type knows I want a decimal (hopefully).
 xVel = 0;
 yVel = 0;
 xVel.toFixed(1); //(specifies decimal places)
 yVel.toFixed(1);

Надеюсь, это поможет

...