diff --git a/html/images/space.svg b/html/images/space.svg
index 53f4440..20489c7 100644
--- a/html/images/space.svg
+++ b/html/images/space.svg
@@ -226,11 +226,11 @@
const s = {
position: { x: 0, y: 0 },
- // velocity: { x: 0, y: 0 },
+ velocity: { x: 0, y: 0 },
// velocity: { x: -100, y: -100 },
// velocity: { x: 2, y: 7 },
- velocity: { x: 2*mult, y: 7*mult },
+ // velocity: { x: 2*mult, y: 7*mult },
// acceleration: { x: 5, y: 7 },
acceleration: { x: 0, y: 0 },
rotate: 0,
@@ -279,7 +279,7 @@
return wall.classList.contains("inverse") ? cs.reverse() : cs;
});
- const ws = [...walls].map(node => {
+ const mapWalls = [...walls].map(node => {
const corners = node.getAttribute('points').split(' ').map(coords => {
const [x, y] = coords.split(',');
const pt = svg.createSVGPoint();
@@ -296,19 +296,19 @@
return { node, corners, edges };
});
- const mcs = ws.reduce(
+ const mapCorners = mapWalls.reduce(
(acc, wall) => [...acc, ...wall.corners.map(c => ({ corner: c, wall: wall }))],
[]
);
- const mes = ws.reduce(
+ const mapEdges = mapWalls.reduce(
(acc, wall) => [...acc, ...wall.edges.map(e => ({ edge: e, wall: wall }))],
[]
);
- console.log("walls on map", ws);
- console.log("corners on map", mcs);
- console.log("edges on map", mes);
+ console.log("walls on map", mapWalls);
+ console.log("corners on map", mapCorners);
+ console.log("edges on map", mapEdges);
const allEdgePts = allWallCorners.map(w =>
w.map((pt, i, arr) => [pt, arr[(i + 1) % arr.length]])
@@ -401,7 +401,7 @@
});
}
- function getForwardCorners(walls, position, velocity) {
+ function getForwardCorners(corners, position, velocity) {
const { x: x1, y: y1 } = position;
const { x: x2, y: y2 } = velocity;
@@ -455,16 +455,11 @@
const { a, b } = perppts;
// if (a && b) drawLine(a.x, a.y, b.x, b.y);
- return walls.reduce((acc, w) => {
- const filtered = a && b ? w.corners.filter(c => {
- // https://stackoverflow.com/a/1560510
-
- const det = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
- return det > 0;
- }).map(c => ({ corner: c, node: w.node })) : [];
-
- return [...acc, ...filtered];
- }, []);
+ return corners.filter(({ corner: c }) => {
+ if (!a || !b) return;
+ const det = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
+ return det > 0;
+ });
}
function updateTriangles([positionX, positionY]) {
@@ -665,9 +660,6 @@
const { xa: x1, ya: y1, xb: x2, yb: y2 } = positionSeg;
const { xa: x3, ya: y3, xb: x4, yb: y4 } = cornerSeg;
- drawLine(x1, y1, x2, y2);
- drawLine(x3, y3, x4, y4);
-
// 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));
@@ -691,22 +683,19 @@
};
}
- function withinCollisionDistance({ x: x1, y: y1 }, { x: x2, y: y2 }) {
+ function withinCollisionDistance({ x: x1, y: y1 }, { x: x2, y: y2 }, distance) {
const diffx = x2;
const diffy = y2;
const detv = x2 * y1 - y2 * x1;
const dv = Math.sqrt(diffy ** 2 + diffx ** 2);
const slopev = slope({ xa: x1, ya: y1, xb: x1 + x2, yb: y1 + y2 });
- return ({ corner: { x: x0, y: y0 }, node: n }) => {
+ return ({ corner: { x: x0, y: y0 }}) => {
const velNormIntxn = perpIntxn(slopev, x1, y1, x0, y0);
- // console.log("x0", x0, "y0", y0, "velNormIntxn", velNormIntxn);
const dx = Math.max(x0, velNormIntxn.x) - Math.min(x0, velNormIntxn.x);
const dy = Math.max(y0, velNormIntxn.y) - Math.min(y0, velNormIntxn.y);
const d = Math.sqrt(dy ** 2 + dx ** 2);
- // console.log("dddddddddddd", d);
- return d <= shipRadius;
- // return true;
+ return d <= distance;
};
}
@@ -791,17 +780,14 @@
let [xc, yc] = position;
// console.log("future position", xc, yc);
- const efs = getForwardEdges(mes, { x, y })
- // console.log("edges facing ship", efs);
-
- const edgeColl = efs.find(detectEdgeCollision([xc, yc], [x, y], shipRadius));
+ // edges oriented clockwise with ship
+ const fwdEdges = getForwardEdges(mapEdges, { x, y })
+ const edgeColl = fwdEdges.find(detectEdgeCollision([xc, yc], [x, y], shipRadius));
// corners ahead of ship
- const fCollC = getForwardCorners(ws, { x, y }, s.velocity);
-
- // corners within collision distance (are on the collision path)
- cwcd = fCollC.filter(withinCollisionDistance({ x, y }, s.velocity));
- const cornerColl = cwcd.find(detectCornerCollision([xc, yc], [x, y], shipRadius));
+ const fwdCorners = getForwardCorners(mapCorners, { x, y }, s.velocity);
+ const cornersInPath = fwdCorners.filter(withinCollisionDistance({ x, y }, s.velocity, shipRadius));
+ const cornerColl = cornersInPath.find(detectCornerCollision([xc, yc], [x, y], shipRadius));
current = s.collision;
s.collision = edgeColl || cornerColl;