/** * Checks if a line intersects the edge with the given index. */ public static boolean doesLineIntersectEdge(Line2d line, int edgeIndex, ConvexPolygon2d polygon) { if (!polygon.hasAtLeastTwoVertices()) return false; Point2d edgePointOne = polygon.getVertex(edgeIndex); Point2d edgePointTwo = polygon.getNextVertex(edgeIndex); double edgeVectorX = edgePointTwo.x - edgePointOne.x; double edgeVectorY = edgePointTwo.y - edgePointOne.y; double lambdaOne = getIntersectionLambda(edgePointOne.x, edgePointOne.y, edgeVectorX, edgeVectorY, line.getPoint().x, line.getPoint().y, line.getNormalizedVector().x, line.getNormalizedVector().y); if (Double.isNaN(lambdaOne) || lambdaOne < 0.0 || lambdaOne > 1.0) return false; return true; }
double lambda1 = getIntersectionLambda(point2.x, point2.y, edgeVector1X, edgeVector1Y, pointToProject.x, pointToProject.y, -edgeVector1Y, edgeVector1X); lambda1 = Math.max(lambda1, 0.0); double candidate1X = point2.x + lambda1 * edgeVector1X; double lambda2 = getIntersectionLambda(point1.x, point1.y, edgeVector2X, edgeVector2Y, pointToProject.x, pointToProject.y, -edgeVector2Y, edgeVector2X); lambda2 = Math.min(lambda2, 1.0); double candidate2X = point1.x + lambda2 * edgeVector2X;
double lambda = getIntersectionLambda(edgeStart.x, edgeStart.y, edgeVectorX, edgeVectorY, segmentStart.x, segmentStart.y, segmentVectorX, segmentVectorY); if (Double.isNaN(lambda))
Point2d lineStart = line.getPoint(); Vector2d lineDirection = line.getNormalizedVector(); double lambda = getIntersectionLambda(edgeStart.x, edgeStart.y, edgeVectorX, edgeVectorY, lineStart.x, lineStart.y, lineDirection.x, lineDirection.y);