Hey guys,
Im just messing around with AS3 and math and right now I have a program that generates cosine waves BUT it is out of phase for some reason.
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.sensors.Accelerometer;
import flash.events.AccelerometerEvent;
import flash.utils.*;
import flash.events.TimerEvent;
public class Curves extends MovieClip {
//GlobalSpeed
public static var GlobalSpeed:int = 8;
//Blitting variables
public var CANVAS_BD:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x000000);
public var CANVAS_BITMAP:Bitmap = new Bitmap(CANVAS_BD);
public var BACKGROUND_BD:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x000000);
public var DOTSHEET1:DotSheet = new DotSheet();
//DotsArray properties
public var DotDiameter:int = 2;//Should be a factor of stage.stageHeight
public var DotSpacingFactor:int = 1;//Value of 1 will have Dots touching
public var DotSpacing:int = DotSpacingFactor * DotDiameter;//Distance between Dots Y values
public var MaxVerticalDots:int = stage.stageHeight/(DotSpacing);//Max dots that can be fit vertically on screen with spacing included
public var DotsArray:Array = new Array(2 * (MaxVerticalDots + 1));//+1 for one Dot to be off screen
//Cosine/sine function: Rotated -90 degrees into f(y)
public var MAX_AMP:Number = 64;
public var MIN_AMP:Number = 16;
public var MAX_FREQ:Number = 128;
public var MIN_FREQ:Number = 16;
public var MAX_PHASE:Number = 0;
public var MIN_PHASE:Number = 0;
public var GlobalAmplitudeFactor:Number = MIN_AMP;
public var GlobalFrequencyFactor:Number = MIN_FREQ;
public var GlobalPhaseFactor:Number = MIN_PHASE;
public var LeftFunctionOffset:int = stage.stageWidth/4;
public var RightFunctionOffset:int = 3 * stage.stageWidth/4;
//Modulation variables
public var AmpModTimer:Timer = new Timer(2000, 0);
public var FreqModTimer:Timer = new Timer(2000, 0);
public var PhaseModTimer:Timer = new Timer(2000, 0);
//Populate DotsArray with Dots and set (x/y)
public function SetUpDotsArray() {
for(var i = 0; i < DotsArray.length; i++) {
if(i == 0 || i == 1) {
DotsArray* = new Dot(DotDiameter/2, 0xFFFFFF);
DotsArray*.y = -DotSpacing;
}
if(i > 1) {
DotsArray* = new Dot(DotDiameter/2, 0xFFFF00);
DotsArray*.y = DotsArray[i - 2].y - DotSpacing;
}
addChild(DotsArray*);
}
}
public var AMP_HAS_PEAKED:Boolean = false;
public function ModulateAmplitude(e:TimerEvent) {
if(!(AMP_HAS_PEAKED)) {
if(GlobalAmplitudeFactor >= MAX_AMP) {
AMP_HAS_PEAKED = true;
}
GlobalAmplitudeFactor *= 2;
}
if(AMP_HAS_PEAKED) {
if(GlobalAmplitudeFactor <= MIN_AMP) {
AMP_HAS_PEAKED = false;
}
GlobalAmplitudeFactor /= 2;
}
}
public var FREQ_HAS_PEAKED:Boolean = false;
public function ModulateFrequency() {
trace(GlobalFrequencyFactor);
if(!(FREQ_HAS_PEAKED)) {
if(GlobalFrequencyFactor >= MAX_FREQ) {
FREQ_HAS_PEAKED = true;
}
GlobalFrequencyFactor *= 1.01;
}
if(FREQ_HAS_PEAKED) {
if(GlobalFrequencyFactor <= MIN_FREQ) {
FREQ_HAS_PEAKED = false;
}
GlobalFrequencyFactor /= 1.01;
}
}
public var PHASE_HAS_PEAKED:Boolean = false;
public function ModulatePhase(e:TimerEvent) {
//trace(GlobalPhaseFactor);
if(!(PHASE_HAS_PEAKED)) {
if(GlobalPhaseFactor >= MAX_PHASE) {
PHASE_HAS_PEAKED = true;
}
GlobalPhaseFactor += 1;
}
if(PHASE_HAS_PEAKED) {
if(GlobalPhaseFactor <= MIN_PHASE) {
PHASE_HAS_PEAKED = false;
}
GlobalPhaseFactor -= 1;
}
}
public function SetDotCoordinates(d:Dot) {
//First Dot, DotsArray[0], is treated differently
if(DotsArray.indexOf(d) == 0 || DotsArray.indexOf(d) == 1) {
//When zero needs to come back up top
if(d.y - DotDiameter/2 >= stage.stageHeight) {
//It's y value should follow that of the last element in the array
d.y = DotsArray[DotsArray.length - 1].y - DotSpacing;
//trace(getTimer());
}
}
//All dots greater than zero
if(DotsArray.indexOf(d) > 1) {
if(d.y - DotDiameter/2 >= stage.stageHeight) {
d.y = DotsArray[DotsArray.indexOf(d) - 2].y - DotSpacing - GlobalSpeed;
}
}
//When Dot is not on screen, assign its function factors
if(d.y < 0) {
d.AmplitudeFactor = GlobalAmplitudeFactor;
d.FrequencyFactor = GlobalFrequencyFactor;
d.PhaseFactor = GlobalPhaseFactor;
}
if(DotsArray.indexOf(d) % 2 == 0) {
d.x = d.AmplitudeFactor * Math.cos((d.y + d.PhaseFactor)/d.FrequencyFactor) + LeftFunctionOffset;
}
if(DotsArray.indexOf(d) % 2 > 0) {
d.x = d.AmplitudeFactor * Math.cos((d.y + d.PhaseFactor)/d.FrequencyFactor) + RightFunctionOffset;
}
}
public function DrawLines() {
graphics.clear();
for(var h = 0; h < DotsArray.length; h++) {
if(h % 2 == 0) {
graphics.lineStyle(1, 0xFFFF00);
graphics.moveTo(DotsArray[h].x, DotsArray[h].y);
graphics.lineTo(0, DotsArray[h].y);
}
if(h % 2 > 0) {
graphics.lineStyle(1, 0xFFFF00);
graphics.moveTo(DotsArray[h].x, DotsArray[h].y);
graphics.lineTo(stage.stageWidth, DotsArray[h].y);
}
}
}
public function MoveDots() {
//Set coordinates and move
for(var j = 0; j < DotsArray.length; j++) {
SetDotCoordinates(DotsArray[j]);
DotsArray[j].y += GlobalSpeed;
}
}
public function Curves() {
addEventListener(Event.ENTER_FRAME, MainLoop);
//AmpModTimer.addEventListener(TimerEvent.TIMER, ModulateAmplitude);
//FreqModTimer.addEventListener(TimerEvent.TIMER, ModulateFrequency);
//PhaseModTimer.addEventListener(TimerEvent.TIMER, ModulatePhase);
//AmpModTimer.start();
//FreqModTimer.start();
//PhaseModTimer.start();
SetUpDotsArray();
}
public function InputVars() {
GlobalAmplitudeFactor = Number(AMP.text);
GlobalFrequencyFactor = Number(FREQ.text);
GlobalPhaseFactor = Number(PHASE.text);
}
public function MainLoop(e:Event) {
MoveDots();
ModulateFrequency();
DrawLines();
//InputVars();
}
}
}
package {
import flash.display.Shape;
public class Dot extends Shape {
public var AmplitudeFactor:Number;
public var FrequencyFactor:Number;
public var PhaseFactor:Number;
public function Dot(radius:int, color:uint) {
graphics.beginFill(color);
graphics.drawCircle(0, 0, radius);
graphics.endFill();
}
}
}
http://www.swfcabin.com/open/1395960897
Right now it looks like its out of phase but I have the phase set to 0. Any ideas?? Thanks in advance.