faster :d The Simulation Universe, part II
Books about the real and imaginaer part.....
// forked from teeandy's forked from: forked from: The Simulation Universe, part II
// forked from teeandy's forked from: The Simulation Universe, part II
// forked from teeandy's The Simulation Universe, part II
// forked from teeandy's The Simulation Universe
// Books about the real and imaginaer part.....
//
package {
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
[SWF(width="400", height="410", frameRate="30", backgroundColor="0x000000")]
public class Main extends Sprite
{
public var runtimeS:Boolean=false;
public var onePart:Array;
public var array:int=0;
public var bootSystem:Boolean = false; // true to randomice
// false go
public var flag:Number = 0; // 0 Beginn
// 1 Randomvalues setting
// 2 Gravity go
public var diffColor:int= 0xFF33CC;
public var realImag:Boolean=true; // true, mit Imaginaeren Teil
// false, only real part
public var gUniverse:int=4; // 4
public var percentImag:int=0.8;
public var imagUniverse:int=1;
public var sizeOf:Number=3; // to get visible on the screen
public var sizeImag:Number=9; // return value of a function
public var gSchuim:int=1; // can be :D differen
public var Elements:int=5; // Amount of gravitons and imaginaer Unions
public var maxVelocity:int=30; // beginning speed
public var screen:int=40000;
public var visualScreen:int=400;
public var centerx:Array // to save the black materie posisions
public var centery:Array; // ... normally less
public var imagReaction:int = 4000; // screen/visualScreen/sizeImag
public function Main():void {
centerx = [];
centery = [];
onePart = [];
imagReaction = 4000; //screen/visualScreen*sizeImag;
var verrynewboxx:int = Math.random() * screen; // hm
var verrynewboxy:int = Math.random() * screen;
var verrynewx:int; // hm
var verrynewy:int;
// Schuim the same? no :D
//
// var newboxx:int = Math.random() % 24; // hm
// var newboxy:int = Math.random() % 24;
var verryv:int; // hm
var verrya:int; // 2*pi
var newbie:reDbul;
for(var ji:int=0; ji<Elements; ji++){
centerx.push(Math.random() * screen );
array++
}array=0;
for(ji=0; ji<Elements; ji++){
centery.push(Math.random() * screen );
array++
}array=0;
for(ji=0; ji<Elements; ji++){
verrynewx = Math.random() * screen; // hm
verrynewy = Math.random() * screen;
// Schuim the same? no :D
//
// var newboxx:int = Math.random() % 24; // hm
// var newboxy:int = Math.random() % 24;
verryv = Math.random() * maxVelocity; // hm0 verrya = Math.random() * Math.PI; // 2*pi
verrya = 2*Math.PI * Math.random() ;
newbie = new reDbul( verrynewx, verrynewy, verryv, verrya, verrynewboxx, verrynewboxy, maxVelocity, screen, screen/visualScreen );
onePart.push(newbie);
array++;
}
addEventListener(Event.ENTER_FRAME, plop); // :D
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.DOUBLE_CLICK, onMouseDoubleClick);
runtimeS = true;
// :) plopi();
}
public function plopi( ):void
{
runtimeS = false;
for(var iss:int=0; iss<Elements; iss++){
// graphics.clear();
// onePart[iss].show(graphics, diffColor, sizeOf, sizeImag);//Painting
onePart[iss].move(); // set new Realpossition
// setImag( iss ); // set the position of the imaginaer part
setnewVector( iss ); // setting new values interact
onePart[iss].bing(); // Borderrunners
if ( onePart[iss].v > maxVelocity /4 ) {
onePart[iss].v = onePart[iss].v - maxVelocity/10;
}
}
runtimeS = true;
}
public function reMix():void
{
var iss:int;
for( iss =0; iss<Elements && onePart[iss].remix>sizeOf*10; iss++){
onePart[iss].remix=0;
}
if( iss == Elements ) {
bootSystem= true;
plopi ();
bootSystem= false;
}
}
public function plop(e:Event):void
{
if ( runtimeS ) {
graphics.clear();
for(var iss:int=0; iss<Elements; iss++){
onePart[iss].show(graphics, diffColor, sizeOf, sizeImag, centerx[iss], centery[iss], imagReaction );//Painting
}
reMix();
plopi();
}
}
public function onMouseDown(e:MouseEvent):void
{
if ( flag == 2 ) {
flag = 3;
}
if ( flag == 1 ) {
flag = 2;
}
if ( flag == 0 ) {
flag = 1;
}
for(var i:int=0; i<onePart.length; i++){
onePart[i].rflag = flag;
}
if ( e.localX < visualScreen/2 ) {
bootSystem= !bootSystem;
}
if ( e.localX > visualScreen/2 ) {
realImag= !realImag;
for(i=0; i<onePart.length; i++){
onePart[i].rrealImag = realImag;
}
}
}
public function onMouseDoubleClick(e:MouseEvent):void
{
realImag = !realImag;
for(var i:int=0; i<onePart.length; i++){
onePart[i].rrealImag = realImag;
}
}
public function setImag ( inDex:int, i:int, diff:int ):void {
var helpx:int; helpx = onePart[inDex].bx;
var helpy:int; helpy = onePart[inDex].by;
var helpd:int=0;
var helpa:int=0;
var savex:int; savex = onePart[inDex].bx;
var savey:int; savey = onePart[inDex].by;
if ( diff > 0.001 ){
// first x
var j:int=1; // count of imag parts around
for(var i:int=0; i<Elements; i++){
if ( Math.abs( onePart[inDex].bx - onePart[i].posX) < imagReaction ) {
helpx += onePart[i].posX;
++j;
}
}
// if ( j > 2 ) {
// j--;
helpx = helpx/j; // so there are more possible
// with /Elements only one
// }
helpd = helpx;
centerx[inDex] = helpx;
helpx = helpx - onePart[inDex].bx;
helpx = Math.abs( helpx );
if ( helpx < 1 ) { helpx = 0; }else{ helpx = imagReaction/helpx; }
if (savex > helpd )
{
onePart[inDex].bx = savex - helpx;
}
else {
onePart[inDex].bx = savex + 50; // egg
}
// for(i=0; i<Elements; i++){
// if ( ( (onePart[inDex].bx - onePart[i].bx)*(onePart[inDex].bx - onePart[i].bx) ) < sizeImag ){
// onePart[inDex].bx += sizeImag;
// }
// }
// now y
j=1; // count of imag parts around
for(i=0; i<Elements; i++){
if ( Math.abs( onePart[inDex].by - onePart[i].posY) < imagReaction ) {
helpy += onePart[i].posY;
++j;
}
}
helpy = helpy/j; // so there are more possible
// with /Elements only one
helpd = helpy;
centery[inDex] = helpy;
helpy = helpy - onePart[inDex].by;
helpy = Math.abs( helpy );
if ( helpy < 1 ) { helpy = 0; }else{ helpy = imagReaction/helpy; }
if (savey > helpd )
{
onePart[inDex].by = savey - helpy;
}
else {
onePart[inDex].by = savey + 50; // egg
}
// for(i=0; i<Elements; i++){
// if ( ( (onePart[inDex].by - onePart[i].by)*(onePart[inDex].by - onePart[i].by) ) < sizeImag ){
// onePart[inDex].by += sizeImag;
// }
// }
}}
public function distance ( inDex:int, i:int ):int {
// sqrt a2 + b2
// a = i.x minus inDex.x
// b = i.y minus inDex.y
var xhelp:int;
var yhelp:int;
// diff
xhelp = Math.sqrt(( onePart[inDex].posX - onePart[i].posX ) * ( onePart[inDex].posX - onePart[i].posX ) );
yhelp = Math.sqrt( ( onePart[inDex].posY - onePart[i].posY ) * ( onePart[inDex].posY - onePart[i].posY ) );
return Math.sqrt ( xhelp*xhelp + yhelp*yhelp );
// return Math.sqrt( ( onePart[i].posX - onePart[inDex].posX )*( onePart[i].posX - onePart[inDex].posX ) + ( onePart[i].posY - onePart[inDex].posY )*( onePart[i].posY - onePart[inDex].posY ) );
}
public function makeGravity ( diff:int ):int {
// Mass :D, there are only gravitons
// * 60 / diff
/* if(diff>100){
diff = 1;
diffColor = Math.random()*0xFF33CC;
return 0;
}
return 60/diff;///Math.sqrt(diff); //1 * 1 * 200 / ( diff);
perfect return 800/diff/diff;///Math.sqrt(diff); //1 * 1 * 200 / ( diff);
*/
// return gUniverse*percentImag*250/diff/diff;
//if ( diff < 0.001 ){
// return 1;
//}
//final
// return gUniverse*8/10*sizeOf*100/diff/diff;
// 1/diff/diff is the correct one with physical background ;d
return gUniverse*8/10*sizeOf*diff/diff*screen*100;
// return 800/diff/diff;
// return 50/diff;
//Math.sqrt ( diff*diff*diff );// / diff;
}
public function makeGravityArc ( inDex:int, i:int, diff:int ):int {
var nullstelle:int;
var newa:int; // arc of the gravity
var xhelp:int;
var yhelp:int;
// diff
xhelp = Math.sqrt(( onePart[inDex].posX - onePart[i].posX ) * ( onePart[inDex].posX - onePart[i].posX ) );
yhelp = Math.sqrt( ( onePart[inDex].posY - onePart[i].posY ) * ( onePart[inDex].posY - onePart[i].posY ) );
//I
if ( ( onePart[i].posX > onePart[inDex].posX ) && ( onePart[i].posY > onePart[inDex].posY ) ){
newa = -1 * Math.asin( yhelp / diff );
}
//II
if ( ( onePart[i].posX > onePart[inDex].posX ) && ( onePart[i].posY < onePart[inDex].posY ) ){
newa = Math.asin( yhelp / diff );
}
//IV
if ( ( onePart[i].posX < onePart[inDex].posX ) && ( onePart[i].posY < onePart[inDex].posY ) ){
newa = 2*Math.PI - Math.PI/2 - Math.asin( xhelp / diff );
}
//III
if ( ( onePart[i].posX < onePart[inDex].posX ) && ( onePart[i].posY > onePart[inDex].posY ) ){
newa = Math.PI/2 + Math.asin( xhelp / diff );
}
//V
// same position
if ( ( onePart[i].posX == onePart[inDex].posX ) && ( onePart[i].posY == onePart[inDex].posY ) ){
newa = onePart[inDex].a; // :d
}
return newa;
// nullstelle = Math.sqrt ( ( onePart[i].v*onePart[i].v + onePart[inDex].v*onePart[inDex].v) / 2 );
// return ( ( nullstelle * onePart[i].a )+ ( nullstelle * onePart[inDex].a) ) / nullstelle;
}
public function changeReal ( inDex:Number, v:int, arc:int ):void {
var help:int; // helper for the new v value
help = onePart[inDex].v ;
// onePart[inDex].v = Math.sqrt ( help * help + v * v );
// onePart[inDex].a = arc;
onePart[inDex].v = Math.sqrt( ( onePart[inDex].v + v*Math.cos( arc-onePart[inDex].a ) ) * ( onePart[inDex].v + v*Math.cos( arc-onePart[inDex].a ) ) + v*v*Math.sin( arc-onePart[inDex].a)*Math.sin( arc -onePart[inDex].a ) );
onePart[inDex].a = onePart[inDex].a + v*Math.sin(arc-onePart[inDex].a) / ( onePart[inDex].v + v*Math.cos(arc-onePart[inDex].a ) );
VelocityBing( inDex ); // ;
}
public function VelocityBing ( i:Number ):void {
if( onePart[i].v > maxVelocity ){
onePart[i].v = maxVelocity;
}
}
public function setnewVector( inDex:int ):void{
// one version :D
// sets new Values of the vector v with arc a of Listentry Number index
var summv:int=0;
var arcHelp:int=0;
var diff:int;
if ( bootSystem ){
onePart[inDex].v = Math.random() * maxVelocity;
onePart[inDex].a = 2* Math.random()*Math.PI;
onePart[inDex].posY = Math.random()*screen;
onePart[inDex].posX = Math.random()*screen;
onePart[inDex].bx = Math.random()*screen;
onePart[inDex].by = Math.random()*screen;
}
else {
for(var i:int=0; i<Elements; i++){ // :D hehe day three
diff = distance( inDex, i );
summv = makeGravity ( diff );
arcHelp = makeGravityArc( inDex, i, summv );
// onePart i has now the a with arcHelp as v
changeReal ( inDex, summv, arcHelp );
if ( realImag ) {
setImag ( inDex, i, diff );
}
} // end for
} // end of else
} // end function
} // end class UniverseTest
}
import flash.display.AVM1Movie; // hmhm
import flash.display.Graphics;
class reDbul {
public var rflag:Number;
public var rrealImag:Boolean;
public var posX:int;
public var posY:int;
public var v:int;
public var a:int;
public var bx:int;
public var by:int;
public var oldX:int;
public var oldY:int;
public var remix:int;
public var maxVelo:int;
public var myCoolor:int;
public var screenborder:int;
public var screenF:int;
public function reDbul(newyx:int, newyy:int, newyv:int, newya:int, newybx:int, newyby:int, maxi:int , screenb:int, screenfactor:int ):void {
rflag = 0;
rrealImag=true;
posX = newyx;
posY = newyy;
v = newyv;
a = newya;
bx = newybx;
by = newyby;
oldX = posX/2;
oldY = posY/2;
remix=0;
maxVelo = maxi;
myCoolor = Math.random()*0xFF33CC;
screenborder = screenb;
screenF = screenfactor; //:d
}
public function show (graphic:Graphics, diffColor:int, factorDisplay:Number, factorBox:Number, centerX:int, centerY:int, imagReaction:int):void
{
var Numberx:Number;
var Numbery:Number;
graphic.beginFill(myCoolor, 0.9);
if ( rrealImag )
{
Numberx = bx; Numbery = by;
graphic.drawRect(Numberx/screenF, Numbery/screenF, factorBox, factorBox ); //:D
}
Numberx = posX; Numbery = posY;
graphic.drawCircle(Numberx/screenF, Numbery/screenF, factorDisplay);
graphic.endFill();
if ( rrealImag )
{
graphic.beginFill(myCoolor, 0.1);
graphic.drawCircle(centerX/screenF, centerY/screenF, factorDisplay*imagReaction/screenF);
graphic.endFill();
}
}
public function move():void{
oldX =posX;
oldY = posY;
posX += v * Math.cos(a);
posY += v * Math.sin(a);
// visualisation trick
// v = v/100*80;
// a+=0.6;
}
public function bing():void{
if(v*v<0.001){
v+=0.1; // :d Quantenfluktuation PI
// interupts the full simulation
}
if(v*v>maxVelo*maxVelo){
v = v/2; // :d Quantenfluktuation PI
// interupts the full simulation
}
if(a>2*Math.PI){
a = a - 2*Math.PI;//maxvelocity;
}
if(a<-2*Math.PI){
a = a + 2*Math.PI;//maxvelocity;
}
if(posX==oldX || posY==oldY){
remix++;
}
else{
remix = 0;
}
if(posX>screenborder){
posX = 10;
}
if(posY>screenborder){ // ! upsidedown :D
posY = 10;
}
if(posX<=0){
posX = screenborder - 10;
}
if(posY<=0){
posY = screenborder - 10;
}
if(bx>screenborder){
bx = 10;
}
if(by>screenborder){ // ! upsidedown imagin :D
by = 10;
}
if(bx<=0){
bx = screenborder - 10;
}
if(by<=0){
by = screenborder - 10;
}
// the possision of the boxxes :D
} // end function bing
} // end class reDbul
// } // end package