MicroBot champ!

Jump to navigation Jump to search

MicroBot champ!

Congrats dude! From someone who knows how tough it is to dethrone Skilgannon... =)

Voidious16:11, 30 April 2013

Thanks!

I tried for a long time to improve the gun, but that didn't work so I ended up just copying Toorkild's new mode selection and improving anti-ram.

Now it's only a matter of waiting for Toorkild 0.4.6. :(

Sheldor16:21, 30 April 2013
 

Wow, impressed that you managed to squeeze that in. Of course, Toorkild is now functionally equivalent at 711 bytes, the real issue is thinking of something to add =) And half of your score margin is from not being in LittleBlackBook's books... perhaps it is time for Waylander to make a comeback?

Skilgannon09:05, 1 May 2013

I wouldn't mind seeing Decado, Waylander, Toorkild, and Connavar back in the rumble. The rule is to not have multiple versions of the same bot in the rumble, not to not have multiple similar bots in the rumble.

Sheldor20:00, 1 May 2013
 

Mwa Ha Ha!

I just did something absolutely brilliant which squeezed 14 bytes from the GFT system itself, and I now have 18 bytes free, plus ~9 bytes if I get desperate. Any ideas about what I should do with that space?

Sheldor19:41, 1 May 2013

Huh, it seems it wasn't so brilliant after all. Version 1.9.0 is ~0.5 APS lower than 1.8.0.

The main change was to the way the wave system gathers bearing offsets. Version 1.8.0 used the traditional, coordinate-based method, whereas version 1.9.0 sums angular velocities. I made sure to keep it as precise as I could, I even adjusted the distance by which I divide the lateral velocity to calculate angular velocities with advancing velocities (actually negative advancing velocities, you might call them "retreating velocities") to account for the opponent moving toward or away from the source location of the wave.

Is there some obscure element of Robocode physics that makes sums of angular velocities inaccurate? Or is there a bug in my code?

Sheldor01:57, 2 May 2013
 

Don't think anything about Robocode itself should lead to an inaccuracy. Could it be a normalization bug? When normalizing angles, an individual angle is equivalent no matter how it gets normalized, but if you're summing or averaging them it can screw things up. E.g., average of {2.9, 3.0, 3.1, -3.1, -3.0, -2.9} is 0, but you'd want the result to be something more like pi.

Voidious03:23, 2 May 2013

Normalization should be irrelevant because everything is already relative.

I might be on to something though. I'm wondering if the inaccuracy is coming from the original absoluteBearing being used to calculate LV and AV. Should it be updated with angular velocities?

Sheldor04:05, 2 May 2013
 

You'd need to keep a list of the positions you were in and backtrace the enemy movement until the wave could originate at your location - a sort of backwards wave, as it were, otherwise you are getting the angular velocities from your current location, not from where you were when you wanted to fire. Also, are the indexes for the VCS calculated using the values from when you were firing, or when you are having the wave hit?

Skilgannon08:59, 2 May 2013

All segmentation is calculated when the wave is fired.

Why do you think I'm getting the angular velocities relative to EM's current location? I store the absoluteBearing from the tick in which the wave was fired, and both e.getVelocity() and e.getHeadingRadians() are absolute and shouldn't be relative to anything.

Thanks

Sheldor12:37, 2 May 2013

Ah, OK, looking at the source I see that you've still kept the wave structure, I thought you had completely gotten rid of it and then each tick look back to see what wave would hit now over the last N ticks of bullet flight time and retro-actively construct the wave from the conditions as they were then. What you've done isn't quite that drastic =)

As for what is different, have you tried projecting the point back into the cartesian plane and printing it to see if it is the same as the actual enemy location? How about using both types of tracking at once and seeing if they are giving the same results at wave-hit time?

Skilgannon13:22, 2 May 2013
 

You do not have permission to edit this page, for the following reasons:

  • The action you have requested is limited to users in the group: Users.
  • You must confirm your email address before editing pages. Please set and validate your email address through your user preferences.

You can view and copy the source of this page.

Return to Thread:Talk:ÉpéeistMicro/MicroBot champ!/reply (11).

I'm not sure, I'd have to see source code to properly understand what's happening here. But it seems that they aren't being registered as 'hit' at the same time. Could it be that?

Skilgannon15:39, 2 May 2013
 

That's what I assume.

Here's the current developmental code with all the debug code (I realize that it's quite a bit larger than 730 bytes.):

/*
EpeeistMicro v1.9.1 by Sheldor.  05/02/2013
A MicroBot with Stop and Go/Random movement and a guess factor gun.
Codesize: 730 Bytes without any colors.

Epee (pronounced ey-PEY) is one of the three forms of modern sport fencing,
along with Foil and Sabre.  http://en.wikipedia.org/wiki/Epee

Credits: 
Thanks go to the authors of the following bots:
	Targeting: Falcon, pez.micro.Aristocles, voidious.mini.Komarious, kc.micro.Thorn, jam.micro.RaikoMicro, jk.mini.CunobelinDC, mld.LittleBlackBook, jk.micro.Connavar.
	Movement : jk.micro.Toorkild, kc.micro.Thorn, wiki.nano.RaikoNano.
Special thanks to Jdev and Voidious for helping me with a math error.
And a general thanks to all open source bot authors and contributors to the RoboWiki.

EpeeistMicro is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1.
See license here: http://robowiki.net/wiki/RWPCL
*/

package sheldor.micro;

import robocode.*;
import robocode.util.Utils;
import java.awt.geom.*;

public class EpeeistMicro extends AdvancedRobot
{
	//Constants.
	static final int    GUESS_FACTORS = 25;
	static final int    MIDDLE_FACTOR = (GUESS_FACTORS - 1) / 2;
	static final double MAXIMUM_ESCAPE_ANGLE = 0.72727272727272727272727272727273; //8 / 11
	static final double FACTOR_ANGLE = MAXIMUM_ESCAPE_ANGLE / MIDDLE_FACTOR;
	
	//Global variables.
	static double averageLateralVelocity;
	static double direction = 1;
	static double enemyBulletSpeed;
	static double enemyEnergy;
	static double enemyHeading;
	static double enemyVelocity;
	static double enemyX;
	static double enemyY;
	static double hits;
	static int    absoluteEnemyLateralVelocity;
	static int    movementMode;
	static int    timeSinceVelocityChange;
	
