RED-4824: WIP: Transformed rectangle calculation from a if-else chain to an affine transformation

This commit is contained in:
Viktor Seifert 2022-08-08 19:31:55 +02:00
parent 435f75996f
commit 43ff331a42

View File

@ -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);
}
}