diff --git a/html/images/space.svg b/html/images/space.svg
index 7fab802..4b6ea77 100644
--- a/html/images/space.svg
+++ b/html/images/space.svg
@@ -196,8 +196,10 @@
const s = {
position: { x: 0, y: 0 },
+ velocity: { x: 0, y: 0 },
+
// velocity: { x: 5, y: -10 },
- velocity: { x: -5*mult, y: -10*mult },
+ // velocity: { x: -5*mult, y: -10*mult },
// velocity: { x: 5*mult, y: -10*mult },
// velocity: { x: -5*mult, y: 10*mult },
// velocity: { x: 0, y: -10 },
@@ -642,11 +644,31 @@
return +hc.toFixed(2) <= shipRadius;
}
- function detectCornerCollision([xc, yc], [x, y]) {
- cornerPt.x = x - xc;
- cornerPt.y = y - yc;
+ function detectCornerCollision([xc, yc], [x, y], radius) {
+ return c => {
+ if (xc === x && yc === y) return;
- return shipBody.isPointInFill(cornerPt);
+ const d = distance(c.corner.x, c.corner.y, xc, yc);
+
+ if (d <= radius) return true;
+
+ const positionSeg = { xa: xc, ya: yc, xb: x, yb: y };
+ const slopeps = slope(positionSeg);
+ const posNormIntxn = perpIntxn(slopeps, x, y, c.corner.x, c.corner.y);
+ const cornerSeg = { xa: c.corner.x, ya: c.corner.y, xb: posNormIntxn.x, yb: posNormIntxn.y };
+
+ const { x: x0, y: y0 } = c.corner;
+ const { xa: x1, ya: y1, xb: x2, yb: y2 } = positionSeg;
+ const { xa: x3, ya: y3, xb: x4, yb: y4 } = cornerSeg;
+
+ // https://en.wikipedia.org/wiki/Intersection_(geometry)#Two_line_segments
+ // https://en.wikipedia.org/wiki/Cramer%27s_rule#Explicit_formulas_for_small_systems
+ 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 roundedT = +t.toFixed(2);
+
+ return s >= 0 && roundedT <= 1;
+ };
}
// function detectCollisions(position, walls, edges, z) {
@@ -842,22 +864,19 @@
let { x, y } = s.position;
console.log("current position", x, y);
- // console.log("elapsed", elapsed, "changeX", changeX, "changeY", changeY);
- // let position = [positionX, positionY] = restart ? [0, 0] : wrapPos(changeX + x, changeY + y);
let position = [positionX, positionY] = [changeX + x, changeY + y];
let [xc, yc] = position;
console.log("future position", xc, yc);
const collE = getCollisionEdges(edgeszz, position);
- // console.log("position", { x, y }, "velocity", s.velocity);
- // const collC = getCollisionCorners(ws, { x, y }, s.velocity);
- const fCollC = getForwardCollisionCorners(ws, { x, y }, s.velocity);
+ // corners ahead of ship
+ const fCollC = getForwardCollisionCorners(ws, { x, y }, s.velocity);
// console.log("corners ahead of ship", fCollC);
+ // corners within collision distance
cwcd = fCollC.filter(withinCollisionDistance({ x, y }, s.velocity));
-
- // console.log("corners on collision path", cwcd);
+ console.log("corners on collision path", cwcd);
// cwcd.forEach(c => {
// const positionSeg = { xa: x, ya: y, xb: xc, yb: yc };
@@ -869,44 +888,16 @@
// lineSegIntxn(c.corner, positionSeg, cornerSeg);
// });
- // console.log("collision corners", collC);
ccps = fCollC.filter(cornerCollisionPosition({ x, y }, s.velocity));
// console.log("corner collision position", ccps);
+ console.log("collision edges", collE);
+
current = s.collision;
// s.collision = detectCollisions(position, allWallCorners, collE);
- s.collision = cwcd.find(c => {
- if (xc === x && yc === y) return;
- const d = distance(c.corner.x, c.corner.y, xc, yc);
+ s.collision = cwcd.find(detectCornerCollision([xc, yc], [x, y], shipRadius));
- if (d <= shipRadius) return;
-
- const positionSeg = { xa: xc, ya: yc, xb: x, yb: y };
- const slopeps = slope(positionSeg);
- const posNormIntxn = perpIntxn(slopeps, x, y, c.corner.x, c.corner.y);
- const cornerSeg = { xa: c.corner.x, ya: c.corner.y, xb: posNormIntxn.x, yb: posNormIntxn.y };
-
- const { x: x0, y: y0 } = c.corner;
- const { xa: x1, ya: y1, xb: x2, yb: y2 } = positionSeg;
- const { xa: x3, ya: y3, xb: x4, yb: y4 } = cornerSeg;
-
- // https://en.wikipedia.org/wiki/Intersection_(geometry)#Two_line_segments
- // https://en.wikipedia.org/wiki/Cramer%27s_rule#Explicit_formulas_for_small_systems
- 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 roundedT = +t.toFixed(2);
-
- // console.log("corner", c.corner);
- // console.log("positionSeg", positionSeg);
- // console.log("cornerSeg", cornerSeg);
- // console.log("s", s, "t", t);
- // console.log("d", d, "shipRadius", shipRadius);
-
- return s >= 0 && roundedT <= 1;
- });
-
- // legs.style.display = !legs.style.display || legs.style.display === "none" ? "initial" : "none";
legs.style.display = s.gearDown ? "initial" : "none";
if (!current && s.collision) {