2010-11-11 1 views
3

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

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

Этот код порождает частицы на экране (это 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; 
    } 
} 
} 

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

+0

Я думаю, что ваше предположение верно. Кажется, что причиной являются неточности с плавающей запятой. Что касается того, как вы можете это исправить ..... – Allan

+0

Я все еще подозрительный, хотя мои вычисления не должны приводить к слишком большим числам для типа данных Number. Если неточность не видна с дробными значениями, такими как 1/3. Тогда было бы невозможно моделировать векторные поля во флэш-памяти, используя собственные типы данных. – warpstack

ответ

1

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

+0

Я сделаю эти оптимизации и посмотрю, где я нахожусь. Хотя я мог нормализовать радиус частиц из начала координат, это не позволило бы мне легко изменить векторное поле. Хотя в настоящее время поле определено внутри частицы, поле позже будет определено в другом месте, и я хотел бы, чтобы частица была готова вести себя надлежащим образом в любом любом поле. – warpstack

+0

Да, нормализация - очень специфическое обходное решение. Может быть, вы можете эмулировать высокоточные числа в actionscript и использовать их вместо Number для полевых вычислений? Как и Python, его номера. Не спрашивайте меня, как. – alxx

+0

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

0

Для установки десятичных знаков используйте функцию 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); 

Надеется, что это помогает

+0

Нет, 'toFixed' возвращает строку номера с указанным числом десятичных знаков. Он ничего не делает с фактическим числом. – Mikepote