Fix edges facing ship calc
This commit is contained in:
@@ -210,8 +210,8 @@
|
|||||||
position: { x: 0, y: 0 },
|
position: { x: 0, y: 0 },
|
||||||
// velocity: { x: 0, y: 0 },
|
// velocity: { x: 0, y: 0 },
|
||||||
|
|
||||||
velocity: { x: 5, y: 10 },
|
// velocity: { x: 5, y: 10 },
|
||||||
// velocity: { x: 10*mult, y: 10*mult },
|
velocity: { x: 5*mult, y: 10*mult },
|
||||||
acceleration: { x: 0, y: 0 },
|
acceleration: { x: 0, y: 0 },
|
||||||
rotate: 0,
|
rotate: 0,
|
||||||
collision: null,
|
collision: null,
|
||||||
@@ -817,28 +817,40 @@
|
|||||||
return cl.getPointAtLength(b);
|
return cl.getPointAtLength(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
function collisionPosition(edge, position, velocity, radius) {
|
function edgeCollisionPosition(xc, yc, x, y, edge, radius) {
|
||||||
const baseSlope = slope(edge);
|
const baseSlope = slope(edge);
|
||||||
// if (Object.is(baseSlope, 0)) s.isLanded = true;
|
// if (Object.is(baseSlope, 0)) s.isLanded = true;
|
||||||
|
|
||||||
const { xa, ya, xb, yb } = edge;
|
let { xa, ya, xb, yb } = edge;
|
||||||
const baseLine = { x1: xa, y1: ya, x2: xb, y2: yb };
|
|
||||||
|
const rise = yb - ya;
|
||||||
|
const run = xb - xa;
|
||||||
|
const length = distance(xa, ya, xb, yb);
|
||||||
|
|
||||||
|
const riol = rise / length * radius;
|
||||||
|
const ruol = run / length * radius;
|
||||||
|
|
||||||
|
const edgeSeg = { xa: xa + riol, ya: ya - ruol, xb: xb + riol, yb: yb - ruol};
|
||||||
|
|
||||||
|
// const { xa: x1, ya: y1, xb: x2, yb: y2 } = positionSeg;
|
||||||
|
// const { xa: x3, ya: y3, xb: x4, yb: y4 } = edgeSeg;
|
||||||
|
|
||||||
|
// const baseLine = { x1: xa, y1: ya, x2: xb, y2: yb };
|
||||||
|
const baseLine = { x1: edgeSeg.xa, y1: edgeSeg.ya, x2: edgeSeg.xb, y2: edgeSeg.yb };
|
||||||
|
|
||||||
const velocityLine = {
|
const velocityLine = {
|
||||||
x1: position.x,
|
x1: x,
|
||||||
y1: position.y,
|
y1: y,
|
||||||
x2: position.x + velocity.x,
|
x2: xc,
|
||||||
y2: position.y + velocity.y
|
y2: yc
|
||||||
};
|
};
|
||||||
|
|
||||||
// console.log("COLLISION DETECTED", s.collision);
|
|
||||||
|
|
||||||
// console.log("baseSlope", baseSlope);
|
// console.log("baseSlope", baseSlope);
|
||||||
const baseNrmlIntxn = perpIntxn(baseSlope, xa, ya, position.x, position.y);
|
const baseNrmlIntxn = perpIntxn(baseSlope, xa, ya, x, y);
|
||||||
const baseVelIntxn = lineIntxnPt(baseLine, velocityLine);
|
const baseVelIntxn = lineIntxnPt(baseLine, velocityLine);
|
||||||
// console.log("baseNrmlIntxn", baseNrmlIntxn, "baseVelIntxn", baseVelIntxn);
|
// console.log("baseNrmlIntxn", baseNrmlIntxn, "baseVelIntxn", baseVelIntxn);
|
||||||
const baseSegLength = distance(baseNrmlIntxn.x, baseNrmlIntxn.y , baseVelIntxn.x, baseVelIntxn.y);
|
const baseSegLength = distance(baseNrmlIntxn.x, baseNrmlIntxn.y , baseVelIntxn.x, baseVelIntxn.y);
|
||||||
const normalSegLength = distance(baseNrmlIntxn.x, baseNrmlIntxn.y, position.x, position.y);
|
const normalSegLength = distance(baseNrmlIntxn.x, baseNrmlIntxn.y, x, y);
|
||||||
// console.log("baseSegLength", baseSegLength, "normalSegLength", normalSegLength);
|
// console.log("baseSegLength", baseSegLength, "normalSegLength", normalSegLength);
|
||||||
const theta = Math.atan(normalSegLength / baseSegLength);
|
const theta = Math.atan(normalSegLength / baseSegLength);
|
||||||
const shipRadius = radius;
|
const shipRadius = radius;
|
||||||
@@ -847,10 +859,9 @@
|
|||||||
const cl = document.createElementNS(namespaceURIsvg, 'line');
|
const cl = document.createElementNS(namespaceURIsvg, 'line');
|
||||||
cl.setAttribute('x1', baseVelIntxn.x);
|
cl.setAttribute('x1', baseVelIntxn.x);
|
||||||
cl.setAttribute('y1', baseVelIntxn.y);
|
cl.setAttribute('y1', baseVelIntxn.y);
|
||||||
cl.setAttribute('x2', position.x);
|
cl.setAttribute('x2', x);
|
||||||
cl.setAttribute('y2', position.y);
|
cl.setAttribute('y2', y);
|
||||||
|
|
||||||
// console.log("h", h, "theta", theta);
|
|
||||||
const clPos = cl.getPointAtLength(h);
|
const clPos = cl.getPointAtLength(h);
|
||||||
return clPos;
|
return clPos;
|
||||||
}
|
}
|
||||||
@@ -896,8 +907,7 @@
|
|||||||
|
|
||||||
const efs = mes.filter(({ edge, wall }) => {
|
const efs = mes.filter(({ edge, wall }) => {
|
||||||
const { xa, ya, xb, yb } = edge;
|
const { xa, ya, xb, yb } = edge;
|
||||||
// console.log("xa", xa, "ya", ya, "xb", xb, "yb", yb);
|
const det = (xb - xa) * (y - ya) - (x - xa) * (yb - ya);
|
||||||
const det = (xb - xa) * (yc - ya) - (xc - xa) * (yb - ya);
|
|
||||||
return det < 0;
|
return det < 0;
|
||||||
});
|
});
|
||||||
console.log("edges facing ship", efs);
|
console.log("edges facing ship", efs);
|
||||||
@@ -927,11 +937,12 @@
|
|||||||
const s = ((x3-x1)*(y4-y3)-(x4-x3)*(y3-y1))/((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1));
|
const s = ((x3-x1)*(y4-y3)-(x4-x3)*(y3-y1))/((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1));
|
||||||
const t = -((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))/((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1));
|
const t = -((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))/((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1));
|
||||||
const roundedT = +t.toFixed(2);
|
const roundedT = +t.toFixed(2);
|
||||||
|
const roundedS = +s.toFixed(2);
|
||||||
|
|
||||||
console.log("positionSeg", positionSeg, "edgeSeg", edgeSeg);
|
console.log("positionSeg", positionSeg, "edgeSeg", edgeSeg);
|
||||||
console.log("s", s, "t", roundedT);
|
console.log("s", roundedS, "t", roundedT);
|
||||||
|
|
||||||
return s <= 1 && roundedT >= 0;
|
return roundedS <= 1 && roundedT >= 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
efs.forEach(({ edge, wall }) => {
|
efs.forEach(({ edge, wall }) => {
|
||||||
@@ -999,7 +1010,7 @@
|
|||||||
if (s.collision.corner) {
|
if (s.collision.corner) {
|
||||||
posP = cornerContactPosition(xc, yc, x, y, s.collision.corner, shipRadius);
|
posP = cornerContactPosition(xc, yc, x, y, s.collision.corner, shipRadius);
|
||||||
} else if (s.collision.edge) {
|
} else if (s.collision.edge) {
|
||||||
posP = collisionPosition(s.collision.edge, s.position, s.velocity, shipRadius);
|
posP = edgeCollisionPosition(xc, yc, x, y, s.collision.edge, shipRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
s.velocity = { x: 0, y: 0 };
|
s.velocity = { x: 0, y: 0 };
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Reference in New Issue
Block a user