geometry.t 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. use Test::More;
  2. use strict;
  3. use warnings;
  4. plan tests => 24;
  5. BEGIN {
  6. use FindBin;
  7. use lib "$FindBin::Bin/../lib";
  8. }
  9. use Slic3r;
  10. use Slic3r::Geometry qw(PI polyline_remove_parallel_continuous_edges
  11. polyline_remove_acute_vertices polygon_remove_acute_vertices
  12. polygon_remove_parallel_continuous_edges polygon_is_convex);
  13. #==========================================================
  14. my $line1 = [ [5, 15], [30, 15] ];
  15. my $line2 = [ [10, 20], [10, 10] ];
  16. is_deeply Slic3r::Geometry::line_intersection($line1, $line2, 1), [10, 15], 'line_intersection';
  17. #==========================================================
  18. $line1 = [ [73.6310778185108/0.0000001, 371.74239268924/0.0000001], [73.6310778185108/0.0000001, 501.74239268924/0.0000001] ];
  19. $line2 = [ [75/0.0000001, 437.9853/0.0000001], [62.7484/0.0000001, 440.4223/0.0000001] ];
  20. isnt Slic3r::Geometry::line_intersection($line1, $line2, 1), undef, 'line_intersection';
  21. #==========================================================
  22. {
  23. my $polyline = [
  24. [459190000, 5152739000], [147261000, 4612464000], [147261000, 3487535000], [339887000, 3153898000],
  25. [437497000, 3438430000], [454223000, 3522515000], [523621000, 3626378000], [627484000, 3695776000],
  26. [750000000, 3720147000], [872515000, 3695776000], [976378000, 3626378000], [1045776000, 3522515000],
  27. [1070147000, 3400000000], [1045776000, 3277484000], [976378000, 3173621000], [872515000, 3104223000],
  28. [827892000, 3095347000], [698461000, 2947261000], [2540810000, 2947261000], [2852739000, 3487535000],
  29. [2852739000, 4612464000], [2540810000, 5152739000],
  30. ];
  31. # this points belongs to $polyline
  32. my $point = [2797980957.103410,3392691792.513960];
  33. local $Slic3r::Geometry::epsilon = 1E-5;
  34. is_deeply Slic3r::Geometry::polygon_segment_having_point($polyline, $point),
  35. [ [2540810000, 2947261000], [2852739000, 3487535000] ],
  36. 'polygon_segment_having_point';
  37. }
  38. #==========================================================
  39. {
  40. my $point = [ 736310778.185108, 5017423926.8924 ];
  41. my $line = [ [627484000, 3695776000], [750000000, 3720147000] ];
  42. is Slic3r::Geometry::point_in_segment($point, $line), 0, 'point_in_segment';
  43. }
  44. #==========================================================
  45. {
  46. my $point = [ 736310778.185108, 5017423926.8924 ];
  47. my $line = [ [627484000, 3695776000], [750000000, 3720147000] ];
  48. is Slic3r::Geometry::point_in_segment($point, $line), 0, 'point_in_segment';
  49. }
  50. #==========================================================
  51. my $polygons = [
  52. [ # contour, ccw
  53. [459190000, 5152739000], [147261000, 4612464000], [147261000, 3487535000], [339887000, 3153898000],
  54. [437497000, 3438430000], [454223000, 3522515000], [523621000, 3626378000], [627484000, 3695776000],
  55. [750000000, 3720147000], [872515000, 3695776000], [976378000, 3626378000], [1045776000, 3522515000],
  56. [1070147000, 3400000000], [1045776000, 3277484000], [976378000, 3173621000], [872515000, 3104223000],
  57. [827892000, 3095347000], [698461000, 2947261000], [2540810000, 2947261000], [2852739000, 3487535000],
  58. [2852739000, 4612464000], [2540810000, 5152739000],
  59. ],
  60. [ # hole, cw
  61. [750000000, 5020147000], [872515000, 4995776000], [976378000, 4926378000], [1045776000, 4822515000],
  62. [1070147000, 4700000000], [1045776000, 4577484000], [976378000, 4473621000], [872515000, 4404223000],
  63. [750000000, 4379853000], [627484000, 4404223000], [523621000, 4473621000], [454223000, 4577484000],
  64. [429853000, 4700000000], [454223000, 4822515000], [523621000, 4926378000], [627484000, 4995776000],
  65. ],
  66. ];
  67. my $points = [
  68. [ 736310778.185108, 3717423926.892399788 ],
  69. [ 736310778.185108, 5017423926.8924 ],
  70. ];
  71. is Slic3r::Geometry::can_connect_points(@$points, $polygons), 0, 'can_connect_points';
  72. #==========================================================
  73. {
  74. my $p1 = [10, 10];
  75. my $p2 = [10, 20];
  76. my $p3 = [10, 30];
  77. my $p4 = [20, 20];
  78. my $p5 = [0, 20];
  79. is Slic3r::Geometry::angle3points($p2, $p3, $p1), PI(), 'angle3points';
  80. is Slic3r::Geometry::angle3points($p2, $p1, $p3), PI(), 'angle3points';
  81. is Slic3r::Geometry::angle3points($p2, $p3, $p4), PI()/2*3, 'angle3points';
  82. is Slic3r::Geometry::angle3points($p2, $p4, $p3), PI()/2, 'angle3points';
  83. is Slic3r::Geometry::angle3points($p2, $p1, $p4), PI()/2, 'angle3points';
  84. is Slic3r::Geometry::angle3points($p2, $p1, $p5), PI()/2*3, 'angle3points';
  85. }
  86. {
  87. my $p1 = [30, 30];
  88. my $p2 = [20, 20];
  89. my $p3 = [10, 10];
  90. my $p4 = [30, 10];
  91. is Slic3r::Geometry::angle3points($p2, $p1, $p3), PI(), 'angle3points';
  92. is Slic3r::Geometry::angle3points($p2, $p1, $p4), PI()/2*3, 'angle3points';
  93. is Slic3r::Geometry::angle3points($p2, $p1, $p1), 2*PI(), 'angle3points';
  94. }
  95. #==========================================================
  96. {
  97. my $polygon = [
  98. [2265447881, 7013509857], [2271869937, 7009802077], [2606221146, 6816764300], [1132221146, 4263721402],
  99. [1098721150, 4205697705], [1228411320, 4130821051], [1557501031, 3940821051], [1737340080, 3836990933],
  100. [1736886253, 3837252951], [1494771522, 3977037948], [2959638603, 6514262167], [3002271522, 6588104548],
  101. [3083252364, 6541350240], [2854283608, 6673545411], [2525193897, 6863545411],
  102. ];
  103. polygon_remove_parallel_continuous_edges($polygon);
  104. polygon_remove_acute_vertices($polygon);
  105. is scalar(@$polygon), 4, 'polygon_remove_acute_vertices';
  106. }
  107. #==========================================================
  108. {
  109. my $polygon = [
  110. [226.5447881,701.3509857], [260.6221146,681.67643], [109.872115,420.5697705], [149.4771522,397.7037948],
  111. [300.2271522,658.8104548], [308.3252364,654.135024],
  112. ];
  113. polyline_remove_acute_vertices($polygon);
  114. is scalar(@$polygon), 6, 'polyline_remove_acute_vertices';
  115. }
  116. #==========================================================
  117. {
  118. my $cw_square = [ [0,0], [0,10], [10,10], [10,0] ];
  119. is polygon_is_convex($cw_square), 0, 'cw square is not convex';
  120. is polygon_is_convex([ reverse @$cw_square ]), 1, 'ccw square is convex';
  121. my $convex1 = [ [0,0], [10,0], [10,10], [0,10], [0,6], [4,6], [4,4], [0,4] ];
  122. is polygon_is_convex($convex1), 0, 'concave polygon';
  123. }
  124. #==========================================================
  125. {
  126. my $polyline = Slic3r::Polyline->new([0, 0], [10, 0], [20, 0]);
  127. is_deeply [$polyline->lines], [
  128. [ [0, 0], [10, 0] ],
  129. [ [10, 0], [20, 0] ],
  130. ], 'polyline_lines';
  131. }
  132. #==========================================================
  133. {
  134. my $polyline = Slic3r::Polygon->new([0, 0], [10, 0], [5, 5]);
  135. my $result = $polyline->split_at_index(1);
  136. is ref($result), 'Slic3r::Polyline', 'split_at_index returns polyline';
  137. is_deeply $result, [ [10, 0], [5, 5], [0, 0], [10, 0] ], 'split_at_index';
  138. }
  139. #==========================================================
  140. {
  141. my $bb = Slic3r::Geometry::BoundingBox->new_from_points([ [0, 1], [10, 2], [20, 2] ]);
  142. $bb->scale(2);
  143. is_deeply $bb->extents, [ [0,40], [2,4] ], 'bounding box is scaled correctly';
  144. }
  145. #==========================================================