	static int ticks;
	
	//Array to store the number of times the enemy has visited each guess factor.
	//Segmented on acceleration, time since velocity change, absolute enemy lateral velocity, near wall, and distance.
	static int[][][][][][] guessFactors = new int[3][4][5][2][5][GUESS_FACTORS];
	
	//En garde!
	public void run()
	{
		//Set the radar and gun to turn independently.
		setAdjustRadarForGunTurn(true);
		setAdjustGunForRobotTurn(true);
	}
	
	public void onStatus(StatusEvent e)
	{
		//Turn the radar every tick.
		//Putting the code here instead of in the run() method saves one byte.
		//I believe Wompi discovered this.
    	setTurnRadarRightRadians(1);
	}
	
	public void onScannedRobot(ScannedRobotEvent e)
	{
		//Local variables.	
		//Declare most used integer before most used double to save several bytes.
		int    antiRam;
		double enemyDistance;
		double absoluteBearing;
		double enemyDirection;
		double lateralVelocity;
		double offset;
		double theta;
		int    acceleration;
		
		ticks = (int)getTime();
		
		//Fire a wave.
		Wave wave;
		addCustomEvent(wave = new Wave());
		
		enemyX = (wave.sourceX = getX()) + Math.sin(wave.absoluteBearing = absoluteBearing = 
			(e.getBearingRadians() + getHeadingRadians())) * (enemyDistance = e.getDistance());
		enemyY = (wave.sourceY = getY()) + Math.cos(absoluteBearing) * enemyDistance;
		
		/*********************************************
		 *---------------MOVEMENT CODE---------------*
		 *********************************************/
				
		//Retreat very heavily when the enemy is ramming.
		offset = 2 + (antiRam = (int)(100 / (wave.enemyDistance = enemyDistance = e.getDistance())));
		
		//Wall smoothing based on Toorkild's.
		//Subtract current coordinates from lower wall bounds instead of adding 
		//current coordinates to every fieldRectangle.contains() projection to save six bytes.  Thanks go to Skilgannon.
		Rectangle2D.Double fieldRectangle;
		while(!(fieldRectangle = new Rectangle2D.Double(18 - getX(), 18 - getY(), 764, 564)).
			contains(160 * Math.sin(theta = (wave.absoluteBearing = absoluteBearing = 
			(e.getBearingRadians() + getHeadingRadians())) + direction * (offset -= .02)), 160 * Math.cos(theta)));
		setTurnRightRadians(Math.tan(theta -= getHeadingRadians()));
			
		//Stop and Go movement based on Toorkild's.
		//Move when the enemy fires, or when the robot is moving randomly, or when the enemy is ramming.
		double energyDelta;
		if ((energyDelta = (enemyEnergy - (enemyEnergy = e.getEnergy()))) > movementMode - antiRam)
		{			
			//Calculate the length of Stop and Go movement based on enemy bullet power.
			setAhead(((3 + (int)(energyDelta / 0.5000001)) << 3) * Math.signum(Math.cos(theta)));
		}
		
		//Random movement from Toorkild.
		//Don't move randomly if the enemy is ramming, or if the bot is in Stop and Go mode.
		//Reverse direction if the bot gets too close to a wall.
		if (Math.random() + antiRam < (-0.6 * Math.sqrt(enemyBulletSpeed / enemyDistance) + 0.04) * movementMode || offset < Math.PI/3.5)
		{
			direction = -direction;
		}
		
		/********************************************
		 *--------------TARGETING CODE--------------*
		 ********************************************/
		
		//Determine the enemy's lateral velocity and movement direction.
		//Use a simple rolling average to store the previous lateral direction
		//if enemy lateral velocity == 0.  Inspired by LittleBlackBook.
		wave.enemyDirection = enemyDirection = (averageLateralVelocity = ((averageLateralVelocity * .01) +
			(lateralVelocity = ((enemyVelocity = e.getVelocity()) * Math.sin((enemyHeading = e.getHeadingRadians()) - absoluteBearing))))) < 0 ? -FACTOR_ANGLE : FACTOR_ANGLE;
		
		//Determine if the enemy is accelerating or decelerating.
		if ((acceleration = (int)Math.signum(absoluteEnemyLateralVelocity - (absoluteEnemyLateralVelocity = (int)Math.abs(lateralVelocity)))) != 0)
		{
			timeSinceVelocityChange = 0;
		}
					
		//Determine the current situation.
		//Declaring a local array saves two bytes.
		double angle;
		int[] guessFactorsLocal = wave.guessFactors = guessFactors
			[1 + acceleration] //Acceleration.
			[Math.min(3, (int)(Math.pow(280 * timeSinceVelocityChange++ / enemyDistance, .7)))] //Ticks since velocity change.
			[absoluteEnemyLateralVelocity / 2] //Absolute enemy lateral velocity.
			[(int)Math.signum(fieldRectangle.outcode(Math.sin(angle = (absoluteBearing +
				enemyDirection * MIDDLE_FACTOR)) * enemyDistance, Math.cos(angle) * enemyDistance))] //Near wall.  Many thanks go to Skilgannon for the outcode trick.
			[(int)enemyDistance / 200]; //Distance.

		//Find the most visited guess factor for the current situation.
		//Looping like this is ugly, but it saves two bytes over the proper way.
		int mostVisited = MIDDLE_FACTOR;
		int i = 0;
		try
		{
			while (true)
			{
				if (guessFactorsLocal[i] > guessFactorsLocal[mostVisited])
				{
					mostVisited = i;
				}
				i++;
			}			
		}
		catch(Exception ex)
		{
		}
		
		//Turn the gun to the most visited guess factor.
		//The slight offset helps to defeat simple bullet shielding.
		setTurnGunRightRadians(0.0005 + Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()
			+ (enemyDirection * (mostVisited - MIDDLE_FACTOR))));
		
		//Fire medium power bullets most of the time, but use full power at very close range.
		//If the enemy is weak, fire the minimum power needed to destroy them.
		setFire(Math.min(2 + antiRam, enemyEnergy / 4));
		
