rect_test.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // (C) Copyright 2017, Google Inc.
  2. // Licensed under the Apache License, Version 2.0 (the "License");
  3. // you may not use this file except in compliance with the License.
  4. // You may obtain a copy of the License at
  5. // http://www.apache.org/licenses/LICENSE-2.0
  6. // Unless required by applicable law or agreed to in writing, software
  7. // distributed under the License is distributed on an "AS IS" BASIS,
  8. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. // See the License for the specific language governing permissions and
  10. // limitations under the License.
  11. #include "rect.h"
  12. #include "include_gunit.h"
  13. namespace tesseract {
  14. class TBOXTest : public testing::Test {
  15. public:
  16. void SetUp() override {
  17. std::locale::global(std::locale(""));
  18. }
  19. void TearDown() override {}
  20. };
  21. TEST_F(TBOXTest, OverlapInside) {
  22. TBOX a(10, 10, 20, 20);
  23. TBOX b(11, 11, 12, 12);
  24. EXPECT_TRUE(a.overlap(b));
  25. EXPECT_TRUE(b.overlap(a));
  26. EXPECT_DOUBLE_EQ(0.01, a.overlap_fraction(b));
  27. EXPECT_DOUBLE_EQ(1.0, b.overlap_fraction(a));
  28. }
  29. TEST_F(TBOXTest, OverlapBoolCorners) {
  30. TBOX mid(10, 10, 30, 30);
  31. TBOX bottom_left(5, 5, 15, 15);
  32. TBOX top_left(5, 25, 15, 35);
  33. // other corners covered by symmetry
  34. EXPECT_TRUE(mid.overlap(bottom_left));
  35. EXPECT_TRUE(bottom_left.overlap(mid));
  36. EXPECT_TRUE(mid.overlap(top_left));
  37. EXPECT_TRUE(top_left.overlap(mid));
  38. }
  39. TEST_F(TBOXTest, OverlapFractionCorners) {
  40. TBOX mid(10, 10, 30, 30);
  41. TBOX bottom_left(5, 5, 15, 15);
  42. TBOX top_left(5, 25, 15, 35);
  43. // other corners covered by symmetry
  44. EXPECT_DOUBLE_EQ((5.0 * 5.0) / (20.0 * 20.0), mid.overlap_fraction(bottom_left));
  45. EXPECT_DOUBLE_EQ((5.0 * 5.0) / (10.0 * 10.0), bottom_left.overlap_fraction(mid));
  46. EXPECT_DOUBLE_EQ((5.0 * 5.0) / (20.0 * 20.0), mid.overlap_fraction(top_left));
  47. EXPECT_DOUBLE_EQ((5.0 * 5.0) / (10.0 * 10.0), top_left.overlap_fraction(mid));
  48. }
  49. TEST_F(TBOXTest, OverlapBoolSides) {
  50. TBOX mid(10, 10, 30, 30);
  51. TBOX left(5, 15, 15, 25);
  52. TBOX bottom(15, 5, 25, 15);
  53. // other sides covered by symmetry
  54. EXPECT_TRUE(mid.overlap(left));
  55. EXPECT_TRUE(left.overlap(mid));
  56. EXPECT_TRUE(mid.overlap(bottom));
  57. EXPECT_TRUE(bottom.overlap(mid));
  58. }
  59. TEST_F(TBOXTest, OverlapFractionSides) {
  60. TBOX mid(10, 10, 30, 30);
  61. TBOX left(5, 15, 15, 25);
  62. TBOX bottom(15, 5, 25, 15);
  63. // other sides covered by symmetry
  64. EXPECT_DOUBLE_EQ((5.0 * 10.0) / (20.0 * 20.0), mid.overlap_fraction(left));
  65. EXPECT_DOUBLE_EQ((5.0 * 10.0) / (10.0 * 10.0), left.overlap_fraction(mid));
  66. EXPECT_DOUBLE_EQ((5.0 * 10.0) / (20.0 * 20.0), mid.overlap_fraction(bottom));
  67. EXPECT_DOUBLE_EQ((5.0 * 10.0) / (10.0 * 10.0), bottom.overlap_fraction(mid));
  68. }
  69. TEST_F(TBOXTest, OverlapBoolSpan) {
  70. TBOX mid(10, 10, 30, 30);
  71. TBOX vertical(15, 5, 25, 35);
  72. TBOX horizontal(5, 15, 35, 25);
  73. // other sides covered by symmetry in other test cases
  74. EXPECT_TRUE(mid.overlap(vertical));
  75. EXPECT_TRUE(vertical.overlap(mid));
  76. EXPECT_TRUE(mid.overlap(horizontal));
  77. EXPECT_TRUE(horizontal.overlap(mid));
  78. }
  79. TEST_F(TBOXTest, OverlapFractionSpan) {
  80. TBOX mid(10, 10, 30, 30);
  81. TBOX vertical(15, 5, 25, 35);
  82. TBOX horizontal(5, 15, 35, 25);
  83. // other sides covered by symmetry in other test cases
  84. EXPECT_DOUBLE_EQ((10.0 * 20.0) / (20.0 * 20.0), mid.overlap_fraction(vertical));
  85. EXPECT_DOUBLE_EQ((10.0 * 20.0) / (10.0 * 30.0), vertical.overlap_fraction(mid));
  86. EXPECT_DOUBLE_EQ((20.0 * 10.0) / (20.0 * 20.0), mid.overlap_fraction(horizontal));
  87. EXPECT_DOUBLE_EQ((20.0 * 10.0) / (30.0 * 10.0), horizontal.overlap_fraction(mid));
  88. }
  89. // TODO(nbeato): pretty much all cases
  90. TEST_F(TBOXTest, OverlapOutsideTests) {
  91. TBOX mid(10, 10, 30, 30);
  92. TBOX left(0, 15, 5, 25);
  93. EXPECT_FALSE(mid.overlap(left));
  94. EXPECT_FALSE(left.overlap(mid));
  95. EXPECT_DOUBLE_EQ(0.0, mid.overlap_fraction(left));
  96. EXPECT_DOUBLE_EQ(0.0, left.overlap_fraction(mid));
  97. }
  98. TEST_F(TBOXTest, OverlapXFraction) {
  99. TBOX a(10, 10, 20, 20);
  100. TBOX b(12, 100, 26, 200);
  101. TBOX c(0, 0, 100, 100);
  102. TBOX d(0, 0, 1, 1);
  103. EXPECT_DOUBLE_EQ(8.0 / 10.0, a.x_overlap_fraction(b));
  104. EXPECT_DOUBLE_EQ(8.0 / 14.0, b.x_overlap_fraction(a));
  105. EXPECT_DOUBLE_EQ(1.0, a.x_overlap_fraction(c));
  106. EXPECT_DOUBLE_EQ(10.0 / 100.0, c.x_overlap_fraction(a));
  107. EXPECT_DOUBLE_EQ(0.0, a.x_overlap_fraction(d));
  108. EXPECT_DOUBLE_EQ(0.0, d.x_overlap_fraction(a));
  109. }
  110. TEST_F(TBOXTest, OverlapYFraction) {
  111. TBOX a(10, 10, 20, 20);
  112. TBOX b(100, 12, 200, 26);
  113. TBOX c(0, 0, 100, 100);
  114. TBOX d(0, 0, 1, 1);
  115. EXPECT_DOUBLE_EQ(8.0 / 10.0, a.y_overlap_fraction(b));
  116. EXPECT_DOUBLE_EQ(8.0 / 14.0, b.y_overlap_fraction(a));
  117. EXPECT_DOUBLE_EQ(1.0, a.y_overlap_fraction(c));
  118. EXPECT_DOUBLE_EQ(10.0 / 100.0, c.y_overlap_fraction(a));
  119. EXPECT_DOUBLE_EQ(0.0, a.y_overlap_fraction(d));
  120. EXPECT_DOUBLE_EQ(0.0, d.y_overlap_fraction(a));
  121. }
  122. TEST_F(TBOXTest, OverlapXFractionZeroSize) {
  123. TBOX zero(10, 10, 10, 10);
  124. TBOX big(0, 0, 100, 100);
  125. TBOX small(0, 0, 1, 1);
  126. EXPECT_DOUBLE_EQ(1.0, zero.x_overlap_fraction(big));
  127. EXPECT_DOUBLE_EQ(0.0, big.x_overlap_fraction(zero));
  128. EXPECT_DOUBLE_EQ(0.0, zero.x_overlap_fraction(small));
  129. EXPECT_DOUBLE_EQ(0.0, small.x_overlap_fraction(zero));
  130. }
  131. TEST_F(TBOXTest, OverlapYFractionZeroSize) {
  132. TBOX zero(10, 10, 10, 10);
  133. TBOX big(0, 0, 100, 100);
  134. TBOX small(0, 0, 1, 1);
  135. EXPECT_DOUBLE_EQ(1.0, zero.y_overlap_fraction(big));
  136. EXPECT_DOUBLE_EQ(0.0, big.y_overlap_fraction(zero));
  137. EXPECT_DOUBLE_EQ(0.0, zero.y_overlap_fraction(small));
  138. EXPECT_DOUBLE_EQ(0.0, small.y_overlap_fraction(zero));
  139. }
  140. } // namespace tesseract