Skip to content

Commit 9fa0c9f

Browse files
authored
fix: BoundingRectangle angle computation when in CoordOrigin.TOPLEFT (#347)
* fix(page): angle computation when in `CoordOrigin.TOPLEFT` * DCO Remediation Commit for Clément Doumouro <[email protected]> I, Clément Doumouro <[email protected]>, hereby add my Signed-off-by to this commit: 742ccf3 Signed-off-by: Clément Doumouro <[email protected]> --------- Signed-off-by: Clément Doumouro <[email protected]>
1 parent eb2538e commit 9fa0c9f

File tree

2 files changed

+157
-21
lines changed

2 files changed

+157
-21
lines changed

docling_core/types/doc/page.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ def angle(self) -> float:
122122
p_1 = ((self.r_x1 + self.r_x2) / 2.0, (self.r_y1 + self.r_y2) / 2.0)
123123

124124
delta_x, delta_y = p_1[0] - p_0[0], p_1[1] - p_0[1]
125+
if self.coord_origin == CoordOrigin.TOPLEFT:
126+
delta_y = -delta_y
125127

126128
if abs(delta_y) < 1.0e-3:
127129
angle = 0.0
@@ -131,8 +133,7 @@ def angle(self) -> float:
131133
angle = math.atan(delta_y / delta_x)
132134
if delta_x < 0:
133135
angle += np.pi
134-
if angle < 0:
135-
angle += 2 * np.pi
136+
angle = angle % (2 * np.pi)
136137
return angle
137138

138139
@property

test/test_page.py

Lines changed: 154 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,34 @@
33
import numpy as np
44
import pytest
55

6+
from docling_core.types.doc import CoordOrigin
67
from docling_core.types.doc.page import BoundingRectangle
78

89
SQRT_2 = math.sqrt(2)
910

10-
R_0 = BoundingRectangle(r_x0=0, r_y0=0, r_x1=1, r_y1=0, r_x2=1, r_y2=1, r_x3=0, r_y3=1)
11-
R_45 = BoundingRectangle(
11+
R_0_BL = BoundingRectangle(
12+
r_x0=0,
13+
r_y0=0,
14+
r_x1=1,
15+
r_y1=0,
16+
r_x2=1,
17+
r_y2=1,
18+
r_x3=0,
19+
r_y3=1,
20+
coord_origin=CoordOrigin.BOTTOMLEFT,
21+
)
22+
R_0_TL = BoundingRectangle(
23+
r_x0=0,
24+
r_y0=0,
25+
r_x1=1,
26+
r_y1=0,
27+
r_x2=1,
28+
r_y2=1,
29+
r_x3=0,
30+
r_y3=1,
31+
coord_origin=CoordOrigin.TOPLEFT,
32+
)
33+
R_45_BL = BoundingRectangle(
1234
r_x0=0,
1335
r_y0=0,
1436
r_x1=SQRT_2 / 2,
@@ -17,11 +39,42 @@
1739
r_y2=SQRT_2,
1840
r_x3=-SQRT_2 / 2,
1941
r_y3=SQRT_2 / 2,
42+
coord_origin=CoordOrigin.BOTTOMLEFT,
2043
)
21-
R_90 = BoundingRectangle(
22-
r_x0=0, r_y0=0, r_x1=0, r_y1=1, r_x2=-1, r_y2=1, r_x3=-1, r_y3=0
44+
R_45_TL = BoundingRectangle(
45+
r_x0=0,
46+
r_y0=0,
47+
r_x1=SQRT_2 / 2,
48+
r_y1=-SQRT_2 / 2,
49+
r_x2=0,
50+
r_y2=-SQRT_2,
51+
r_x3=-SQRT_2 / 2,
52+
r_y3=-SQRT_2 / 2,
53+
coord_origin=CoordOrigin.TOPLEFT,
2354
)
24-
R_135 = BoundingRectangle(
55+
R_90_BL = BoundingRectangle(
56+
r_x0=0,
57+
r_y0=0,
58+
r_x1=0,
59+
r_y1=1,
60+
r_x2=-1,
61+
r_y2=1,
62+
r_x3=-1,
63+
r_y3=0,
64+
coord_origin=CoordOrigin.BOTTOMLEFT,
65+
)
66+
R_90_TL = BoundingRectangle(
67+
r_x0=0,
68+
r_y0=0,
69+
r_x1=0,
70+
r_y1=-1,
71+
r_x2=-1,
72+
r_y2=-1,
73+
r_x3=-1,
74+
r_y3=0,
75+
coord_origin=CoordOrigin.TOPLEFT,
76+
)
77+
R_135_BL = BoundingRectangle(
2578
r_x0=0,
2679
r_y0=0,
2780
r_x1=-SQRT_2 / 2,
@@ -30,11 +83,42 @@
3083
r_y2=0,
3184
r_x3=-SQRT_2 / 2,
3285
r_y3=-SQRT_2 / 2,
86+
coord_origin=CoordOrigin.BOTTOMLEFT,
3387
)
34-
R_180 = BoundingRectangle(
35-
r_x0=0, r_y0=0, r_x1=-0, r_y1=0, r_x2=-1, r_y2=-1, r_x3=0, r_y3=-1
88+
R_135_TL = BoundingRectangle(
89+
r_x0=0,
90+
r_y0=0,
91+
r_x1=-SQRT_2 / 2,
92+
r_y1=-SQRT_2 / 2,
93+
r_x2=-SQRT_2,
94+
r_y2=0,
95+
r_x3=-SQRT_2 / 2,
96+
r_y3=SQRT_2 / 2,
97+
coord_origin=CoordOrigin.TOPLEFT,
3698
)
37-
R_MINUS_135 = BoundingRectangle(
99+
R_180_BL = BoundingRectangle(
100+
r_x0=0,
101+
r_y0=0,
102+
r_x1=-0,
103+
r_y1=0,
104+
r_x2=-1,
105+
r_y2=-1,
106+
r_x3=0,
107+
r_y3=-1,
108+
coord_origin=CoordOrigin.BOTTOMLEFT,
109+
)
110+
R_180_TL = BoundingRectangle(
111+
r_x0=0,
112+
r_y0=0,
113+
r_x1=-0,
114+
r_y1=0,
115+
r_x2=-1,
116+
r_y2=1,
117+
r_x3=0,
118+
r_y3=1,
119+
coord_origin=CoordOrigin.TOPLEFT,
120+
)
121+
R_225_BL = BoundingRectangle(
38122
r_x0=0,
39123
r_y0=0,
40124
r_x1=-SQRT_2 / 2,
@@ -43,11 +127,42 @@
43127
r_y2=-SQRT_2,
44128
r_x3=SQRT_2 / 2,
45129
r_y3=-SQRT_2 / 2,
130+
coord_origin=CoordOrigin.BOTTOMLEFT,
131+
)
132+
R_225_TL = BoundingRectangle(
133+
r_x0=0,
134+
r_y0=0,
135+
r_x1=-SQRT_2 / 2,
136+
r_y1=SQRT_2 / 2,
137+
r_x2=0,
138+
r_y2=SQRT_2,
139+
r_x3=SQRT_2 / 2,
140+
r_y3=SQRT_2 / 2,
141+
coord_origin=CoordOrigin.TOPLEFT,
46142
)
47-
R_MINUS_90 = BoundingRectangle(
48-
r_x0=0, r_y0=0, r_x1=0, r_y1=-1, r_x2=1, r_y2=-1, r_x3=1, r_y3=0
143+
R_270_BL = BoundingRectangle(
144+
r_x0=0,
145+
r_y0=0,
146+
r_x1=0,
147+
r_y1=-1,
148+
r_x2=1,
149+
r_y2=-1,
150+
r_x3=1,
151+
r_y3=0,
152+
coord_origin=CoordOrigin.BOTTOMLEFT,
49153
)
50-
R_MINUS_45 = BoundingRectangle(
154+
R_270_TL = BoundingRectangle(
155+
r_x0=0,
156+
r_y0=0,
157+
r_x1=0,
158+
r_y1=1,
159+
r_x2=1,
160+
r_y2=1,
161+
r_x3=1,
162+
r_y3=0,
163+
coord_origin=CoordOrigin.TOPLEFT,
164+
)
165+
R_315_BL = BoundingRectangle(
51166
r_x0=0,
52167
r_y0=0,
53168
r_x1=SQRT_2 / 2,
@@ -56,20 +171,40 @@
56171
r_y2=0,
57172
r_x3=SQRT_2 / 2,
58173
r_y3=SQRT_2 / 2,
174+
coord_origin=CoordOrigin.BOTTOMLEFT,
175+
)
176+
R_315_TL = BoundingRectangle(
177+
r_x0=0,
178+
r_y0=0,
179+
r_x1=SQRT_2 / 2,
180+
r_y1=SQRT_2 / 2,
181+
r_x2=SQRT_2,
182+
r_y2=0,
183+
r_x3=SQRT_2 / 2,
184+
r_y3=-SQRT_2 / 2,
185+
coord_origin=CoordOrigin.TOPLEFT,
59186
)
60187

61188

62189
@pytest.mark.parametrize(
63190
("rectangle", "expected_angle", "expected_angle_360"),
64191
[
65-
(R_0, 0, 0.0),
66-
(R_45, np.pi / 4, 45),
67-
(R_90, np.pi / 2, 90),
68-
(R_135, 3 * np.pi / 4, 135),
69-
(R_180, np.pi, 180),
70-
(R_MINUS_135, 5 * np.pi / 4, 225),
71-
(R_MINUS_90, 3 * np.pi / 2, 270),
72-
(R_MINUS_45, 7 * np.pi / 4, 315),
192+
(R_0_BL, 0, 0.0),
193+
(R_45_BL, np.pi / 4, 45),
194+
(R_90_BL, np.pi / 2, 90),
195+
(R_135_BL, 3 * np.pi / 4, 135),
196+
(R_180_BL, np.pi, 180),
197+
(R_225_BL, 5 * np.pi / 4, 225),
198+
(R_270_BL, 3 * np.pi / 2, 270),
199+
(R_315_BL, 7 * np.pi / 4, 315),
200+
(R_0_TL, 0, 0.0),
201+
(R_45_TL, np.pi / 4, 45),
202+
(R_90_TL, np.pi / 2, 90),
203+
(R_135_TL, 3 * np.pi / 4, 135),
204+
(R_180_TL, np.pi, 180),
205+
(R_225_TL, 5 * np.pi / 4, 225),
206+
(R_270_TL, 3 * np.pi / 2, 270),
207+
(R_315_TL, 7 * np.pi / 4, 315),
73208
],
74209
)
75210
def test_bounding_rectangle_angle(

0 commit comments

Comments
 (0)