		//Narrow lock radar.
		setTurnRadarRightRadians(2 * Utils.normalRelativeAngle(absoluteBearing - getRadarHeadingRadians()));
	}
	
	public void onBulletHit(BulletHitEvent e)
	{
		//Adjust enemy energy variable when the bot hits the enemy.
		//This makes a big difference against linear targeting.
		enemyEnergy -= 10;
	}
	
	public void onHitByBullet(HitByBulletEvent e)
	{
		//Adjust enemy energy variable when the bot gets hit.
		//Store the velocity of the enemy bullet for the random movement.
		enemyEnergy += 20 - (enemyBulletSpeed = e.getVelocity());	
		
		//If the bot takes a lot of damage on average in Stop and Go mode, switch to Random Movement.
		//Thanks go to Skilgannon.
		if ((hits += (4.25 / enemyBulletSpeed)) > getRoundNum() + 2)
		{
			movementMode = -1;
		}
    }	
	
	static class Wave extends Condition
	{
		//Global variables.
		double absoluteBearing;
		double bearingOffset;
		double enemyDirection;
		double enemyDistance;
		double sourceX;
		double sourceY;	
		double waveDistanceTraveled;
		double distanceTraveled;
		int[]  guessFactors;
		
		public boolean test()
		{
			//Update the bearing offset with angular velocities.
			bearingOffset += (enemyVelocity * Math.sin(enemyHeading -= absoluteBearing)) / (enemyDistance += (enemyVelocity * Math.cos(enemyHeading/* - absoluteBearing*/)));
			
			//Check if the wave has passed the enemy's current location.
			if (Math.abs((waveDistanceTraveled += 14) - enemyDistance) <= 7)
			{
				//Calculate the guess factor that would have hit the enemy.
				//Increment the bin that represents that guess factor.
				guessFactors[(int)Math.round((bearingOffset / enemyDirection) + MIDDLE_FACTOR)]++;
				
				System.out.println("New Method - Tick: " + ticks + " - "  + bearingOffset);
			}
			
			if (Math.abs((distanceTraveled += 14) - Point2D.distance(sourceX, sourceY, enemyX, enemyY)) <= 7)
			{
				//Calculate the guess factor that would have hit the enemy.
				//Increment the bin that represents that guess factor.
				System.out.println("Old Method - Tick: " + ticks + " - "  + Utils.normalRelativeAngle(Math.atan2(enemyX - sourceX,
					enemyY - sourceY) - absoluteBearing));
			}
			return false;
		}
	}
}

Thanks

Sheldor16:22, 2 May 2013
 

Doing enemyHeading -= absoluteBearing in the test() method breaks things because many waves are evaluated each tick, but even after fixing that I'm seeing very different values for Point2D.distance(sourceX, sourceY, enemyX, enemyY) and enemyDistance, which is where I suspect the errors are creeping in. Of course, I can't see anything wrong with what you are doing :-/ Maybe a step-by-step printing/debugging with only one wave in the air would let you see how enemyDistance is deviating from the old value on a per-tick basis?

Skilgannon16:51, 2 May 2013
 

For some reason, enemyDistance is always 20-40 pixels less than the Point2D.distance() calculation.

Sheldor03:32, 3 May 2013

OK, it seems that was just some bad debug code.

Here is the output of some better code from another match against Aristocles:

enemyDistance:      421.8353598250484 | 0.3262547699680305
Point2D.distance(): 448.53557664288616 | 0.3287244704708572
enemyDistance:      426.5898450566982 | 0.3110026475866431
Point2D.distance(): 451.0228395307428 | 0.31181919800128544
enemyDistance:      431.3303591738597 | 0.29589636808079267
Point2D.distance(): 453.62120158823615 | 0.2950913052555979
enemyDistance:      436.0839893680426 | 0.28097853037196463
Point2D.distance(): 456.36030020768567 | 0.27857098989436047
enemyDistance:      440.669495490207 | 0.2659461287692405
Point2D.distance(): 459.0287365459099 | 0.26209282925475996
enemyDistance:      445.23723962496933 | 0.2510420373849656
Point2D.distance(): 461.8001101783056 | 0.2457928442753019
enemyDistance:      449.7727243115645 | 0.23624072152954914
Point2D.distance(): 464.6562034767721 | 0.2296605866669701
enemyDistance:      454.2613816205908 | 0.22151755013472293
Point2D.distance(): 467.57918268154947 | 0.21368391942304665
enemyDistance:      458.51682597099244 | 0.20660476164365077
Point2D.distance(): 470.36143375505645 | 0.19768990433137024
enemyDistance:      462.6968603513805 | 0.19172833220073712
Point2D.distance(): 473.1799462825239 | 0.18181955296537122
enemyDistance:      466.7884043134722 | 0.1768707910183386
Point2D.distance(): 476.0201003737446 | 0.16606105657547676
enemyDistance:      470.7783059278863 | 0.1620160438410283
Point2D.distance(): 478.8676357225633 | 0.15040230638997265
enemyDistance:      474.8451730591144 | 0.14738247912452332
Point2D.distance(): 481.91348493399096 | 0.13500317678637241
enemyDistance:      478.8129467294319 | 0.132753059182493
Point2D.distance(): 484.96690248720176 | 0.11970764580503435
enemyDistance:      482.7073423251047 | 0.11815840346102317
Point2D.distance(): 488.0550460940423 | 0.10453833109284627
enemyDistance:      486.3719972703192 | 0.10342632992633781
Point2D.distance(): 491.0142422498307 | 0.08935517795886572
enemyDistance:      490.0128959796447 | 0.08878019020539497
Point2D.distance(): 494.0606637930172 | 0.07433630902046406
enemyDistance:      493.47091559293216 | 0.07405808563663252
Point2D.distance(): 497.0292146865964 | 0.059344841810967885
enemyDistance:      496.7290105812168 | 0.059251759263135195
Point2D.distance(): 499.90429310070715 | 0.04436768149464321
enemyDistance:      499.9603447350002 | 0.044518643713827896
Point2D.distance(): 502.8631109133297 | 0.029543056890399377
enemyDistance:      502.96094897125784 | 0.029685559228334657
Point2D.distance(): 505.69898691442023 | 0.014708881978805266
enemyDistance:      505.90648427680526 | 0.014897137740659604
Point2D.distance(): 508.58981891261766 | -0.0

