Use Euclidean distance in PdfRectangle's width and height

This commit is contained in:
BobLd
2021-01-15 11:20:45 +00:00
parent 19e831b656
commit 980c6e2316
2 changed files with 20 additions and 3 deletions

View File

@@ -49,6 +49,7 @@
private double width; private double width;
/// <summary> /// <summary>
/// Width of the rectangle. /// Width of the rectangle.
/// <para>A positive number.</para>
/// </summary> /// </summary>
public double Width public double Width
{ {
@@ -66,6 +67,7 @@
private double height; private double height;
/// <summary> /// <summary>
/// Height of the rectangle. /// Height of the rectangle.
/// <para>A positive number.</para>
/// </summary> /// </summary>
public double Height public double Height
{ {
@@ -197,13 +199,16 @@
var cos = Math.Cos(t); var cos = Math.Cos(t);
var sin = Math.Sin(t); var sin = Math.Sin(t);
var inverseRotation = new TransformationMatrix( var inverseRotation = new TransformationMatrix(
cos, -sin, 0, cos, -sin, 0,
sin, cos, 0, sin, cos, 0,
0, 0, 1); 0, 0, 1);
width = inverseRotation.Transform(BottomRight).X - inverseRotation.Transform(BottomLeft).X; // Using Abs as a proxy for Euclidean distance in 1D
height = inverseRotation.Transform(TopLeft).Y - inverseRotation.Transform(BottomLeft).Y; // as it might happen that points have negative coordinates.
var bl = inverseRotation.Transform(BottomLeft);
width = Math.Abs(inverseRotation.Transform(BottomRight).X - bl.X);
height = Math.Abs(inverseRotation.Transform(TopLeft).Y - bl.Y);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -1682,5 +1682,17 @@
Assert.Equal(expected[2], rectR.TopLeft, PointComparer); Assert.Equal(expected[2], rectR.TopLeft, PointComparer);
Assert.Equal(expected[3], rectR.BottomLeft, PointComparer); Assert.Equal(expected[3], rectR.BottomLeft, PointComparer);
} }
[Fact]
public void Issue261()
{
// Some points have negative coordinates after rotation, resulting in negative Height
PdfRectangle rect = new PdfRectangle(new PdfPoint(401.51, 461.803424),
new PdfPoint(300.17322363281249, 461.803424),
new PdfPoint(401.51, 291.45),
new PdfPoint(300.17322363281249, 291.45));
Assert.True(rect.Height > 0);
}
} }
} }