优化vector2构造函数
This commit is contained in:
@@ -33,7 +33,7 @@ module es {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static lineToLineIntersection(a1: Vector2, a2: Vector2, b1: Vector2, b2: Vector2, intersection: Vector2 = new Vector2()): boolean {
|
||||
public static lineToLineIntersection(a1: Vector2, a2: Vector2, b1: Vector2, b2: Vector2, intersection: Vector2 = es.Vector2.zero): boolean {
|
||||
intersection.x = 0;
|
||||
intersection.y = 0;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ module es {
|
||||
return false;
|
||||
|
||||
// 求交点
|
||||
let point = Vector2.add(ray.start, Vector2.multiply(ray.direction, new Vector2(time.value)));
|
||||
let point = Vector2.add(ray.start, Vector2.multiplyScaler(ray.direction, time.value));
|
||||
|
||||
// 计算交点p位于b的哪个最小面和最大面之外。注意,u和v不能有相同的位集,它们之间必须至少有一个位集。
|
||||
let u, v = 0;
|
||||
@@ -49,7 +49,7 @@ module es {
|
||||
* @param n
|
||||
*/
|
||||
public static corner(b: Rectangle, n: number){
|
||||
let p = new Vector2();
|
||||
let p = es.Vector2.zero;
|
||||
p.x = (n & 1) == 0 ? b.right : b.left;
|
||||
p.y = (n & 1) == 0 ? b.bottom : b.top;
|
||||
return p;
|
||||
|
||||
@@ -34,7 +34,7 @@ module es {
|
||||
if (mtv.equals(Vector2.zero))
|
||||
return false;
|
||||
|
||||
hit.normal = new Vector2(-mtv.x);
|
||||
hit.normal = new Vector2(-mtv.x, -mtv.y);
|
||||
hit.normal.normalize();
|
||||
hit.distance = 0;
|
||||
hit.fraction = 0;
|
||||
@@ -42,14 +42,14 @@ module es {
|
||||
return true;
|
||||
} else {
|
||||
// 射线投射移动矢量
|
||||
let ray = new Ray2D(Vector2.zero, new Vector2(-movement.x));
|
||||
let ray = new Ray2D(Vector2.zero, new Vector2(-movement.x, -movement.y));
|
||||
let fraction = new Ref(0);
|
||||
if (minkowskiDiff.rayIntersects(ray, fraction) && fraction.value <= 1) {
|
||||
hit.fraction = fraction.value;
|
||||
hit.distance = movement.length() * fraction.value;
|
||||
hit.normal = new Vector2(-movement.x, -movement.y);
|
||||
hit.normal.normalize();
|
||||
hit.centroid = Vector2.add(first.bounds.center, Vector2.multiply(movement, new Vector2(fraction.value)));
|
||||
hit.centroid = Vector2.add(first.bounds.center, Vector2.multiplyScaler(movement, fraction.value));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ module es {
|
||||
if (collided) {
|
||||
result.normal = Vector2.normalize(Vector2.subtract(first.position, second.position));
|
||||
let depth = sumOfRadii - Math.sqrt(distanceSquared);
|
||||
result.minimumTranslationVector = Vector2.multiply(new Vector2(-depth), result.normal);
|
||||
result.point = Vector2.add(second.position, Vector2.multiply(result.normal, new Vector2(second.radius)));
|
||||
result.minimumTranslationVector = Vector2.multiplyScaler(result.normal, -depth);
|
||||
result.point = Vector2.add(second.position, Vector2.multiplyScaler(result.normal, second.radius));
|
||||
|
||||
// 这可以得到实际的碰撞点,可能有用也可能没用,所以我们暂时把它留在这里
|
||||
// let collisionPointX = ((first.position.x * second.radius) + (second.position.x * first.radius)) / sumOfRadii;
|
||||
@@ -35,7 +35,7 @@ module es {
|
||||
result.point = closestPointOnBounds.clone();
|
||||
|
||||
// 计算MTV。找出安全的、非碰撞的位置,并从中得到MTV
|
||||
let safePlace = Vector2.add(closestPointOnBounds, Vector2.multiply(result.normal, new Vector2(circle.radius)));
|
||||
let safePlace = Vector2.add(closestPointOnBounds, Vector2.multiplyScaler(result.normal, circle.radius));
|
||||
result.minimumTranslationVector = Vector2.subtract(circle.position, safePlace);
|
||||
|
||||
return true;
|
||||
@@ -45,14 +45,14 @@ module es {
|
||||
|
||||
// 看框上的点距圆的半径是否小于圆的半径
|
||||
if (sqrDistance == 0) {
|
||||
result.minimumTranslationVector = Vector2.multiply(result.normal, new Vector2(circle.radius));
|
||||
result.minimumTranslationVector = Vector2.multiplyScaler(result.normal, circle.radius);
|
||||
} else if (sqrDistance <= circle.radius * circle.radius) {
|
||||
result.normal = Vector2.subtract(circle.position, closestPointOnBounds);
|
||||
let depth = result.normal.length() - circle.radius;
|
||||
|
||||
result.point = closestPointOnBounds;
|
||||
Vector2Ext.normalize(result.normal);
|
||||
result.minimumTranslationVector = Vector2.multiply(new Vector2(depth), result.normal);
|
||||
result.minimumTranslationVector = Vector2.multiplyScaler(result.normal, depth);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -85,7 +85,7 @@ module es {
|
||||
mtv = new Vector2(result.normal.x * circle.radius, result.normal.y * circle.radius);
|
||||
} else {
|
||||
let distance = Math.sqrt(distanceSquared.value);
|
||||
mtv = Vector2.subtract(new Vector2(-1), Vector2.subtract(poly2Circle, closestPoint))
|
||||
mtv = Vector2.multiplyScaler(Vector2.subtract(poly2Circle, closestPoint), -1)
|
||||
.multiply(new Vector2((circle.radius - distance) / distance));
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,7 @@ module es {
|
||||
let t = Vector2.dot(w, v) / Vector2.dot(v, v);
|
||||
t = MathHelper.clamp(t, 0, 1);
|
||||
|
||||
return Vector2.add(lineA, Vector2.multiply(v, new Vector2(t)));
|
||||
return Vector2.add(lineA, Vector2.multiplyScaler(v, t));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -56,7 +56,7 @@ module es {
|
||||
if (u < 0 || u > 1)
|
||||
return false;
|
||||
|
||||
intersection = Vector2.add(a1, Vector2.multiply(new Vector2(t), b));
|
||||
intersection = Vector2.add(a1, Vector2.multiplyScaler(b, t));
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -64,7 +64,7 @@ module es {
|
||||
public static lineToCircle(start: Vector2, end: Vector2, s: Circle, hit: RaycastHit): boolean{
|
||||
// 计算这里的长度并分别对d进行标准化,因为如果我们命中了我们需要它来得到分数
|
||||
let lineLength = Vector2.distance(start, end);
|
||||
let d = Vector2.divide(Vector2.subtract(end, start), new Vector2(lineLength));
|
||||
let d = Vector2.divideScaler(Vector2.subtract(end, start), lineLength);
|
||||
let m = Vector2.subtract(start, s.position);
|
||||
let b = Vector2.dot(m, d);
|
||||
let c = Vector2.dot(m, m) - s.radius * s.radius;
|
||||
@@ -85,7 +85,7 @@ module es {
|
||||
if (hit.fraction < 0)
|
||||
hit.fraction = 0;
|
||||
|
||||
hit.point = Vector2.add(start, Vector2.multiply(new Vector2(hit.fraction), d));
|
||||
hit.point = Vector2.add(start, Vector2.multiplyScaler(d, hit.fraction));
|
||||
hit.distance = Vector2.distance(start, hit.point);
|
||||
hit.normal = Vector2.normalize(Vector2.subtract(hit.point, s.position));
|
||||
hit.fraction = hit.distance / lineLength;
|
||||
|
||||
@@ -7,8 +7,8 @@ module es {
|
||||
if (collided) {
|
||||
result.normal = Vector2.normalize(Vector2.subtract(point, circle.position));
|
||||
let depth = sumOfRadii - Math.sqrt(distanceSquared);
|
||||
result.minimumTranslationVector = Vector2.multiply(new Vector2(-depth, -depth), result.normal);
|
||||
result.point = Vector2.add(circle.position, Vector2.multiply(result.normal, new Vector2(circle.radius, circle.radius)));
|
||||
result.minimumTranslationVector = Vector2.multiplyScaler(result.normal, -depth);
|
||||
result.point = Vector2.add(circle.position, Vector2.multiplyScaler(result.normal, circle.radius));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ module es {
|
||||
let firstEdges = first.edgeNormals.slice();
|
||||
let secondEdges = second.edgeNormals.slice();
|
||||
let minIntervalDistance = Number.POSITIVE_INFINITY;
|
||||
let translationAxis = new Vector2();
|
||||
let translationAxis = es.Vector2.zero;
|
||||
let polygonOffset = Vector2.subtract(first.position, second.position);
|
||||
let axis: Vector2;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user