Wave# 49:
enemyDistance:      389.652074900973 | 0.42019101436150297
Point2D.distance(): 432.67348017611505 | 0.43410156310463144
enemyDistance:      394.76426122913375 | 0.40439872303833824
Point2D.distance(): 434.79214023370037 | 0.4163153132883899
enemyDistance:      399.8042178947086 | 0.3886607324825147
Point2D.distance(): 436.95740410317904 | 0.3986461821461038
enemyDistance:      404.75784458928865 | 0.37294842832525327
Point2D.distance(): 439.1518964167109 | 0.38108387564541246
enemyDistance:      409.77245512550263 | 0.3575484251106345
Point2D.distance(): 441.5547421841489 | 0.3637551952075846
enemyDistance:      414.68933254663483 | 0.342148046311834
Point2D.distance(): 443.97051550094255 | 0.3465300335127832
enemyDistance:      419.5081162618981 | 0.32674888229342
Point2D.distance(): 446.3994165098057 | 0.3294079685071214
enemyDistance:      424.25670545150444 | 0.31140177185180345
Point2D.distance(): 448.87485465438704 | 0.3124131787149427
enemyDistance:      428.9632635766217 | 0.29615386430161383
Point2D.distance(): 451.42931739281096 | 0.2955714740872937
enemyDistance:      433.65577444964003 | 0.2810494849740932
Point2D.distance(): 454.0940515833997 | 0.27891088762452476
enemyDistance:      438.36147286764685 | 0.26613061890949785
Point2D.distance(): 456.8985597161345 | 0.26246194710477777
enemyDistance:      442.89815391119197 | 0.25109902079569935
Point2D.distance(): 459.6320923932965 | 0.2460552620043206
enemyDistance:      447.41698142400645 | 0.23619372053869206
Point2D.distance(): 462.4676903870144 | 0.22982986410209705
enemyDistance:      451.9033845789699 | 0.22138961483559907
Point2D.distance(): 465.38716672612065 | 0.21377480497397716
enemyDistance:      456.3427240471944 | 0.2066624770112274
Point2D.distance(): 468.37272542983663 | 0.19787748471527689
enemyDistance:      460.5477261608859 | 0.1917488400094281
Point2D.distance(): 471.2174248217063 | 0.18196148689867453
enemyDistance:      464.67697279794953 | 0.17687099531137696
Point2D.distance(): 474.09768326295455 | 0.16617070810233248
enemyDistance:      468.7173344314597 | 0.16201176288288033
Point2D.distance(): 476.99891706253374 | 0.15049301311847607
enemyDistance:      472.6556146130359 | 0.1471553195958354
Point2D.distance(): 479.9069031972826 | 0.13491599686292677
enemyDistance:      476.6711914347358 | 0.1325163597358948
Point2D.distance(): 483.01194412931414 | 0.11960225140579794
enemyDistance:      480.5872500434403 | 0.11788154730950084
Point2D.distance(): 486.1238964154333 | 0.1043927608339068
enemyDistance:      484.42962504582266 | 0.10328097708738215
Point2D.distance(): 489.26982271459724 | 0.08931045709449492
enemyDistance:      488.04135073469956 | 0.08854548738576205
Point2D.distance(): 492.28657860116044 | 0.07421299819077731
enemyDistance:      491.629230270297 | 0.07389442741002242
Point2D.distance(): 495.3896453612583 | 0.05928143964294286
enemyDistance:      495.03356308857764 | 0.059168877231874785
Point2D.distance(): 498.4144417990766 | 0.04437664606007807
enemyDistance:      498.23728985674074 | 0.044360803525827115
Point2D.distance(): 501.34540432759763 | 0.029485362336786558
enemyDistance:      501.4141683159546 | 0.02962451423529522
Point2D.distance(): 504.35921634033 | 0.014748039944415758
enemyDistance:      504.3595982636573 | 0.01479038967854867
Point2D.distance(): 507.24979703667464 | -0.0

Wave# 50:
enemyDistance:      387.4846505535087 | 0.4203999289986841
Point2D.distance(): 430.4341063847221 | 0.4347774644980591
enemyDistance:      392.6207672232136 | 0.4045708132132716
Point2D.distance(): 432.57788385647285 | 0.4169155123516388
enemyDistance:      397.6982237925255 | 0.38882486340712474
Point2D.distance(): 434.7853323326794 | 0.39918465884096754
enemyDistance:      402.7031179578982 | 0.3731318680462723
Point2D.distance(): 437.03879058905903 | 0.3815751743264846
enemyDistance:      407.6212947228206 | 0.3574636545067727
Point2D.distance(): 439.3209089912862 | 0.36407616386125063
enemyDistance:      412.60072786633026 | 0.3421028053240593
Point2D.distance(): 441.81014223175526 | 0.34681879832902496
enemyDistance:      417.4819937439589 | 0.3267411343661304
Point2D.distance(): 444.3117031935182 | 0.3296677669300596
enemyDistance:      422.26474393811213 | 0.311380229702149
Point2D.distance(): 446.8257706670681 | 0.3126225361612791
enemyDistance:      426.9770058471701 | 0.29607022936798755
Point2D.distance(): 449.3856093401777 | 0.2957079638396687
enemyDistance:      431.64706398982224 | 0.28085764002746594
Point2D.distance(): 452.0235558628228 | 0.2789504556901994
enemyDistance:      436.3030176874337 | 0.26578619865580944
Point2D.distance(): 454.77069772265014 | 0.262378547225242
enemyDistance:      440.97221261517177 | 0.25089735734911023
Point2D.distance(): 457.65636860366965 | 0.24602316174408667
enemyDistance:      445.47171929338975 | 0.23589706099003602
Point2D.distance(): 460.47065183806336 | 0.22971002979642918
enemyDistance:      449.9533037109324 | 0.22102098840415962
Point2D.distance(): 463.3858758118037 | 0.2135818790941464
enemyDistance:      454.40233996749504 | 0.20624442165283044
Point2D.distance(): 466.3838956826631 | 0.1976271414037205
enemyDistance:      458.8041351543362 | 0.1915434967747327
Point2D.distance(): 469.44696617445084 | 0.18183264526798837
enemyDistance:      462.97074935315305 | 0.17665849777201953
Point2D.distance(): 472.36900273384674 | 0.1660177194235244
enemyDistance:      467.0613489797617 | 0.1618085323626487
Point2D.distance(): 475.3256972057598 | 0.15032979363484955
enemyDistance:      471.0627677902255 | 0.1469766823260782
Point2D.distance(): 478.3025135922399 | 0.13475633273876397
enemyDistance:      474.9617760776511 | 0.13214736871284322
Point2D.distance(): 481.28527765962787 | 0.11928456986512703
enemyDistance:      478.9383291421153 | 0.11753211359791224
Point2D.distance(): 484.4634942944353 | 0.10408040836209409
enemyDistance:      482.81504570663805 | 0.10292076857477911
Point2D.distance(): 487.64778619555693 | 0.08898117864798927
enemyDistance:      486.6178497925696 | 0.08834298747528273
Point2D.distance(): 490.8650969051406 | 0.07401019590866831
enemyDistance:      490.1893243132479 | 0.07363220105550412
Point2D.distance(): 493.9529524662961 | 0.05902233893678677
enemyDistance:      493.7368854034367 | 0.05900435873395718
Point2D.distance(): 497.12595959558814 | 0.04420223235065279
enemyDistance:      497.1004004932433 | 0.04430307705770034
Point2D.distance(): 500.22018942536016 | 0.029408004279542155
enemyDistance:      500.26280041431465 | 0.02952051682009638
Point2D.distance(): 503.2201270188375 | 0.014626209541868107
enemyDistance:      503.3982867112673 | 0.014808368331270211
Point2D.distance(): 506.3017883395013 | -0.0

