diff --git a/html/images/space.svg b/html/images/space.svg index 347ad83..bdd8c01 100644 --- a/html/images/space.svg +++ b/html/images/space.svg @@ -122,8 +122,14 @@ - - + + + + + + + + @@ -200,23 +206,10 @@ const s = { position: { x: 0, y: 0 }, - velocity: { x: -10, y: -10 }, + // 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: 0, y: -10 }, - // velocity: { x: 10, y: 10 }, - // velocity: { x: -10, y: -10 }, - // velocity: { x: 10, y: -10 }, - // velocity: { x: -10, y: 10 }, - // velocity: { x: -10, y: 0 }, - // velocity: { x: 10, y: 0 }, - // velocity: { x: 0, y: -5000 }, - - // velocity: { x: 0.25 * mult, y: 1 * mult }, - // velocity: { x: 0, y: 1 * mult }, + velocity: { x: -1, y: -1 }, + // velocity: { x: 10*mult, y: 10*mult }, acceleration: { x: 0, y: 0 }, rotate: 0, collision: null, @@ -267,24 +260,49 @@ // console.log("allWallCorners", allWallCorners); const ws = [...walls].map(node => { + const corners = node.getAttribute('points').split(' ').map(coords => { + const [x, y] = coords.split(','); + const pt = svg.createSVGPoint(); + pt.x = +x; + pt.y = +y; + return pt; + }); + + const edges = corners.map(({ x: xa, y: ya }, i, arr) => { + // return [+x, +y]; + // const [xb, yb] = arr[i]++; + const { x: xb, y: yb } = arr[(i + 1) % arr.length]; + // console.log("coords", { xa: +x, ya: +y, xb: +xb, yb: +yb, inverse: wall.classList.contains("inverse") }); + + // return `${+x},${+y} ${+xb},${+yb}`; + return { + xa: xa, + ya: ya, + xb: xb, + yb: yb, + }; + }); + return { node, - corners: node.getAttribute('points').split(' ').map(coords => { - const [x, y] = coords.split(','); - const pt = svg.createSVGPoint(); - pt.x = +x; - pt.y = +y; - return pt; - }) + corners, + edges }; }); const mcs = ws.reduce( - (acc, wall) => [...acc, ...wall.corners.map(c => ({ corner: c, node: wall }))], + (acc, wall) => [...acc, ...wall.corners.map(c => ({ corner: c, wall: wall }))], [] ); + const mes = ws.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); const edgeszz = [...walls].map(wall => { const es = wall.getAttribute('points').split(' ').map((coords, i, arr) => { @@ -475,7 +493,7 @@ } const { a, b } = perppts; - // if (a && b) drawLine(a.x, a.y, b.x, b.y); + 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 => { @@ -874,6 +892,52 @@ const collE = getCollisionEdges(edgeszz, position); + const efs = mes.filter(({ edge, wall }) => { + const { xa, ya, xb, yb } = edge; + console.log("xa", xa, "ya", ya, "xb", xb, "yb", yb); + const det = (xb - xa) * (yc - ya) - (xc - xa) * (yb - ya); + return det < 0; + }); + console.log("edges facing ship", efs); + + efs.forEach(({ edge, wall }) => { + const { xa, ya, xb, yb } = edge; + const sl = slope(edge); + if (sl === Infinity) { + drawLine(xa + shipRadius, ya, xb + shipRadius, yb); + } else if (sl === -Infinity) { + drawLine(xa - shipRadius, ya, xb - shipRadius, yb); + } else if (Object.is(sl, -0)) { + drawLine(xa, ya + shipRadius, xb, yb + shipRadius); + } else if (sl === 0) { + drawLine(xa, ya - shipRadius, xb, yb - shipRadius); + } else { + const rise = yb - ya; + const run = xb - xa; + // drawLine(xa + 2, ya - 2, xb, yb); + // if (sl > 0) + // drawLine(xa + run, ya - rise, xb + run, yb - rise); + const length = distance(xa, ya, xb, yb) + + // drawLine(xa + rise, ya - run, xb + rise, yb - run); + drawLine(xa + rise / length * shipRadius, ya - run / length * + shipRadius, xb + rise / length * shipRadius, yb - run / length * + shipRadius); + + //determine length of edge and divide values by length? + + // else + // drawLine(xa - run, ya + rise, xb - run, yb + rise); + // drawLine(xa - rise, ya + run, xb - rise, yb + run); + + + // drawLine(xa - run, ya - rise, xb, yb); + // drawLine(xa - rise, ya - run, xb, yb); + // drawLine(xa + rise, ya + run, xb + rise, yb + run); + } + console.log(edge, "slope", sl); + }); + // corners ahead of ship const fCollC = getForwardCollisionCorners(ws, { x, y }, s.velocity); // console.log("corners ahead of ship", fCollC); @@ -882,26 +946,10 @@ cwcd = fCollC.filter(withinCollisionDistance({ x, y }, s.velocity)); // console.log("corners on collision path", cwcd); - // cwcd.forEach(c => { - // const positionSeg = { xa: x, ya: y, xb: xc, yb: yc }; - // 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 }; - // - // lineSegIntxn(c.corner, positionSeg, cornerSeg); - // }); - - 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); const cornerColl = cwcd.find(detectCornerCollision([xc, yc], [x, y], shipRadius)); - console.log("edge we are tracking", collE); + const edgeColl = collE.find(({ edge, wall }) => { const { xa, ya, xb, yb } = edge; const da = distance(xa, ya, xc, yc); @@ -927,7 +975,6 @@ if (!current && s.collision) { // const baseSlope = slope(s.collision.edge); // if (Object.is(baseSlope, 0) && s.gearDown) s.isLanded = true; - // const clPos = collisionPosition(s.collision.edge, s.position, s.velocity, s.gearDown && Object.is(baseSlope, 0) ? shipRadius + 1 : shipRadius); let posP; if (s.collision.corner) {