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;
/// <summary>
/// Width of the rectangle.
/// <para>A positive number.</para>
/// </summary>
public double Width
{
@@ -66,6 +67,7 @@
private double height;
/// <summary>
/// Height of the rectangle.
/// <para>A positive number.</para>
/// </summary>
public double Height
{
@@ -202,8 +204,11 @@
sin, cos, 0,
0, 0, 1);
width = inverseRotation.Transform(BottomRight).X - inverseRotation.Transform(BottomLeft).X;
height = inverseRotation.Transform(TopLeft).Y - inverseRotation.Transform(BottomLeft).Y;
// Using Abs as a proxy for Euclidean distance in 1D
// 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 />

View File

@@ -1682,5 +1682,17 @@
Assert.Equal(expected[2], rectR.TopLeft, 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);
}
}
}