Wave# 51:
enemyDistance:      385.15060907151144 | 0.4201247543960749
Point2D.distance(): 428.15233454131607 | 0.4351078493431446
enemyDistance:      390.309475598363 | 0.4042493619385357
Point2D.distance(): 430.3224844934704 | 0.41716869294564596
enemyDistance:      395.42304857642256 | 0.388486621843811
Point2D.distance(): 432.57322461603445 | 0.3993751482070227
enemyDistance:      400.47778332059744 | 0.3728052427820432
Point2D.distance(): 434.88683366300023 | 0.3817183731284297
enemyDistance:      405.4597400344883 | 0.357175408185234
Point2D.distance(): 437.24567815695656 | 0.3641878707784496
enemyDistance:      410.354728320097 | 0.3415693091036985
Point2D.distance(): 439.6324443792351 | 0.34677202374275407
enemyDistance:      415.31114956527534 | 0.32626635203817445
Point2D.distance(): 442.22475602691907 | 0.32960716866843676
enemyDistance:      420.1691222614358 | 0.31096190522307887
Point2D.distance(): 444.828627403079 | 0.31255181435913393
enemyDistance:      424.928305930827 | 0.29565756821602485
Point2D.distance(): 447.4442135347911 | 0.2956052919364103
enemyDistance:      429.6168110599043 | 0.2804029405720947
Point2D.distance(): 450.1046024346513 | 0.278793257242703
enemyDistance:      434.2630005840818 | 0.2652440354620127
Point2D.distance(): 452.84194761427636 | 0.2621428114641997
enemyDistance:      438.8950486283361 | 0.25022413690982
Point2D.distance(): 455.68714402465935 | 0.24568307181357962
enemyDistance:      443.54037266611476 | 0.2353842842729466
Point2D.distance(): 458.6693224637761 | 0.2294454137900983
enemyDistance:      448.0155741064073 | 0.2204337133464419
Point2D.distance(): 461.5795955518273 | 0.21324982842683493
enemyDistance:      452.4728087970372 | 0.20560549735036668
Point2D.distance(): 464.58941675673714 | 0.1972433842188206
enemyDistance:      456.8974151932714 | 0.19087522544229973
Point2D.distance(): 467.6806971607651 | 0.1814137780468652
enemyDistance:      461.27466571636455 | 0.17621932383165909
Point2D.distance(): 470.83575722412166 | 0.165747163615797
enemyDistance:      465.4161894255864 | 0.16138099773030162
Point2D.distance(): 473.84956491118317 | 0.1500578931681389
enemyDistance:      469.4815309939153 | 0.14657690342015592
Point2D.distance(): 476.89692212643627 | 0.1344975353476645
enemyDistance:      473.4575004717402 | 0.13179033282138297
Point2D.distance(): 479.9633535155015 | 0.11905308698139816
enemyDistance:      477.3308467016577 | 0.11700590295549135
Point2D.distance(): 483.03474643656256 | 0.10371135950961552
enemyDistance:      481.2818981088572 | 0.10243271091776633
Point2D.distance(): 486.29963410075555 | 0.08864211333713179
enemyDistance:      485.1329072759097 | 0.08786305225397936
Point2D.distance(): 489.5695781009957 | 0.07367841689996357
enemyDistance:      488.90985605790166 | 0.07332625166295863
Point2D.distance(): 492.8713784361479 | 0.05884403275174588
enemyDistance:      492.455035867368 | 0.0586577198235711
Point2D.distance(): 496.04337899300384 | 0.04399061334031806
enemyDistance:      495.97625880642425 | 0.04407083916252802
Point2D.distance(): 499.29912196112525 | 0.02930693506440285
enemyDistance:      499.3131134775056 | 0.029411146123528888
Point2D.distance(): 502.47547408010206 | 0.014647950424095058
enemyDistance:      502.44852459322374 | 0.014670951178170633
Point2D.distance(): 505.5569799748665 | -0.0

