WIP: more rounding
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg viewBox="-200 -150 400 300" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- <svg viewBox="-10 -10 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg"> -->
|
||||
<!-- <svg viewBox="-200 -150 400 300" version="1.1" xmlns="http://www.w3.org/2000/svg"> -->
|
||||
<svg viewBox="-20 -20 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<style>
|
||||
foreignObject {
|
||||
font-size: 4pt;
|
||||
@@ -129,7 +129,7 @@
|
||||
<!-- <polygon class="wall" points="-10,-40 10,-40 10,-20 -10,-20" /> -->
|
||||
|
||||
<!-- <polygon class="wall" points="-10,-40 10,-40 10,-15 -10,-15" /> -->
|
||||
<!-- <polygon class="wall" points="-20,-10 20,10 -10,100 -100,100" /> -->
|
||||
<polygon class="wall" points="-20,-10 20,10 -10,100 -100,100" />
|
||||
|
||||
<!-- <polygon class="wall" points="-10,10 10,30 -10,40 -20,20" /> -->
|
||||
<!-- <polygon class="wall" points="-20,-10 0,10 -20,20 -30,0" /> -->
|
||||
@@ -241,13 +241,13 @@ const Move = (() => {
|
||||
// https://en.wikipedia.org/wiki/Curve_orientation#Practical_considerations
|
||||
// Determinant for a convex polygon
|
||||
const det = (xb - xa) * (yc - ya) - (xc - xa) * (yb - ya);
|
||||
console.log("xa, ya, xb, yb, xc, yc", xa, ya, xb, yb, xc, yc);
|
||||
// console.log("xa, ya, xb, yb, xc, yc", xa, ya, xb, yb, xc, yc);
|
||||
const detEx = (xb*expo - xa*expo) * (yc*expo - ya*expo) - (xc*expo - xa*expo) * (yb*expo - ya*expo);
|
||||
console.log("=----", xb*expo - xa*expo, yc*expo - ya*expo, xc*expo - xa*expo, yb*expo - ya*expo);
|
||||
console.log("=----", xb*expo, xa*expo, yc*expo, ya*expo, xc*expo, xa*expo, yb*expo, ya*expo);
|
||||
console.log("=----", xb*expo - xa*expo, yc*expo - ya*expo, xc*expo - xa*expo, yb*expo - ya*expo);
|
||||
console.log("=----", (xb*expo - xa*expo) * (yc*expo - ya*expo), (xc*expo - xa*expo) * (yb*expo - ya*expo));
|
||||
console.log("detxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", detEx * 1e-16);
|
||||
// console.log("=----", xb*expo - xa*expo, yc*expo - ya*expo, xc*expo - xa*expo, yb*expo - ya*expo);
|
||||
// console.log("=----", xb*expo, xa*expo, yc*expo, ya*expo, xc*expo, xa*expo, yb*expo, ya*expo);
|
||||
// console.log("=----", xb*expo - xa*expo, yc*expo - ya*expo, xc*expo - xa*expo, yb*expo - ya*expo);
|
||||
// console.log("=----", (xb*expo - xa*expo) * (yc*expo - ya*expo), (xc*expo - xa*expo) * (yb*expo - ya*expo));
|
||||
// console.log("detxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", detEx * 1e-16);
|
||||
|
||||
// (8.0046e+33) / 1e30
|
||||
// -> 8004.599999999999
|
||||
@@ -272,7 +272,7 @@ const Move = (() => {
|
||||
|
||||
|
||||
// console.log(xb, xa, yc, ya, xc, xa, yb, ya);
|
||||
console.log("dettttttttttttttttttttt", det);
|
||||
// console.log("dettttttttttttttttttttt", det);
|
||||
return det < 0;
|
||||
}
|
||||
|
||||
@@ -385,25 +385,62 @@ const Move = (() => {
|
||||
// console.log("x2", x2, "x1", x1, "y4", y4, "y3", y3, "x4", x4, "x3", x3, "y2", y2, "y1", y1);
|
||||
|
||||
// console.log("denom", denom);
|
||||
const x21 = +(x2-x1).toPrecision(13);
|
||||
const y43 = +(y4-y3).toPrecision(13);
|
||||
const x43 = +(x4-x3).toPrecision(13);
|
||||
const y21 = +(y2-y1).toPrecision(13);
|
||||
const denom = +(x21*y43-x43*y21).toPrecision(13);
|
||||
const x31 = +(x3-x1).toPrecision(13);
|
||||
const y31 = +(y3-y1).toPrecision(13);
|
||||
// const x21 = +(x2-x1).toPrecision(13);
|
||||
// const y43 = +(y4-y3).toPrecision(13);
|
||||
// const x43 = +(x4-x3).toPrecision(13);
|
||||
// const y21 = +(y2-y1).toPrecision(13);
|
||||
// const denom = +(x21*y43-x43*y21).toPrecision(13);
|
||||
// const x31 = +(x3-x1).toPrecision(13);
|
||||
// const y31 = +(y3-y1).toPrecision(13);
|
||||
|
||||
console.log("DENOM", denom);
|
||||
const subR = (a, b) => Math.round(a * 100 - b * 100) / 100;
|
||||
|
||||
if (denom) {
|
||||
const x21 = x2-x1;
|
||||
const x21r = subR(x2, x1);
|
||||
// Math.round(3.8 * 100 - 3.74 * 100) / 100
|
||||
|
||||
const y43 = y4-y3;
|
||||
const y43r = subR(y4, y3);
|
||||
|
||||
const x43 = x4-x3;
|
||||
const x43r = subR(x4, x3);
|
||||
|
||||
const y21 = y2-y1;
|
||||
const y21r = subR(y2, y1);
|
||||
|
||||
const denom = x21*y43-x43*y21;
|
||||
const denomr = Math.round(x21r*100*y43r-x43r*y21r*100) / 100;
|
||||
|
||||
console.log("denom", denom);
|
||||
console.log("denomr", denomr, x21r, y43r, x43r, y21r);
|
||||
|
||||
const x31 = x3-x1;
|
||||
const x31r = subR(x3, x1);
|
||||
|
||||
const y31 = y3-y1;
|
||||
const y31r = subR(y3, y1);
|
||||
|
||||
// console.log("x2", x2, " - ", "x1", x1, "=", x2-x1);
|
||||
|
||||
// console.log(x21, y43, x43, y21, denom, x31, y31);
|
||||
|
||||
|
||||
// if (denom) {
|
||||
if (denomr) {
|
||||
// const s = ((x3-x1)*(y4-y3)-(x4-x3)*(y3-y1))/denom;
|
||||
// const t = -((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))/denom;
|
||||
// const roundedT = +t.toFixed(2);
|
||||
// const roundedS = +s.toFixed(2);
|
||||
// const roundedT = +t.toFixed(15);
|
||||
// const roundedS = +s.toFixed(15);
|
||||
const s = +(+(x31*y43-x43*y31).toPrecision(13) / denom).toPrecision(13);
|
||||
const t = +(-(x21*y31-x31*y21).toPrecision(13) / denom).toPrecision(13);
|
||||
// const s = +(+(x31*y43-x43*y31).toPrecision(13) / denom).toPrecision(13);
|
||||
// const t = +(-(x21*y31-x31*y21).toPrecision(13) / denom).toPrecision(13);
|
||||
const s = (x31*y43-x43*y31) / denom;
|
||||
const t = -(x21*y31-x31*y21) / denom;
|
||||
const sr = (x31r*y43r-x43r*y31r) / denomr;
|
||||
const tr = (-(x21r*y31r*100*100-x31r*y21r*100*100) / denomr)/10000;
|
||||
|
||||
console.log(x21r, y31r, x31r, y21r, denomr);
|
||||
|
||||
// console.log("checking edge for collision", edge);
|
||||
// console.log("position edge segs", positionSeg, edgeSeg);
|
||||
@@ -413,15 +450,35 @@ const Move = (() => {
|
||||
// console.log("position seg", positionSeg);
|
||||
// console.log("s", s, "roundedS", roundedS, "t", t, "roundedT", roundedT);
|
||||
console.log("s", s, "t", t);
|
||||
console.log("sr", sr, "tr", tr);
|
||||
|
||||
// 2.03 * 10
|
||||
// 20.299999999999997
|
||||
|
||||
// if (roundedS >= 0 && roundedS <= 1 && roundedT >= 0 && roundedT <= 1) {
|
||||
if (s >= 0 && s < 1 && t >= 0 && t <= 1) { // this falls through
|
||||
// if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { // this sometimes falls through
|
||||
const xs = +((x1 + s * +(x2 - x1).toPrecision(13))).toPrecision(13);
|
||||
const ys = +((y1 + s * +(y2 - y1).toPrecision(13))).toPrecision(13);
|
||||
console.log("xs", xs, "ys", ys);
|
||||
// if (s >= 0 && s < 1 && t >= 0 && t <= 1) { // this falls through
|
||||
if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { // this sometimes falls through
|
||||
// const xs = x1 + s * (x2 - x1);
|
||||
// const ys = y1 + s * (y2 - y1);
|
||||
|
||||
collision.position = { x: xs, y: ys };
|
||||
const xs = x1 + s * (x2 - x1);
|
||||
const ys = y1 + s * (y2 - y1);
|
||||
|
||||
// Math.round(Math.round(-2.03 * 100) + 0.45000000000000445 * (Math.round(-1.95 * 100) - Math.round(-2.03 * 100))) / 100
|
||||
// console.log("xs", xs, "ys", ys);
|
||||
console.log("x1", x1, "x2", x2);
|
||||
console.log("y1", y1, "y2", y2);
|
||||
|
||||
const x1r = Math.round(x1 * 100);
|
||||
const x2r = Math.round(x2 * 100);
|
||||
const y1r = Math.round(y1 * 100);
|
||||
const y2r = Math.round(y2 * 100);
|
||||
|
||||
const xsr = Math.round(x1r + s * (x2r - x1r)) / 100;
|
||||
const ysr = Math.round(y1r + s * (y2r - y1r)) / 100;
|
||||
|
||||
// collision.position = { x: xs, y: ys };
|
||||
collision.position = { x: xsr, y: ysr };
|
||||
|
||||
// console.log("xs, yx", xs, ys);
|
||||
// console.log("xc, yc", xc, yc);
|
||||
@@ -628,9 +685,9 @@ const Move = (() => {
|
||||
};
|
||||
|
||||
console.log("----------elapsed", elapsed)
|
||||
console.log("velocity", v);
|
||||
console.log("current position", px, py);
|
||||
console.log("future position", p);
|
||||
// console.log("velocity", v);
|
||||
// console.log("current position", px, py);
|
||||
// console.log("future position", p);
|
||||
// console.log("px + elapsed * 1000 * v.x / 1000", px + elapsed * 1000 * v.x / 1000 / 1000);
|
||||
// 0.57 * 1000 * 20 / 1000
|
||||
|
||||
@@ -675,8 +732,8 @@ const Move = (() => {
|
||||
} else if (contact.edge) {
|
||||
// if (isLandable(contact.edge) && s.gearDown) s.isLanded = true;
|
||||
const accVect = vector(ax, ay);
|
||||
const rise = (contact.edge.yb-contact.edge.ya).toPrecision(16);
|
||||
const run = (contact.edge.xb-contact.edge.xa);
|
||||
const rise = contact.edge.yb-contact.edge.ya;
|
||||
const run = contact.edge.xb-contact.edge.xa;
|
||||
const edgeNrmlVect = vector(rise, -run);
|
||||
const velocityVect = vector(v.x, v.y);
|
||||
|
||||
@@ -708,14 +765,19 @@ const Move = (() => {
|
||||
// drawLine(contact.position.x, contact.position.y, contact.position.x + prVonNx, contact.position.y + prVonNy, "teal");
|
||||
|
||||
const side = isClockwise([contact.edge.xa, contact.edge.ya], [contact.edge.xb, contact.edge.yb], [px, py]);
|
||||
console.log("Side of edge I'm on", side < 0 ? "side A" : "side B");
|
||||
|
||||
// contact.velocity = { x: prVonNx, y: prVonNy };
|
||||
Velocity[entity_id] = { x: prVonNx, y: prVonNy };
|
||||
console.log("contact.position", contact.position);
|
||||
// drawCircle(contact.position.x, contact.position.y);
|
||||
Velocity[entity_id] = { x: -prVonNx, y: -prVonNy };
|
||||
console.log("velocity", Velocity[entity_id]);
|
||||
|
||||
console.log("current position", px, py);
|
||||
console.log("future position", p);
|
||||
drawCircle(px, py, "pink");
|
||||
|
||||
console.log("contact.position", contact.position);
|
||||
drawCircle(contact.position.x, contact.position.y, "limegreen");
|
||||
|
||||
console.log("intended next position", p);
|
||||
drawCircle(p.x, p.y, "red");
|
||||
|
||||
// const newV = {
|
||||
// x: vx > 0 && vx + ax <= 0 ? 0 : vx + ax,
|
||||
@@ -723,14 +785,14 @@ const Move = (() => {
|
||||
// };
|
||||
|
||||
const newP = {
|
||||
x: contact.position.x + elapsed * prVonNx * metersPerMillisecond,
|
||||
y: contact.position.y + elapsed * prVonNy * metersPerMillisecond
|
||||
// x: contact.position.x + elapsed * prVonNx * metersPerMillisecond,
|
||||
// y: contact.position.y + elapsed * prVonNy * metersPerMillisecond
|
||||
x: Math.round((contact.position.x + elapsed * prVonNx * metersPerMillisecond) * 100) / 100,
|
||||
y: Math.round((contact.position.y + elapsed * prVonNy * metersPerMillisecond) * 100) / 100,
|
||||
};
|
||||
|
||||
newP.x = +newP.x.toPrecision(13);
|
||||
newP.y = +newP.y.toPrecision(13);
|
||||
console.log("newP", newP);
|
||||
drawCircle(newP.x, newP.y, "red", 0.1);
|
||||
console.log("actual next position", newP);
|
||||
drawCircle(newP.x, newP.y, "black");
|
||||
|
||||
Position[entity_id] = newP;
|
||||
}
|
||||
@@ -824,17 +886,17 @@ function init() {
|
||||
const mult = 10;
|
||||
|
||||
s.position = { x: 0, y: -10 };
|
||||
// s.velocity = { x: -10, y: 20 };
|
||||
s.velocity = { x: 0, y: 0 };
|
||||
// s.velocity = { x: 10, y: 20 };
|
||||
// s.velocity = { x: -20, y: 40 };
|
||||
s.velocity = { x: -1, y: 2 };
|
||||
// s.velocity = { x: -1, y: 2 };
|
||||
s.angularVelocity = 0;
|
||||
|
||||
// s. velocity = { x: -5*mult, y: 7*mult };
|
||||
// drawCircle(0, 0);
|
||||
|
||||
// s.acceleration = { x: 1, y: 3 };
|
||||
s.acceleration = { x: 0, y: 0 };
|
||||
s.acceleration = { x: -1, y: 2 };
|
||||
// s.acceleration = { x: 0, y: 0 };
|
||||
|
||||
Ships.forEach(({ entity_id }) => {
|
||||
// Acceleration[entity_id] = s.acceleration;
|
||||
@@ -1137,7 +1199,7 @@ function drawLine(xa, ya, xb, yb, color = "black") {
|
||||
return el;
|
||||
}
|
||||
|
||||
function drawCircle(cx, cy, color = "black", r = 1) {
|
||||
function drawCircle(cx, cy, color = "black", r = 0.2) {
|
||||
const el = document.createElementNS(namespaceURIsvg, 'circle');
|
||||
el.setAttribute('cx', cx);
|
||||
el.setAttribute('cy', cy);
|
||||
@@ -1563,10 +1625,8 @@ function animate(timestamp) {
|
||||
newVel = Velocity[Ships[0].entity_id];
|
||||
|
||||
s.node.style.transform = `translate(${newPos.x}px, ${newPos.y}px)`;
|
||||
// s.node.style.transform = `translate(${Math.round(newPos.x)}px, ${Math.round(newPos.y)}px)`;
|
||||
// console.log("translation", s.node.style.transform);
|
||||
positionEl.innerText = `${newPos.x.toFixed(1)},${newPos.y.toFixed(1)}`;
|
||||
velocityEl.innerText = `${newVel.x.toFixed(1)},${newVel.y.toFixed(1)}`;
|
||||
positionEl.innerText = `${newPos.x},${newPos.y}`;
|
||||
velocityEl.innerText = `${newVel.x},${newVel.y}`;
|
||||
|
||||
// updateEdges(position);
|
||||
if (drawCollisionLines) updateTriangles(position);
|
||||
|
||||
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 60 KiB |
Reference in New Issue
Block a user