1
0
forked from 0ad/0ad

Add Vector2D angleTo and Vector3D horizAngleTo function.

Use it to illustrate the building placement preview rotation and
focusing of attacked units.

Split from D1037
Patch By: temple
This was SVN commit r20496.
This commit is contained in:
elexis 2017-11-21 16:17:30 +00:00
parent 7e8849366b
commit 8ee2a8aca2
4 changed files with 41 additions and 6 deletions

View File

@ -155,6 +155,15 @@ Vector2D.prototype.distanceTo = function(v)
return Math.euclidDistance2D(this.x, this.y, v.x, v.y);
};
/**
* Returns the angle going from this position to v.
* Angles are between -PI and PI. E.g., north is 0, east is PI/2.
*/
Vector2D.prototype.angleTo = function(v)
{
return Math.atan2(v.x - this.x, v.y - this.y);
};
// Static 2D functions
//
// Static functions that return a new vector object.
@ -334,6 +343,14 @@ Vector3D.prototype.horizDistanceTo = function(v)
return Math.sqrt(this.horizDistanceToSquared(v));
};
/**
* Returns the angle going from this position to v.
*/
Vector3D.prototype.horizAngleTo = function(v)
{
return Math.atan2(v.x - this.x, v.z - this.z);
};
// Static 3D functions
//
// Static functions that return a new vector object.

View File

@ -666,8 +666,7 @@ function handleInputBeforeGui(ev, hoveredObject)
if (Math.abs(dragDeltaX) >= maxDragDelta || Math.abs(dragDeltaY) >= maxDragDelta)
{
// Rotate in the direction of the mouse
var target = Engine.GetTerrainAtScreenPoint(ev.x, ev.y);
placementSupport.angle = Math.atan2(target.x - placementSupport.position.x, target.z - placementSupport.position.z);
placementSupport.angle = placementSupport.position.horizAngleTo(Engine.GetTerrainAtScreenPoint(ev.x, ev.y));
}
else
{

View File

@ -4597,16 +4597,15 @@ UnitAI.prototype.FaceTowardsTarget = function(target)
var cmpTargetPosition = Engine.QueryInterface(target, IID_Position);
if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
return;
var pos = cmpPosition.GetPosition();
var targetpos = cmpTargetPosition.GetPosition();
var angle = Math.atan2(targetpos.x - pos.x, targetpos.z - pos.z);
var targetpos = cmpTargetPosition.GetPosition2D();
var angle = cmpPosition.GetPosition2D().angleTo(targetpos);
var rot = cmpPosition.GetRotation();
var delta = (rot.y - angle + Math.PI) % (2 * Math.PI) - Math.PI;
if (Math.abs(delta) > 0.2)
{
var cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion);
if (cmpUnitMotion)
cmpUnitMotion.FaceTowardsPoint(targetpos.x, targetpos.z);
cmpUnitMotion.FaceTowardsPoint(targetpos.x, targetpos.y);
}
};

View File

@ -124,6 +124,16 @@ var brokenVector = {
TS_ASSERT_EQUALS(v8.y, 0);
}
// Test Vector2D angleTo
{
let v1 = new Vector2D(1, 1);
let v2 = new Vector2D(1, 3);
let v3 = new Vector2D(3, 1);
TS_ASSERT_EQUALS(v1.angleTo(v2), 0);
TS_ASSERT_EQUALS(v1.angleTo(v3), Math.PI / 2);
TS_ASSERT_EQUALS(v3.angleTo(v2), -Math.PI / 4);
}
// Test Vector3D distance and compareLength
{
let v1 = new Vector3D(2, 5, 14);
@ -160,3 +170,13 @@ var brokenVector = {
TS_ASSERT_EQUALS(v5.y, 6);
TS_ASSERT_EQUALS(v5.z, -3);
}
// Test Vector3D horizAngleTo
{
let v1 = new Vector3D(1, 1, 1);
let v2 = new Vector3D(1, 2, 3);
let v3 = new Vector3D(3, 10, 1);
TS_ASSERT_EQUALS(v1.horizAngleTo(v2), 0);
TS_ASSERT_EQUALS(v1.horizAngleTo(v3), Math.PI / 2);
TS_ASSERT_EQUALS(v3.horizAngleTo(v2), -Math.PI / 4);
}