Wave# 54:
enemyDistance:      383.628209817036 | 0.4018303368413147
Point2D.distance(): 423.3647986201156 | 0.41684219193319816
enemyDistance:      388.8065537304753 | 0.38593491993939677
Point2D.distance(): 425.69997623422495 | 0.39881829006613234
enemyDistance:      393.96618539125006 | 0.3702104642337615
Point2D.distance(): 428.14865183535005 | 0.3809786707816256
enemyDistance:      399.09394816459684 | 0.3546240373696175
Point2D.distance(): 430.69271581372107 | 0.36331572066546336
enemyDistance:      404.1762254381392 | 0.339143410545862
Point2D.distance(): 433.3139733661452 | 0.3458193176522144
enemyDistance:      409.19941939150885 | 0.3237383553009885
Point2D.distance(): 435.9948076235071 | 0.3284777727175099
enemyDistance:      414.14953867801967 | 0.30838004979117656
Point2D.distance(): 438.7177278257046 | 0.31127789059256106
enemyDistance:      419.0123442477055 | 0.2930416028545948
Point2D.distance(): 441.4655888171755 | 0.29420553765954516
enemyDistance:      423.93682565823786 | 0.2779949838725762
Point2D.distance(): 444.412886648231 | 0.27741445621675265
enemyDistance:      428.7624716372235 | 0.2629439559848812
Point2D.distance(): 447.3687303870382 | 0.2607421347217036
enemyDistance:      433.48895269677564 | 0.2478902014219436
Point2D.distance(): 450.33320743295695 | 0.2441874310372807
enemyDistance:      438.1444936259084 | 0.2328821169661521
Point2D.distance(): 453.3387631360754 | 0.22777866082914677
enemyDistance:      442.7575651956281 | 0.21796461575622958
Point2D.distance(): 456.41689239769045 | 0.21154521178431018
enemyDistance:      447.3564443730751 | 0.2031799675502207
Point2D.distance(): 459.59780588762635 | 0.19551807937326426
enemyDistance:      451.968647333714 | 0.18856827687958386
Point2D.distance(): 462.9099218076666 | 0.17973006009609893
enemyDistance:      456.41013068768297 | 0.17384643079070766
Point2D.distance(): 466.1482008083585 | 0.16398203441142112
enemyDistance:      460.8335861541128 | 0.15924155907441107
Point2D.distance(): 469.48086918910303 | 0.14843549123598443
enemyDistance:      465.2243032107267 | 0.14472998373076038
Point2D.distance(): 472.8900771107752 | 0.13307564819097095
enemyDistance:      469.56750665051464 | 0.13028882806805794
Point2D.distance(): 476.3584142770431 | 0.117886403614472
enemyDistance:      473.67423352848243 | 0.11566797301966585
Point2D.distance(): 479.68472774498514 | 0.10266574641911674
enemyDistance:      477.7045481773917 | 0.10107859509452341
Point2D.distance(): 483.04055525137585 | 0.08757891838769094
enemyDistance:      481.6452281509794 | 0.08650449328933135
Point2D.distance(): 486.41166059213947 | 0.07261138423264857
enemyDistance:      485.4829929158686 | 0.07193075717298464
Point2D.distance(): 489.7841705520529 | 0.0577485872585175
enemyDistance:      489.39868299708525 | 0.05756114908766319
Point2D.distance(): 493.34309616425594 | 0.043172877804712684
enemyDistance:      493.2140484811843 | 0.04319337303118382
Point2D.distance(): 496.9034440898901 | 0.02870338932002614
enemyDistance:      496.95515064152727 | 0.0288560653167099
Point2D.distance(): 500.4915054796334 | 0.014365359302923153
enemyDistance:      500.46388119058514 | 0.014388979073293234
Point2D.distance(): 503.9485953153811 | -0.0

Wave# 55:
enemyDistance:      381.27195377300626 | 0.40339296720681894
Point2D.distance(): 421.07767445697243 | 0.41854843856240187
enemyDistance:      386.41264326121984 | 0.3873159721918108
Point2D.distance(): 423.35314096493636 | 0.4003830666233643
enemyDistance:      391.54810838162047 | 0.3714415306004865
Point2D.distance(): 425.76030537299107 | 0.3824128173968582
enemyDistance:      396.66475065002106 | 0.3557351733787074
Point2D.distance(): 428.28020179470053 | 0.3646316916592731
enemyDistance:      401.7493372486454 | 0.34016453326447565
Point2D.distance(): 430.89473061354784 | 0.34703146633162607
enemyDistance:      406.7881751617802 | 0.3246979150813549
Point2D.distance(): 433.58571825791245 | 0.32960143356651805
enemyDistance:      411.76759375747577 | 0.30930557778285495
Point2D.distance(): 436.33557635178755 | 0.3123293596244938
enemyDistance:      416.6735310832441 | 0.29395915478251056
Point2D.distance(): 439.12684946743974 | 0.2952015378342807
enemyDistance:      421.4916814968214 | 0.2786321747537381
Point2D.distance(): 441.94243214134127 | 0.27820336192856665
enemyDistance:      426.3718405932179 | 0.2635925212843566
Point2D.distance(): 444.9561880929483 | 0.26149176056609846
enemyDistance:      431.15263410339395 | 0.2485484697611953
Point2D.distance(): 447.977865159523 | 0.24490034461099164
enemyDistance:      435.8337477320614 | 0.23350168026889856
Point2D.distance(): 451.00754063957703 | 0.22842788426864669
enemyDistance:      440.443562941189 | 0.2184998174110351
Point2D.distance(): 454.07753359700087 | 0.2121031787583867
enemyDistance:      445.0106982324726 | 0.20358711944254482
Point2D.distance(): 457.21921079687786 | 0.19595602631990605
enemyDistance:      449.563571415286 | 0.18880523681677489
Point2D.distance(): 460.46265115354737 | 0.18001775407755805
enemyDistance:      454.1298338214034 | 0.17419371330786057
Point2D.distance(): 463.83613709226216 | 0.1643214030100184
enemyDistance:      458.5245592957379 | 0.15947372068086368
Point2D.distance(): 467.13540279517 | 0.14866439705323842
enemyDistance:      462.9011732058717 | 0.14486892028317028
Point2D.distance(): 470.52803285816935 | 0.13321083078943108
enemyDistance:      467.2448980075383 | 0.13035601796605267
Point2D.distance(): 473.9962303038815 | 0.117945469324364
enemyDistance:      471.5408933380339 | 0.11591249821462345
Point2D.distance(): 477.52264267326166 | 0.10285180299783914
enemyDistance:      475.59938661276084 | 0.10129213046136078
Point2D.distance(): 480.906887544785 | 0.08772489546025053
enemyDistance:      479.5811531100277 | 0.08670275419065532
Point2D.distance(): 484.3198566600783 | 0.07273244631119091
enemyDistance:      483.4729260610956 | 0.07212843033988936
Point2D.distance(): 487.747363776143 | 0.05785964866344173
enemyDistance:      487.26138492269394 | 0.05755449358064989
Point2D.distance(): 491.1755851558824 | 0.043091705439194605
enemyDistance:      491.12806984369684 | 0.04318134329366577
Point2D.distance(): 494.7888417027615 | 0.028613204869047948
enemyDistance:      494.8940444413517 | 0.028810047560079037
Point2D.distance(): 498.4028217760007 | 0.014240802019815924
enemyDistance:      498.5854785732572 | 0.014468763618823575
Point2D.distance(): 502.04371860568017 | -0.0

