corner_geometry4 = {
let l1Pos1 = offsets[0]
let l1Pos2 = offsets[0] + widths[0];
let l2Pos1 = offsets[1]
let l2Pos2 = offsets[1] + widths[1];
let leftBend = cornerAngle <= 0;
let rightBend = !leftBend;
let l1PosOuter = (l1Pos1 < l2Pos1) ? l1Pos1 : l1Pos2;
let l1PosInner = (l1Pos1 < l2Pos1) ? l1Pos2 : l1Pos1;
let l2PosOuter = (l1Pos1 < l2Pos1) ? l2Pos2 : l2Pos1;
let l2PosInner = (l1Pos1 < l2Pos1) ? l2Pos1 : l2Pos2;
let bendTowards = (leftBend != (l1Pos1 < l2Pos1));
let linesFullyOverlap = ((l1Pos1 < l2Pos1 && l1Pos2 > l2Pos2) || (l2Pos1 < l1Pos1 && l2Pos2 > l1Pos2));
let minWidth = Math.min(widths[0], widths[1]);
let maxWidth = Math.max(widths[0], widths[1]);
let angleTowards2 = (l1Pos1 < l2Pos1) != (cornerAngle < 0)
let outerStartL1 = add(points[0], mult(normals[0],l1PosOuter));
let innerStartL1 = add(points[0], mult(normals[0],l1PosInner));
let outerEndL1 = add(points[1], mult(normals[0], l1PosOuter), mult(units[0], -margin2));
let innerEndL1 = add(points[1], mult(normals[0], l1PosInner), mult(units[0], -margin2));
let innerStartL2 = add(points[1], mult(normals[1], l2PosInner), mult(units[1], margin2));
let outerStartL2 = add(points[1], mult(normals[1], l2PosOuter), mult(units[1], margin2));
let innerEndL2 = add(points[2], mult(normals[1], l2PosInner));
let outerEndL2 = add(points[2], mult(normals[1], l2PosOuter));
let laneIntersectionPoints = [
intersect(outerEndL1, units[0], innerStartL2, units[1]),
intersect(innerEndL1, units[0], innerStartL2, units[1]),
intersect(innerEndL1, units[0], outerStartL2, units[1]),
intersect(outerEndL1, units[0], outerStartL2, units[1]),
];
let geometry = {
// modeled as polygons
extensionPoly1: null,
extensionPoly2: null,
bendPoly1: null, // if lane gets only narrower, use only this (?)
bendPoly2: null,
crossingPoly: null,
// modeled as lines
extensionLine1: null,
extensionLine2: null,
bendPoint1: null, // if lane gets only narrower, use only this (?)
bendPoint2: null,
crossingLine: null,
// legacy
polygon: null
};
// store 2 boundary lines separately
let poly = [
[
outerEndL1,
innerStartL2,
],
[
outerStartL2,
innerEndL1,
]
];
let outerIntersectionDistOnL1 = intersect_dist(outerStartL1, units[0], innerStartL2, units[1]);
let innerIntersectionDistOnL1 = intersect_dist(innerStartL1, units[0], outerStartL2, units[1]);
let outerIntersectionDistOnL2 = intersect_dist(outerStartL2, units[1], innerStartL1, units[0]);
let innerIntersectionDistOnL2 = intersect_dist(innerStartL2, units[1], innerStartL1, units[0]);
debugger;
let outerCornerL1 = (leftBend || outerIntersectionDistOnL1 < lengths[0]-margin2) ? outerEndL1 : laneIntersectionPoints[0];
let tangentsL2 = tangentPoints(outerStartL2, minWidth, outerCornerL1);
// choose tangent point closest to inner end point of lane
let tDistances = tangentsL2.map(t => dist(t, innerEndL2));
let tangentPointL2 = (tDistances[1] > tDistances[0]) ? tangentsL2[0] : tangentsL2[1];
let crossingUnit = unit(sub(tangentPointL2, outerCornerL1));
let crossingNormal = normal(crossingUnit);
let tangentsL1 = tangentPoints(outerCornerL1, minWidth, outerStartL2);
// choose tangent point closest to inner start point of lane
let startPoint = add(points[0], mult(normals[0], l1PosInner));
tDistances = tangentsL1.map(t => dist(t, innerStartL1));
let tangentPointL1 = (tDistances[1] > tDistances[0]) ? tangentsL1[0] : tangentsL1[1];
// intersect with outer lane to get point on edge of lane
let bendInnerL2 = intersectLinesByPoints(outerEndL1, tangentPointL2, innerStartL2, innerEndL2);
let bendOuterL2 = intersect(outerStartL2,units[1],bendInnerL2,normals[1]);
let bendOuterL2Crossing = intersect(outerStartL2, crossingUnit, bendInnerL2, crossingNormal);
if (!bendTowards || outerIntersectionDistOnL1 < lengths[0] - margin2) { //leftBend ||
poly[0][1] = bendInnerL2;
// bend points fully within L2 geom?
if (dist(outerEndL2, bendOuterL2) < lengths[1] - margin2) {
geometry.bendPoly2 = [bendInnerL2, bendOuterL2, outerStartL2, bendOuterL2Crossing];
}
else {
geometry.bendPoly2 = [bendInnerL2, innerStartL2, outerStartL2, bendOuterL2Crossing];
}
}
let bendInnerL1 = intersectLinesByPoints(outerStartL2, tangentPointL1, innerStartL1, innerEndL1);
let bendOuterL1 = intersect(outerEndL1, units[0], bendInnerL1, normals[0]);
let bendOuterL1Crossing = intersect(outerEndL1, crossingUnit, bendInnerL1, crossingNormal);
if (!bendTowards || outerIntersectionDistOnL1 < lengths[0]-margin2) { // && (!leftBend || innerIntersectionDistOnL2 > 0)
poly[1][1] = bendInnerL1;
// bend points fully within L1 geom
if (dist(outerStartL1, bendOuterL1) < lengths[0] - margin2) {
geometry.bendPoly1 = [bendInnerL1, bendOuterL1, outerEndL1, bendOuterL1Crossing];
}
else {
geometry.bendPoly1 = [bendInnerL1, innerEndL1, outerEndL1, bendOuterL1Crossing];
}
}
// check if intersection is after l1 and before l2 -> add intersection point
if (outerIntersectionDistOnL1 > lengths[0]-margin2 && outerIntersectionDistOnL2 < margin2) {
// add corner vertex to polygon
poly[0].splice(1, 0, add(outerStartL1, mult(units[0], outerIntersectionDistOnL1)));
}
// again for other side of lines
if (innerIntersectionDistOnL1 > lengths[0]-margin2 && outerIntersectionDistOnL2 < margin2) {
// add corner vertex to polygon
poly[1].splice(1, 0, add(innerStartL1, mult(units[0], innerIntersectionDistOnL1)));
}
// legacy
//geometry.bendPoly1 = poly;
geometry.polygon = poly;
return geometry;
}