// NEED TO IMPLEMENT ROUNDING private static PdfRectangle GetBoundingBoxOther(Letter letter) { // not very useful, need axis aligned bbox anyway // -> rotate back? or normalise? var points = new[] { letter.StartBaseLine, letter.EndBaseLine, letter.GlyphRectangle.TopLeft, letter.GlyphRectangle.TopRight }; // Candidates bounding boxes var obb = GeometryExtensions.MinimumAreaRectangle(points); var obb1 = new PdfRectangle(obb.BottomLeft, obb.TopLeft, obb.BottomRight, obb.TopRight); var obb2 = new PdfRectangle(obb.BottomRight, obb.BottomLeft, obb.TopRight, obb.TopLeft); var obb3 = new PdfRectangle(obb.TopRight, obb.BottomRight, obb.TopLeft, obb.BottomLeft); // Find the orientation of the OBB, using the baseline angle // Assumes line order is correct var baseLineAngle = Distances.BoundAngle180(Distances.Angle(letter.GlyphRectangle.BottomLeft, letter.GlyphRectangle.BottomRight)); double deltaAngle = Math.Abs(Distances.BoundAngle180(obb.Rotation - baseLineAngle)); double deltaAngle1 = Math.Abs(Distances.BoundAngle180(obb1.Rotation - baseLineAngle)); if (deltaAngle1 < deltaAngle) { deltaAngle = deltaAngle1; obb = obb1; } double deltaAngle2 = Math.Abs(Distances.BoundAngle180(obb2.Rotation - baseLineAngle)); if (deltaAngle2 < deltaAngle) { deltaAngle = deltaAngle2; obb = obb2; } double deltaAngle3 = Math.Abs(Distances.BoundAngle180(obb3.Rotation - baseLineAngle)); if (deltaAngle3 < deltaAngle) { obb = obb3; } return(obb); }
/// <summary> /// Helper function to compute the within line angle between the pivot's bottom /// right and the candidate's bottom left points, taking in account the pivot's rotation. /// <para>-90 ≤ θ ≤ 90.</para> /// </summary> private static double AngleWL(Word pivot, Word candidate) { var angle = Distances.BoundAngle180(Distances.Angle(pivot.BoundingBox.BottomRight, candidate.BoundingBox.BottomLeft) - pivot.BoundingBox.Rotation); // Angle is kept within [-90;90] degree to handle overlapping words if (angle > 90) { angle -= 180; } else if (angle < -90) { angle += 180; } return(angle); }