Wave# 56:
enemyDistance:      378.6051184072665 | 0.4066568750168591
Point2D.distance(): 418.9018467142781 | 0.42159610370339085
enemyDistance:      383.6730201143045 | 0.3903073285020906
Point2D.distance(): 421.06373491476575 | 0.40325609911855675
enemyDistance:      388.7488017301679 | 0.3741905784677061
Point2D.distance(): 423.37550577673693 | 0.38511663975191723
enemyDistance:      393.8193131175118 | 0.35827314168836266
Point2D.distance(): 425.818574396249 | 0.36717499543408305
enemyDistance:      398.8708370818898 | 0.3425212613718305
Point2D.distance(): 428.3739760475242 | 0.34942483976244887
enemyDistance:      403.8900274705151 | 0.3269032108499098
Point2D.distance(): 431.023617394551 | 0.33185764364509307
enemyDistance:      408.8630776439352 | 0.311387898254189
Point2D.distance(): 433.7493367122483 | 0.31446240613269527
enemyDistance:      413.7762087454563 | 0.29594613181748386
Point2D.distance(): 436.5335610173933 | 0.2972266216874502
enemyDistance:      418.61525395097334 | 0.28055005779625825
Point2D.distance(): 439.3588536166958 | 0.28013632917771414
enemyDistance:      423.36580880442057 | 0.2651736780026864
Point2D.distance(): 442.2081298723648 | 0.26317668778774284
enemyDistance:      428.17886711081326 | 0.2500799097058013
Point2D.distance(): 445.25493355258226 | 0.246506196988995
enemyDistance:      432.89177181049126 | 0.2349824696246637
Point2D.distance(): 448.30933742277534 | 0.22995655202139975
enemyDistance:      437.5042314829644 | 0.2198829614595108
Point2D.distance(): 451.3714141434601 | 0.21352647992748608
enemyDistance:      442.04486055945387 | 0.20482812753983004
Point2D.distance(): 454.47341936303104 | 0.1972450179282026
enemyDistance:      446.5424970421342 | 0.18986135326776504
Point2D.distance(): 457.64665567403915 | 0.18114216552363693
enemyDistance:      451.02576790098124 | 0.17502350722926802
Point2D.distance(): 460.9211361867022 | 0.16524941150663697
enemyDistance:      455.52252514914267 | 0.16035342904945749
Point2D.distance(): 464.325075700978 | 0.14959991494195268
enemyDistance:      459.8465322933524 | 0.14557754607708132
Point2D.distance(): 467.6545992323779 | 0.13398940275360083
enemyDistance:      464.1523037212795 | 0.13091520264375464
Point2D.distance(): 471.07696809804696 | 0.11858324849593416
enemyDistance:      468.42496247237506 | 0.11634356386932047
Point2D.distance(): 474.57441266150767 | 0.1033659944275298
enemyDistance:      472.649571579889 | 0.10184054467392865
Point2D.distance(): 478.1296101798854 | 0.08832093053056855
enemyDistance:      476.63515853139626 | 0.08716475724209985
Point2D.distance(): 481.5425662900484 | 0.07324168979905199
enemyDistance:      480.54355280594626 | 0.07251982330445908
Point2D.distance(): 484.9838477320971 | 0.058297176098651704
enemyDistance:      484.3614222128913 | 0.05789011613158117
Point2D.distance(): 488.4392937558694 | 0.04347245004152889
enemyDistance:      488.0753872770291 | 0.04326126333441768
Point2D.distance(): 491.89510580112625 | 0.028752597626358956
enemyDistance:      491.86802340172375 | 0.028829361093870968
Point2D.distance(): 495.53525854204224 | 0.014323299278037993
enemyDistance:      495.5593784898155 | 0.014399764565170947
Point2D.distance(): 499.17578325987097 | -0.0

