Frontline polygon merge
This commit is contained in:
69
Frontline.js
69
Frontline.js
@@ -73,28 +73,62 @@ export function getFrontline(frontlineData, protrusionData = null) {
|
||||
...bodyPolygonRight,
|
||||
bodyPolygonRight[0]
|
||||
];
|
||||
|
||||
|
||||
const polygonCoords = [
|
||||
...bodyPolygon,
|
||||
bodyPolygon[0]
|
||||
];
|
||||
|
||||
if (style === LEFT_SIDE) {
|
||||
return {
|
||||
body: turf.polygon([[...polygonCoords]]),
|
||||
protrusions: computeProtrusion(leftSidePoints, protrusionData),
|
||||
let mainPoly = turf.polygon([[...polygonCoords]]);
|
||||
const protrusions = computeProtrusion(leftSidePoints, protrusionData, frontlineData.offsetDistance);
|
||||
|
||||
for(let i = 0; i <= protrusions.length -1 ; i++)
|
||||
{
|
||||
let additionalPoly = protrusions[i];
|
||||
mainPoly = turf.union(turf.featureCollection([mainPoly, additionalPoly]));
|
||||
}
|
||||
|
||||
return {
|
||||
rightPoly: null,
|
||||
leftPoly: mainPoly,
|
||||
};
|
||||
} else if (style === RIGHT_SIDE) {
|
||||
return {
|
||||
body: turf.polygon([[...polygonCoords]]),
|
||||
protrusions: computeProtrusion(rightSidePoints, protrusionData)
|
||||
let mainPoly = turf.polygon([[...polygonCoords]]);
|
||||
const protrusions = computeProtrusion(rightSidePoints, protrusionData, frontlineData.offsetDistance);
|
||||
|
||||
for(let i = 0; i <= protrusions.length -1 ; i++)
|
||||
{
|
||||
let additionalPoly = protrusions[i];
|
||||
mainPoly = turf.union(turf.featureCollection([mainPoly, additionalPoly]));
|
||||
}
|
||||
|
||||
return {
|
||||
rightPoly: mainPoly,
|
||||
leftPoly: null,
|
||||
};
|
||||
} else if (style === BOTH_SIDES) {
|
||||
let mainPoly = turf.polygon([[...polygonCoordsRight]]);
|
||||
const protrusions = computeProtrusion(rightSidePoints, protrusionData, frontlineData.offsetDistance);
|
||||
|
||||
for(let i = 0; i <= protrusions.length -1 ; i++)
|
||||
{
|
||||
let additionalPoly = protrusions[i];
|
||||
mainPoly = turf.union(turf.featureCollection([mainPoly, additionalPoly]));
|
||||
}
|
||||
|
||||
let mainPolyLeft = turf.polygon([[...polygonCoordsLeft]]);
|
||||
const protrusionsLeft = computeProtrusion(leftSidePoints, protrusionData, frontlineData.offsetDistance);
|
||||
|
||||
for(let i = 0; i <= protrusionsLeft.length -1 ; i++)
|
||||
{
|
||||
let additionalPoly = protrusionsLeft[i];
|
||||
mainPolyLeft = turf.union(turf.featureCollection([mainPolyLeft, additionalPoly]));
|
||||
}
|
||||
|
||||
return {
|
||||
bodyLeft: turf.polygon([[...polygonCoordsLeft]]),
|
||||
bodyRight: turf.polygon([[...polygonCoordsRight]]),
|
||||
protrusionsLeft: computeProtrusion(leftSidePoints, protrusionData),
|
||||
protrusionsRight: computeProtrusion(rightSidePoints, protrusionData)
|
||||
rightPoly: mainPoly,
|
||||
leftPoly: mainPolyLeft,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -152,7 +186,7 @@ function computeSides(splinePoints, offsetDistance, style = LEFT_SIDE) {
|
||||
return { leftSidePoints, rightSidePoints };
|
||||
}
|
||||
|
||||
function computeProtrusion(leftSidePoints, protrusionData) {
|
||||
function computeProtrusion(leftSidePoints, protrusionData, sideOffset) {
|
||||
const protrusions = [];
|
||||
const segments = [];
|
||||
let totalLength = 0;
|
||||
@@ -170,6 +204,7 @@ function computeProtrusion(leftSidePoints, protrusionData) {
|
||||
for (let d = 0; d <= totalLength - (protrusionData.gap + protrusionData.startSize); d += protrusionData.gap) {
|
||||
positions.push(d + protrusionData.startSize);
|
||||
}
|
||||
|
||||
if (positions[positions.length - 1] < totalLength) {
|
||||
positions.push(totalLength - protrusionData.startSize);
|
||||
}
|
||||
@@ -186,16 +221,18 @@ function computeProtrusion(leftSidePoints, protrusionData) {
|
||||
if (currentSegmentIndex >= segments.length) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
const seg = segments[currentSegmentIndex];
|
||||
const localDistance = distance - currentSegmentPos;
|
||||
const pointOnSegment = turf.along(turf.lineString([seg.p0, seg.p1]), localDistance, { units: METERS }).geometry.coordinates;
|
||||
const thicknessOffset = sideOffset * 0.2;
|
||||
const adjustedPoint = turf.destination(turf.point(pointOnSegment), thicknessOffset, seg.bearing + 90, { units: METERS }).geometry.coordinates;
|
||||
const normalBearing = seg.bearing - 90;
|
||||
const tangentBearing = seg.bearing;
|
||||
const centerPoint = turf.destination(turf.point(pointOnSegment), protrusionData.length, normalBearing, { units: METERS }).geometry.coordinates;
|
||||
const centerPoint = turf.destination(turf.point(adjustedPoint), protrusionData.length, normalBearing, { units: METERS }).geometry.coordinates;
|
||||
|
||||
const corner1 = turf.destination(turf.point(pointOnSegment), -protrusionData.startSize, tangentBearing, { units: METERS }).geometry.coordinates;
|
||||
const corner2 = turf.destination(turf.point(pointOnSegment), protrusionData.startSize, tangentBearing, { units: METERS }).geometry.coordinates;
|
||||
const corner1 = turf.destination(turf.point(adjustedPoint), -protrusionData.startSize, tangentBearing, { units: METERS }).geometry.coordinates;
|
||||
const corner2 = turf.destination(turf.point(adjustedPoint), protrusionData.startSize, tangentBearing, { units: METERS }).geometry.coordinates;
|
||||
const corner3 = turf.destination(turf.point(centerPoint), protrusionData.endSize, tangentBearing, { units: METERS }).geometry.coordinates;
|
||||
const corner4 = turf.destination(turf.point(centerPoint), -protrusionData.endSize, tangentBearing, { units: METERS }).geometry.coordinates;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user