Я моделирую векторное поле во вспышке и создавая беспорядок частиц, чтобы визуализировать поток поля. Использование векторного поля 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;
}
}
}
В идеале частицы будут перемещаться по кругу вокруг источника навсегда. Но код создает ситуацию, когда частицы вращаются вокруг начала и спирали наружу, в конце концов покидая сцену. Я очень благодарен за помощь. Спасибо!
Я думаю, что ваше предположение верно. Кажется, что причиной являются неточности с плавающей запятой. Что касается того, как вы можете это исправить ..... – Allan
Я все еще подозрительный, хотя мои вычисления не должны приводить к слишком большим числам для типа данных Number. Если неточность не видна с дробными значениями, такими как 1/3. Тогда было бы невозможно моделировать векторные поля во флэш-памяти, используя собственные типы данных. – warpstack