From 54ac95c4e6b088bd4b1eab784cb9352bbb09545a Mon Sep 17 00:00:00 2001 From: Tomas Richtar Date: Sat, 14 Jun 2025 12:51:56 +0200 Subject: [PATCH] PR fixes --- Frontline.js | 111 +++++++++++++++++++-------------------------------- 1 file changed, 40 insertions(+), 71 deletions(-) diff --git a/Frontline.js b/Frontline.js index c00567d..ea424e4 100644 --- a/Frontline.js +++ b/Frontline.js @@ -32,17 +32,11 @@ export function getFrontline(frontlineData, protrusionData = null) { let bodyPolygonRight = []; if (style === BOTH_SIDES) { - const { - leftSidePoints: leftSidePointsLeftSide, - rightSidePoints: rightSidePointsLeftSide - } = computeSides(splinePoints, frontlineData.offsetDistance, LEFT_SIDE); - bodyPolygonLeft = [...leftSidePointsLeftSide, ...rightSidePointsLeftSide.reverse()]; + const left = computeSides(splinePoints, frontlineData.offsetDistance, LEFT_SIDE); + bodyPolygonLeft = [...left.leftSidePoints, ...left.rightSidePoints.reverse()]; - const { - leftSidePoints: leftSidePointsRightSide, - rightSidePoints: rightSidePointsRightSide - } = computeSides(splinePoints, frontlineData.offsetDistance, RIGHT_SIDE); - bodyPolygonRight = [...leftSidePointsRightSide, ...rightSidePointsRightSide.reverse()]; + const right = computeSides(splinePoints, frontlineData.offsetDistance, RIGHT_SIDE); + bodyPolygonRight = [...right.leftSidePoints, ...right.rightSidePoints.reverse()]; } const { leftSidePoints, rightSidePoints } = computeSides(splinePoints, frontlineData.offsetDistance, frontlineData.style); @@ -64,50 +58,29 @@ export function getFrontline(frontlineData, protrusionData = null) { ]; } - const resultPolygon = turf.polygon([polygonCoords]); - return resultPolygon; + return turf.polygon([polygonCoords]); } - - const polygonCoordsLeft= [ - ...bodyPolygonLeft, - bodyPolygonLeft[0] - ]; - - const polygonCoordsRight= [ - ...bodyPolygonRight, - bodyPolygonRight[0] - ]; - const polygonCoords = [ - ...bodyPolygon, - bodyPolygon[0] - ]; + const prostrusionsData = (points, sidePoints) => { + const coords = [...points, points[0]]; + const basePoly = turf.polygon([coords]); + return constructProstrusions(basePoly, sidePoints, protrusionData, frontlineData); + }; if (style === LEFT_SIDE) { - let mainPoly = turf.polygon([[...polygonCoords]]); - const finalPoly = constructProstrusions(mainPoly, leftSidePoints, protrusionData, frontlineData); - - return { + return { rightPoly: null, - leftPoly: finalPoly, + leftPoly: prostrusionsData(bodyPolygon, leftSidePoints) }; } else if (style === RIGHT_SIDE) { - let mainPoly = turf.polygon([[...polygonCoords]]); - const finalPoly = constructProstrusions(mainPoly, rightSidePoints, protrusionData, frontlineData); - - return { - rightPoly: finalPoly, - leftPoly: null, + return { + rightPoly: prostrusionsData(bodyPolygon, rightSidePoints), + leftPoly: null }; } else if (style === BOTH_SIDES) { - let mainPoly = turf.polygon([[...polygonCoordsRight]]); - const finalPoly = constructProstrusions(mainPoly, rightSidePoints, protrusionData, frontlineData); - let secondaryPoly = turf.polygon([[...polygonCoordsLeft]]); - const secondaryfinalPoly = constructProstrusions(secondaryPoly, leftSidePoints, protrusionData, frontlineData); - - return { - rightPoly: finalPoly, - leftPoly: secondaryfinalPoly, + return { + rightPoly: prostrusionsData(bodyPolygonRight, rightSidePoints), + leftPoly: prostrusionsData(bodyPolygonLeft, leftSidePoints), }; } } @@ -147,31 +120,23 @@ function computeSplinePoints(points, density) { function computeSides(splinePoints, offsetDistance, style = LEFT_SIDE) { let leftSidePoints = []; let rightSidePoints = []; - let accumulatedDistance = 0; for (let i = 1; i < splinePoints.length; i++) { const previousPoint = splinePoints[i - 1]; const currentPoint = splinePoints[i]; - const segmentDistance = turf.distance(turf.point(previousPoint), turf.point(currentPoint), { units: METERS }); - accumulatedDistance += segmentDistance; const bearing = turf.bearing(turf.point(previousPoint), turf.point(currentPoint)); - let leftPoint, rightPoint; - if (style === LEFT_SIDE) { - leftPoint = turf.destination(turf.point(currentPoint), offsetDistance, bearing - 90, { units: METERS }).geometry.coordinates; - rightPoint = currentPoint; - } else if (style === RIGHT_SIDE) { - leftPoint = currentPoint; - rightPoint = turf.destination(turf.point(currentPoint), offsetDistance, bearing + 90, { units: METERS }).geometry.coordinates; - } else if (style === BOTH_SIDES) { - leftPoint = turf.destination(turf.point(currentPoint), offsetDistance, bearing - 90, { units: METERS }).geometry.coordinates; - rightPoint = turf.destination(turf.point(currentPoint), offsetDistance, bearing + 90, { units: METERS }).geometry.coordinates; - } + const leftPoint = style === RIGHT_SIDE + ? currentPoint + : turf.destination(turf.point(currentPoint), offsetDistance, bearing - 90, { units: METERS }).geometry.coordinates; + + const rightPoint = style === LEFT_SIDE + ? currentPoint + : turf.destination(turf.point(currentPoint), offsetDistance, bearing + 90, { units: METERS }).geometry.coordinates; leftSidePoints.push(leftPoint); rightSidePoints.push(rightPoint); - accumulatedDistance = 0; } return { leftSidePoints, rightSidePoints }; @@ -181,7 +146,7 @@ function computeProtrusion(leftSidePoints, protrusionData, sideOffset) { const protrusions = []; const segments = []; let totalLength = 0; - + for (let i = 0; i < leftSidePoints.length - 1; i++) { const p0 = leftSidePoints[i]; const p1 = leftSidePoints[i + 1]; @@ -215,22 +180,26 @@ function computeProtrusion(leftSidePoints, protrusionData, sideOffset) { 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(adjustedPoint), protrusionData.length, normalBearing, { 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; + const adjustedPoint = movePoint(pointOnSegment, thicknessOffset, seg.bearing + 90); + const centerPoint = movePoint(adjustedPoint, protrusionData.length, seg.bearing - 90); - const polygonCoords = [corner1, corner2, corner3, corner4, corner1]; - const polygon = turf.polygon([polygonCoords]); + + const corner1 = movePoint(adjustedPoint, -protrusionData.startSize, seg.bearing); + const corner2 = movePoint(adjustedPoint, protrusionData.startSize, seg.bearing); + const corner3 = movePoint(centerPoint, protrusionData.endSize, seg.bearing); + const corner4 = movePoint(centerPoint, -protrusionData.endSize, seg.bearing); + + const polygon = turf.polygon([[corner1, corner2, corner3, corner4, corner1]]); protrusions.push(polygon); } return protrusions; } + +function movePoint(point, distance, bearing) { + return turf.destination(turf.point(point), distance, bearing, { units: METERS }).geometry.coordinates; +} \ No newline at end of file