Wave# 57:
enemyDistance:      376.046754560444 | 0.41145309153271314
Point2D.distance(): 416.8540615424325 | 0.42577965467830303
enemyDistance:      381.04823832205966 | 0.39484927917872714
Point2D.distance(): 418.9018467142781 | 0.40727280442535285
enemyDistance:      386.02696167447493 | 0.37841573349287705
Point2D.distance(): 421.06373491476575 | 0.38893279984051876
enemyDistance:      391.0136566503927 | 0.3622105770009695
Point2D.distance(): 423.37550577673693 | 0.37079334047387924
enemyDistance:      395.99502003070677 | 0.3462012289790274
Point2D.distance(): 425.818574396249 | 0.35285169615604506
enemyDistance:      400.9571757859101 | 0.3303547913700057
Point2D.distance(): 428.3739760475242 | 0.3351015404844109
enemyDistance:      405.8866261648047 | 0.31464030821953326
Point2D.distance(): 431.023617394551 | 0.3175343443670551
enemyDistance:      410.7694126192672 | 0.29902741319521425
Point2D.distance(): 433.7493367122483 | 0.3001391068546573
enemyDistance:      415.59161171397074 | 0.28348757461556884
Point2D.distance(): 436.5335610173933 | 0.2829033224094122
enemyDistance:      420.3389166707679 | 0.2679935554594733
Point2D.distance(): 439.3588536166958 | 0.26581302989967615
enemyDistance:      424.9967913519145 | 0.2525199271511413
Point2D.distance(): 442.2081298723648 | 0.24885338850970484
enemyDistance:      429.71783054201364 | 0.23732342075957197
Point2D.distance(): 445.25493355258226 | 0.23218289771095701
enemyDistance:      434.3376633689631 | 0.22212450820566373
Point2D.distance(): 448.30933742277534 | 0.21563325274336176
enemyDistance:      438.85602954148874 | 0.20692470792705864
Point2D.distance(): 451.3714141434601 | 0.19920318064944809
enemyDistance:      443.3018549033775 | 0.19176959546437347
Point2D.distance(): 454.47341936303104 | 0.1829217186501646
enemyDistance:      447.7042705311046 | 0.17670147491186478
Point2D.distance(): 457.64665567403915 | 0.16681886624559894
enemyDistance:      452.0921824589422 | 0.1617602231743724
Point2D.distance(): 460.9211361867022 | 0.15092611222859897
enemyDistance:      456.4937103825974 | 0.14698378813365648
Point2D.distance(): 464.325075700978 | 0.1352766156639147
enemyDistance:      460.720870769676 | 0.13210518437355287
Point2D.distance(): 467.6545992323779 | 0.11966610347556284
enemyDistance:      464.92963001688906 | 0.11733831067015965
Point2D.distance(): 471.07696809804696 | 0.10425994921789616
enemyDistance:      469.10497874763183 | 0.10266090151037933
Point2D.distance(): 474.57441266150767 | 0.08904269514949181
enemyDistance:      473.2318514104417 | 0.08805140482670842
Point2D.distance(): 478.1296101798854 | 0.07399763125253056
enemyDistance:      477.1176792988135 | 0.0732745509432684
Point2D.distance(): 481.5425662900484 | 0.058918390521014
enemyDistance:      480.9256952932001 | 0.05852860065483865
Point2D.distance(): 484.9838477320971 | 0.04397387682061371
enemyDistance:      484.6424806959998 | 0.04379831485154948
Point2D.distance(): 488.4392937558694 | 0.029149150763490894
enemyDistance:      488.2545783506524 | 0.02906968535262087
Point2D.distance(): 491.89510580112625 | 0.014429298348320962
enemyDistance:      491.9459376274789 | 0.014533303597659739
Point2D.distance(): 495.53525854204224 | -0.0

Wave# 58:
enemyDistance:      373.5274415972566 | 0.41631121556611494
Point2D.distance(): 414.88376999899697 | 0.4299949590898411
enemyDistance:      378.4922463645331 | 0.3995172293228793
Point2D.distance(): 416.8540615424325 | 0.41135035632998207
enemyDistance:      383.40311880168514 | 0.38283174838372025
Point2D.distance(): 418.9018467142781 | 0.3928435060770319
enemyDistance:      388.2909711160015 | 0.36631347182443774
Point2D.distance(): 421.06373491476575 | 0.3745035014921978
enemyDistance:      393.1868857935778 | 0.35001917555346873
Point2D.distance(): 423.37550577673693 | 0.3563640421255583
enemyDistance:      398.07740816031907 | 0.33391717071172305
Point2D.distance(): 425.818574396249 | 0.3384223978077241
enemyDistance:      402.9485050546776 | 0.3179754092669894
Point2D.distance(): 428.3739760475242 | 0.3206722421360908
enemyDistance:      407.7865288051462 | 0.3021636992721022
Point2D.distance(): 431.023617394551 | 0.3031050460187341
enemyDistance:      412.57737072632307 | 0.2864523947550774
Point2D.distance(): 433.7493367122483 | 0.2857098085063363
enemyDistance:      417.30696462259874 | 0.2708136204197235
Point2D.distance(): 436.5335610173933 | 0.2684740240610912
enemyDistance:      421.960865693875 | 0.25522075347814466
Point2D.distance(): 439.3588536166958 | 0.2513837315513552
enemyDistance:      426.52440816161334 | 0.2396489335814434
Point2D.distance(): 442.2081298723648 | 0.23442409016138477
enemyDistance:      431.15176798348386 | 0.22434872350965998
Point2D.distance(): 445.25493355258226 | 0.21775359936263605
enemyDistance:      435.6768818892931 | 0.20904733094603345
Point2D.distance(): 448.30933742277534 | 0.2012039543950408
enemyDistance:      440.0995210013315 | 0.19374619069870264
Point2D.distance(): 451.3714141434601 | 0.18477388230112712
enemyDistance:      444.4489188801207 | 0.17848971412171366
Point2D.distance(): 454.47341936303104 | 0.16849242030184364
enemyDistance:      448.7544958023305 | 0.16331912486896946
Point2D.distance(): 457.64665567403915 | 0.15238956789727798
enemyDistance:      453.04543293543173 | 0.148273307588613
Point2D.distance(): 460.9211361867022 | 0.136496813880278
enemyDistance:      457.3501138054843 | 0.13338931669447215
Point2D.distance(): 464.325075700978 | 0.12084731731559373
enemyDistance:      461.478833907563 | 0.11840675820989621
Point2D.distance(): 467.6545992323779 | 0.10523680512724187
enemyDistance:      465.5889900391305 | 0.10353408040930702
Point2D.distance(): 471.07696809804696 | 0.0898306508695752
enemyDistance:      469.665442541143 | 0.08874958712996472
Point2D.distance(): 474.57441266150767 | 0.07461339680117085
enemyDistance:      473.6929994510464 | 0.07403225991240603
Point2D.distance(): 478.1296101798854 | 0.0595683329042096
enemyDistance:      477.4775240022302 | 0.05915296511278922
Point2D.distance(): 481.5425662900484 | 0.044489092172693034
enemyDistance:      481.1836290012336 | 0.044304588149034874
Point2D.distance(): 484.9838477320971 | 0.02954457847229186
enemyDistance:      484.7978113868785 | 0.02947227925478494
Point2D.distance(): 488.4392937558694 | 0.014719852415169932
enemyDistance:      488.30653853791085 | 0.014642396542997881
Point2D.distance(): 491.89510580112625 | -0.0

Notice that enemyDistance starts at about 40 pixels less than the distance calculation, but usually ends up about the same.

Sheldor01:26, 7 May 2013