From 43ff331a4218a3dcae51be6490bfa2bc56bcd494 Mon Sep 17 00:00:00 2001 From: Viktor Seifert Date: Mon, 8 Aug 2022 19:31:55 +0200 Subject: [PATCH] RED-4824: WIP: Transformed rectangle calculation from a if-else chain to an affine transformation --- .../parsing/model/TextPositionSequence.java | 146 ++---------------- 1 file changed, 15 insertions(+), 131 deletions(-) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java index 6b9be1bf..7d416887 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java @@ -1,5 +1,7 @@ package com.iqser.red.service.redaction.v1.server.parsing.model; +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -17,6 +19,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -271,147 +274,28 @@ public class TextPositionSequence implements CharSequence { @JsonIgnore @JsonAttribute(ignore = true) + @SneakyThrows public Rectangle getRectangle() { - log.debug("Page: '{}', Word: '{}', Rotation: '{}', textRotation {}", page, toString(), rotation, dir); + log.debug("Page: '{}', Word: '{}', Rotation: '{}', textRotation {}", page, this, rotation, dir); float textHeight = getTextHeight(); - float posXInit = getX1(); - float posXEnd; - float posYInit; - float posYEnd; - RedTextPosition firstTextPos = textPositions.get(0); RedTextPosition lastTextPos = textPositions.get(textPositions.size() - 1); - float xAndWidthDirAdjSum = lastTextPos.getXDirAdj() + lastTextPos.getWidthDirAdj(); - float widthDirAdjDelta = firstTextPos.getWidthDirAdj() - lastTextPos.getWidthDirAdj(); + Point2D bottomLeft = new Point2D.Double(firstTextPos.getXDirAdj(), firstTextPos.getYDirAdj()); + Point2D topRight = new Point2D.Double(lastTextPos.getXDirAdj() + lastTextPos.getWidthDirAdj(), lastTextPos.getYDirAdj() + textHeight); - if (rotation == 0) { - if (dir == 0f) { - // Rot0Dir0 - posXEnd = xAndWidthDirAdjSum + SMALL_OFFSET; - posYInit = pageHeight - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posYEnd = pageHeight - lastTextPos.getYDirAdj() + LARGE_OFFSET; + AffineTransform transform = new AffineTransform(); + transform.rotate(Math.toRadians(dir), pageWidth / 2f, pageHeight / 2f); + transform.translate(0f, pageHeight + textHeight); + transform.scale(1., -1.); + bottomLeft = transform.transform(bottomLeft, null); + topRight = transform.transform(topRight, null); - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 90f) { - posXInit = firstTextPos.getYDirAdj() + LARGE_OFFSET; - posXEnd = lastTextPos.getYDirAdj() - textHeight; - posYInit = getX1(); - posYEnd = getX2() + widthDirAdjDelta - WIDE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 180f) { - // Rot180 Dir180 - posXInit = pageWidth - getX1() + SMALL_OFFSET; - posXEnd = pageWidth - getX2() + widthDirAdjDelta - WIDE_OFFSET; - posYInit = firstTextPos.getYDirAdj() - textHeight + LARGE_OFFSET; - posYEnd = lastTextPos.getYDirAdj() - textHeight + LARGE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 270f) { - posXInit = pageWidth - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posXEnd = pageWidth - lastTextPos.getYDirAdj() + textHeight; - posYInit = pageHeight - getX1(); - posYEnd = pageHeight - getX2() - widthDirAdjDelta - WIDE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } - } else if (rotation == 90) { - if (dir == 0.0f) { - posXInit = lastTextPos.getXDirAdj() + lastTextPos.getHeightDir(); - posXEnd = firstTextPos.getXDirAdj(); - posYInit = pageHeight - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posYEnd = pageHeight - lastTextPos.getYDirAdj() + LARGE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 90.0f) { - posXEnd = firstTextPos.getYDirAdj() + LARGE_OFFSET; - posYInit = getY1(); - posYEnd = lastTextPos.getXDirAdj() - textHeight + LARGE_OFFSET * 2; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 180.0f) { - posXInit = pageWidth - lastTextPos.getXDirAdj() - LARGE_OFFSET * 2; - posXEnd = pageWidth - firstTextPos.getXDirAdj(); - posYInit = firstTextPos.getYDirAdj() - LARGE_OFFSET - lastTextPos.getHeightDir(); - posYEnd = lastTextPos.getYDirAdj() - lastTextPos.getHeightDir(); - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 270.0f) { - posXInit = pageWidth - getX1(); - posXEnd = pageWidth - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posYInit = pageHeight - getY1(); - posYEnd = pageHeight - lastTextPos.getXDirAdj() - textHeight - LARGE_OFFSET * 2; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } - } else if (rotation == 180) { - if (dir == 0f) { - // Rot0Dir0 - posXEnd = xAndWidthDirAdjSum + SMALL_OFFSET; - posYInit = pageHeight - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posYEnd = pageHeight - lastTextPos.getYDirAdj() + LARGE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 90f) { - posXInit = firstTextPos.getYDirAdj() + LARGE_OFFSET; - posXEnd = lastTextPos.getYDirAdj() - textHeight; - posYInit = getX1(); - posYEnd = getX2() - WIDE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 180f) { - // Rot180 Dir180 - posXInit = pageWidth - getX1() + SMALL_OFFSET; - posXEnd = pageWidth - getX2() + widthDirAdjDelta - WIDE_OFFSET; - posYInit = firstTextPos.getYDirAdj() - textHeight + LARGE_OFFSET; - posYEnd = lastTextPos.getYDirAdj() - textHeight + LARGE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 270.0f) { - posXInit = pageWidth - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posXEnd = pageWidth - lastTextPos.getYDirAdj() + textHeight; - posYInit = pageHeight - getX1(); - posYEnd = pageHeight - getX2() - widthDirAdjDelta; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } - } else if (rotation == 270) { - if (dir == 0.0f) { - posXInit = firstTextPos.getXDirAdj(); - posXEnd = xAndWidthDirAdjSum + 0.1f; - posYInit = pageHeight - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posYEnd = posYInit + SMALL_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 90.0f) { - posXInit = firstTextPos.getYDirAdj() + LARGE_OFFSET; - posXEnd = lastTextPos.getYDirAdj() - textHeight; - posYInit = getX1(); - posYEnd = getX2() - textHeight; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 180.0f) { - posXInit = pageWidth - getX1() + SMALL_OFFSET; - posXEnd = pageWidth - getX2() - LARGE_OFFSET * 2; - posYInit = firstTextPos.getYDirAdj() - textHeight + LARGE_OFFSET; - posYEnd = lastTextPos.getYDirAdj() - textHeight + LARGE_OFFSET; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } else if (dir == 270.0f) { - posXInit = pageWidth - firstTextPos.getYDirAdj() - LARGE_OFFSET; - posXEnd = pageWidth - lastTextPos.getYDirAdj() + textHeight; - posYInit = pageHeight - getX1(); - posYEnd = pageHeight - getX2() - textHeight; - - return new Rectangle(new Point(posXInit, posYInit), posXEnd - posXInit, posYEnd - posYInit + textHeight, page); - } - } - - throw new RuntimeException("A case was missed while calculating the TextPositionSequence rectangle. This is a programming error"); + return new Rectangle( // + new Point((float) bottomLeft.getX(), (float) bottomLeft.getY()), (float) (topRight.getX() - bottomLeft.getX()), (float) (topRight.getY() - bottomLeft.getY()), page); } }