65 VECTOR2I( 183450000, 128360000 ), 0 );
69 VECTOR2I( 183850000, 128360000 ), 0 );
73 VECTOR2I( 183450000, 128360000 ), 0 );
77 VECTOR2I( 183500000, 129204974 ), 0 );
81 VECTOR2I( 283850000, 228360000 ), 0 );
126BOOST_FIXTURE_TEST_SUITE( TestShapeLineChain,
SLC_CASES )
134 ClipperLib::Path pathClipper1 = {
135 { { 125663951, 120099260, 24 }, { 125388111, 120170850, 25 }, { 125124975, 120280270, 26 },
136 { 124879705, 120425376, 27 }, { 124657110, 120603322, 28 }, { 124461556, 120810617, 29 },
137 { 124296876, 121043198, 30 }, { 124166301, 121296503, 31 }, { 124072391, 121565564, 32 },
138 { 124016988, 121845106, 33 }, { 124001177, 122129646, 34 }, { 124025270, 122413605, 35 },
139 { 124088794, 122691414, 36 }, { 124190502, 122957625, 37 }, { 124328401, 123207018, 38 },
140 { 124499787, 123434703, 39 }, { 124598846, 123537154, 40 }, { 127171000, 123786000, 4 },
141 { 127287862, 123704439, 5 }, { 127499716, 123513831, 6 }, { 127682866, 123295498, 7 },
142 { 127833720, 123053722, 8 }, { 127949321, 122793242, 9 }, { 128027402, 122519168, 10 },
143 { 128066430, 122236874, 11 }, { 128065642, 121951896, 12 }, { 128025053, 121669823, 13 },
144 { 127945457, 121396185, 14 }, { 127828417, 121136349, 15 }, { 127676227, 120895410, 16 },
145 { 127491873, 120678094, 17 }, { 127278968, 120488661, 18 }, { 127041689, 120330827, 19 },
146 { 126784688, 120207687, 20 }, { 126513005, 120121655, 21 }, { 126231968, 120074419, 22 },
147 { 125947087, 120066905, 23 } }
149 Clipper2Lib::Path64 pathClipper2 = {
150 { { 125663951, 120099260, 24 }, { 125388111, 120170850, 25 }, { 125124975, 120280270, 26 },
151 { 124879705, 120425376, 27 }, { 124657110, 120603322, 28 }, { 124461556, 120810617, 29 },
152 { 124296876, 121043198, 30 }, { 124166301, 121296503, 31 }, { 124072391, 121565564, 32 },
153 { 124016988, 121845106, 33 }, { 124001177, 122129646, 34 }, { 124025270, 122413605, 35 },
154 { 124088794, 122691414, 36 }, { 124190502, 122957625, 37 }, { 124328401, 123207018, 38 },
155 { 124499787, 123434703, 39 }, { 124598846, 123537154, 40 }, { 127171000, 123786000, 4 },
156 { 127287862, 123704439, 5 }, { 127499716, 123513831, 6 }, { 127682866, 123295498, 7 },
157 { 127833720, 123053722, 8 }, { 127949321, 122793242, 9 }, { 128027402, 122519168, 10 },
158 { 128066430, 122236874, 11 }, { 128065642, 121951896, 12 }, { 128025053, 121669823, 13 },
159 { 127945457, 121396185, 14 }, { 127828417, 121136349, 15 }, { 127676227, 120895410, 16 },
160 { 127491873, 120678094, 17 }, { 127278968, 120488661, 18 }, { 127041689, 120330827, 19 },
161 { 126784688, 120207687, 20 }, { 126513005, 120121655, 21 }, { 126231968, 120074419, 22 },
162 { 125947087, 120066905, 23 } }
165 std::vector<CLIPPER_Z_VALUE> z_values = {
166 { { -1, -1 }, 0 }, { { -1, -1 }, 0 }, { { -1, -1 }, 0 }, { { -1, -1 }, 0 },
167 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
168 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
169 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
170 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
171 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
172 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
173 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
174 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
175 { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 }, { { 0, -1 }, 0 },
179 std::vector<SHAPE_ARC> arcs = {
180 SHAPE_ARC( { 127171000, 123786000 }, { 126231718, 120077003 }, { 124598846, 123537154 }, 0 )
189 BOOST_CHECK_EQUAL( clipper1chain.
PointCount(), 37 );
190 BOOST_CHECK_EQUAL( clipper2chain.
PointCount(), 37 );
192 BOOST_CHECK_EQUAL( clipper1chain.
ArcCount(), 1 );
193 BOOST_CHECK_EQUAL( clipper2chain.
ArcCount(), 1 );
195 BOOST_CHECK_EQUAL( clipper1chain.
ShapeCount(), 2 );
196 BOOST_CHECK_EQUAL( clipper2chain.
ShapeCount(), 2 );
198 BOOST_CHECK_EQUAL( clipper1chain.
IsClosed(),
true );
199 BOOST_CHECK_EQUAL( clipper2chain.
IsClosed(),
true );
217 BOOST_CHECK_EQUAL( base_chain.CShapes().size(), base_chain.CPoints().size() );
218 BOOST_CHECK_EQUAL( arc_insert1.CShapes().size(), arc_insert1.CPoints().size() );
219 BOOST_CHECK_EQUAL( arc_insert2.
CShapes().size(), arc_insert2.
CPoints().size() );
227 BOOST_CHECK_EQUAL( base_chain.CShapes().size(), base_chain.CPoints().size() );
229 base_chain.Replace( 0, 2, chain_insert );
231 BOOST_CHECK_EQUAL( base_chain.CShapes().size(), base_chain.CPoints().size() );
249 BOOST_CHECK_EQUAL( base_chain.PointCount(), 11 );
251 base_chain.Insert( 9,
VECTOR2I( 250000, 0 ) );
253 BOOST_CHECK_EQUAL( base_chain.PointCount(), 12 );
254 BOOST_CHECK_EQUAL( base_chain.ArcCount(), 2 );
256 base_chain.Replace( 5, 6, chain_insert );
258 BOOST_CHECK_EQUAL( base_chain.PointCount(), 13 );
259 BOOST_CHECK_EQUAL( base_chain.ArcCount(), 3 );
261 base_chain.Replace( 4, 6,
VECTOR2I( 550000, 0 ) );
263 BOOST_CHECK_EQUAL( base_chain.PointCount(), 11 );
264 BOOST_CHECK_EQUAL( base_chain.ArcCount(), 3 );
267 base_chain.SetClosed(
true );
268 double areaPriorToArcRemoval = base_chain.Area();
269 base_chain.ClearArcs();
272 BOOST_CHECK_EQUAL( base_chain.CPoints().size(), base_chain.CShapes().size() );
273 BOOST_CHECK_EQUAL( base_chain.PointCount(), 11 );
274 BOOST_CHECK_EQUAL( base_chain.ArcCount(), 0 );
275 BOOST_CHECK_EQUAL( base_chain.Area(), areaPriorToArcRemoval );
285 SHAPE_ARC( { -859598, 2559876 }, { -1632771, 1022403 }, { -3170244, 249230 }, 0 ) );
288 SHAPE_ARC( { -3170244, -1657832 }, { -292804, -317564 }, { 1047464, 2559876 }, 0 ) );
297 BOOST_CHECK_EQUAL( chain.
CPoints().size(), chain.
CShapes().size() );
303 BOOST_CHECK_EQUAL( Circle2Arcs.IsClosed(),
true );
304 BOOST_CHECK_EQUAL( Circle2Arcs.PointCount(), 16 );
305 BOOST_CHECK_EQUAL( Circle2Arcs.IsArcSegment( 15 ),
true );
306 BOOST_CHECK_EQUAL( Circle2Arcs.ShapeCount(), 2 );
307 Circle2Arcs.SetClosed(
false );
309 BOOST_CHECK_EQUAL( Circle2Arcs.IsClosed(),
false );
310 BOOST_CHECK_EQUAL( Circle2Arcs.PointCount(), 17 );
311 BOOST_CHECK_EQUAL( Circle2Arcs.IsArcSegment( 15 ),
true );
312 BOOST_CHECK_EQUAL( Circle2Arcs.IsArcSegment( 16 ),
false );
352 BOOST_CHECK_EQUAL( slc_case.
IsClosed(), c.m_closed );
353 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_shape_count );
354 BOOST_CHECK_EQUAL( slc_case.
PointCount(), c.m_point_count );
357 BOOST_CHECK_EQUAL( slc_case.
IsClosed(), !c.m_closed );
358 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_expected_shape_count );
359 BOOST_CHECK_EQUAL( slc_case.
PointCount(), c.m_expected_point_count );
362 BOOST_CHECK_EQUAL( slc_case.
IsClosed(), c.m_closed );
363 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_shape_count );
364 BOOST_CHECK_EQUAL( slc_case.
PointCount(), c.m_point_count );
375 chain.
Append( { 100, 100 } );
376 chain.
Append( { 100, 100 }, true );
377 chain.
Append( { 200, 100 } );
384 BOOST_CHECK_EQUAL( chain.
CPoints().size(), chain.
CShapes().size() );
477 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_shape_count );
478 BOOST_CHECK_EQUAL( slc_case.
ArcCount(), c.m_arc_count );
481 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_expected_shape_count );
482 BOOST_CHECK_EQUAL( slc_case.
ArcCount(), c.m_expected_arc_count );
497 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_shape_count );
498 BOOST_CHECK_EQUAL( slc_case.
ArcCount(), c.m_arc_count );
501 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_shape_count );
502 BOOST_CHECK_EQUAL( slc_case.
ArcCount(), c.m_arc_count );
505 BOOST_CHECK_EQUAL( slc_case.
ShapeCount(), c.m_expected_shape_count );
506 BOOST_CHECK_EQUAL( slc_case.
ArcCount(), c.m_expected_arc_count );
514 BOOST_CHECK_EQUAL( Circle1Arc.ShapeCount(), 1 );
515 BOOST_CHECK_EQUAL( Circle2Arcs.ShapeCount(), 2 );
516 BOOST_CHECK_EQUAL( ArcsCoincident.ShapeCount(), 2 );
517 BOOST_CHECK_EQUAL( ArcsCoincidentClosed.ShapeCount(), 3 );
518 BOOST_CHECK_EQUAL( DuplicateArcs.ShapeCount(), 4 );
519 BOOST_CHECK_EQUAL( ArcAndPoint.ShapeCount(), 2 );
520 BOOST_CHECK_EQUAL( ArcsAndSegMixed.ShapeCount(), 4 );
521 BOOST_CHECK_EQUAL( SegAndArcCoincident.ShapeCount(), 2 );
522 BOOST_CHECK_EQUAL( EmptyChain.ShapeCount(), 0 );
523 BOOST_CHECK_EQUAL( OnePoint.ShapeCount(), 0 );
524 BOOST_CHECK_EQUAL( TwoPoints.ShapeCount(), 1 );
525 BOOST_CHECK_EQUAL( ThreePoints.ShapeCount(), 2 );
531 BOOST_CHECK_EQUAL( Circle1Arc.NextShape( 0 ), -1 );
533 BOOST_CHECK_EQUAL( Circle2Arcs.NextShape( 0 ), 8 );
534 BOOST_CHECK_EQUAL( Circle2Arcs.NextShape( 8 ), -1 );
536 BOOST_CHECK_EQUAL( ArcsCoincident.NextShape( 0 ), 8 );
537 BOOST_CHECK_EQUAL( ArcsCoincident.NextShape( 8 ), -1 );
539 BOOST_CHECK_EQUAL( ArcsCoincidentClosed.NextShape( 0 ), 8 );
540 BOOST_CHECK_EQUAL( ArcsCoincidentClosed.NextShape( 8 ), 13 );
541 BOOST_CHECK_EQUAL( ArcsCoincidentClosed.NextShape( 13 ), -1 );
543 BOOST_CHECK_EQUAL( ArcsIndependent.NextShape( 0 ), 8 );
544 BOOST_CHECK_EQUAL( ArcsIndependent.NextShape( 8 ), 9 );
545 BOOST_CHECK_EQUAL( ArcsIndependent.NextShape( 9 ), -1 );
547 BOOST_CHECK_EQUAL( DuplicateArcs.NextShape( 0 ), 8 );
548 BOOST_CHECK_EQUAL( DuplicateArcs.NextShape( 8 ), 13 );
549 BOOST_CHECK_EQUAL( DuplicateArcs.NextShape( 13 ), 14 );
550 BOOST_CHECK_EQUAL( DuplicateArcs.NextShape( 14 ), -1 );
552 BOOST_CHECK_EQUAL( ArcAndPoint.NextShape( 0 ), 8 );
553 BOOST_CHECK_EQUAL( ArcAndPoint.NextShape( 8 ), -1 );
555 BOOST_CHECK_EQUAL( ArcsAndSegMixed.NextShape( 0 ), 8 );
556 BOOST_CHECK_EQUAL( ArcsAndSegMixed.NextShape( 8 ), 9 );
557 BOOST_CHECK_EQUAL( ArcsAndSegMixed.NextShape( 9 ), 10 );
558 BOOST_CHECK_EQUAL( ArcsAndSegMixed.NextShape( 10 ), -1 );
559 BOOST_CHECK_EQUAL( ArcsAndSegMixed.NextShape( 20 ), -1 );
560 BOOST_CHECK_EQUAL( ArcsAndSegMixed.NextShape( -50 ), -1 );
562 BOOST_CHECK_EQUAL( SegAndArcCoincident.NextShape( 0 ), 1 );
563 BOOST_CHECK_EQUAL( SegAndArcCoincident.NextShape( 1 ), -1 );
565 BOOST_CHECK_EQUAL( EmptyChain.NextShape( 0 ), -1 );
566 BOOST_CHECK_EQUAL( EmptyChain.NextShape( 1 ), -1 );
567 BOOST_CHECK_EQUAL( EmptyChain.NextShape( 2 ), -1 );
568 BOOST_CHECK_EQUAL( EmptyChain.NextShape( -2 ), -1 );
570 BOOST_CHECK_EQUAL( OnePoint.NextShape( 0 ), -1 );
571 BOOST_CHECK_EQUAL( OnePoint.NextShape( -1 ), -1 );
572 BOOST_CHECK_EQUAL( OnePoint.NextShape( 1 ), -1 );
573 BOOST_CHECK_EQUAL( OnePoint.NextShape( 2 ), -1 );
574 BOOST_CHECK_EQUAL( OnePoint.NextShape( -2 ), -1 );
576 BOOST_CHECK_EQUAL( TwoPoints.NextShape( 0 ), -1 );
577 BOOST_CHECK_EQUAL( TwoPoints.NextShape( 1 ), -1 );
578 BOOST_CHECK_EQUAL( TwoPoints.NextShape( -1 ), -1 );
580 BOOST_CHECK_EQUAL( ThreePoints.NextShape( 0 ), 1 );
581 BOOST_CHECK_EQUAL( ThreePoints.NextShape( 1 ), -1 );
582 BOOST_CHECK_EQUAL( ThreePoints.NextShape( 2 ), -1 );
583 BOOST_CHECK_EQUAL( ThreePoints.NextShape( -1 ), -1 );
594 chain.
Append( arc, 5000 );
596 BOOST_CHECK_EQUAL( chain.
ArcCount(), 0 );
607 chain.
Append( arc, 5000 );
609 BOOST_CHECK_EQUAL( chain.
ArcCount(), 1 );
620 chain.
Append( arc, 5000 );
622 BOOST_CHECK_EQUAL( chain.
ArcCount(), 0 );
631 chain.
Append( arc, 5000 );
633 BOOST_CHECK_EQUAL( chain.
ArcCount(), 0 );
643 chain.
Append( arc, 5000 );
645 BOOST_CHECK_EQUAL( chain.
ArcCount(), 0 );
654 chain.
Append( arc, 5000 );
656 BOOST_CHECK_EQUAL( chain.
ArcCount(), 0 );
666 chain.
Append( arc, 5000 );
668 BOOST_CHECK_EQUAL( chain.
ArcCount(), 0 );
692 BOOST_CHECK_EQUAL( chain.
IsSharedPt( 0 ),
false );
693 BOOST_CHECK_EQUAL( chain.
IsArcEnd( 0 ),
false );
694 BOOST_CHECK_EQUAL( chain.
IsArcStart( 0 ),
true );
697 BOOST_CHECK_EQUAL( chain.
IsSharedPt( 6 ),
true );
698 BOOST_CHECK_EQUAL( chain.
IsArcEnd( 6 ),
true );
699 BOOST_CHECK_EQUAL( chain.
IsArcStart( 6 ),
true );
703 BOOST_CHECK_EQUAL( chain.
IsSharedPt( endIndex ),
false );
704 BOOST_CHECK_EQUAL( chain.
IsArcEnd( endIndex ),
true );
705 BOOST_CHECK_EQUAL( chain.
IsArcStart( endIndex ),
false );
709 BOOST_CHECK_EQUAL( chain.
IsPtOnArc( i ),
true );
718 BOOST_CHECK_EQUAL( chain.
IsSharedPt( 0 ),
true );
719 BOOST_CHECK_EQUAL( chain.
IsArcEnd( 0 ),
true );
720 BOOST_CHECK_EQUAL( chain.
IsArcStart( 0 ),
true );
723 BOOST_CHECK_EQUAL( chain.
IsSharedPt( 6 ),
true );
724 BOOST_CHECK_EQUAL( chain.
IsArcEnd( 6 ),
true );
725 BOOST_CHECK_EQUAL( chain.
IsArcStart( 6 ),
true );
729 BOOST_CHECK_EQUAL( chain.
IsSharedPt( endIndex ),
false );
730 BOOST_CHECK_EQUAL( chain.
IsArcEnd( endIndex ),
false );
731 BOOST_CHECK_EQUAL( chain.
IsArcStart( endIndex ),
false );
743 BOOST_CHECK_EQUAL( chain.PointCount(), 2 );
746 BOOST_CHECK_EQUAL( chain.PointCount(), 9 );
748 chain.Append( seg2.
A );
749 chain.Append( seg2.
B );
750 BOOST_CHECK_EQUAL( chain.PointCount(), 11 );
756 BOOST_CHECK_EQUAL( chainCopy.
Split(
VECTOR2I( 400000, 0 ) ), -1 );
757 BOOST_CHECK_EQUAL( chainCopy.
PointCount(), chain.PointCount() );
758 BOOST_CHECK_EQUAL( chainCopy.
ArcCount(), chain.ArcCount() );
765 BOOST_CHECK_EQUAL( chainCopy.
Split( splitPoint ), 1 );
767 BOOST_CHECK_EQUAL( chainCopy.
GetPoint( 1 ), splitPoint );
768 BOOST_CHECK_EQUAL( chainCopy.
PointCount(), chain.PointCount() + 1 );
769 BOOST_CHECK_EQUAL( chainCopy.
ArcCount(), chain.ArcCount() );
776 BOOST_CHECK_EQUAL( chainCopy.
Split( splitPoint ), 1 );
778 BOOST_CHECK_EQUAL( chainCopy.
GetPoint( 1 ), splitPoint );
779 BOOST_CHECK_EQUAL( chainCopy.
PointCount(), chain.PointCount() );
780 BOOST_CHECK_EQUAL( chainCopy.
ArcCount(), chain.ArcCount() );
787 BOOST_CHECK_EQUAL( chainCopy.
Split( splitPoint ), 2 );
789 BOOST_CHECK_EQUAL( chainCopy.
GetPoint( 2 ), splitPoint );
790 BOOST_CHECK_EQUAL( chainCopy.
PointCount(), chain.PointCount() );
791 BOOST_CHECK_EQUAL( chainCopy.
ArcCount(), chain.ArcCount() );
798 BOOST_CHECK_EQUAL( chainCopy.
Split( splitPoint ), 3 );
800 BOOST_CHECK_EQUAL( chainCopy.
GetPoint( 3 ), splitPoint );
801 BOOST_CHECK_EQUAL( chainCopy.
IsSharedPt( 3 ),
true );
802 BOOST_CHECK_EQUAL( chainCopy.
PointCount(), chain.PointCount() + 1 );
803 BOOST_CHECK_EQUAL( chainCopy.
ArcCount(), chain.ArcCount() + 1 );
818 BOOST_CHECK_EQUAL( chain.PointCount(), 3 );
820 chain.Append( firstArc );
821 BOOST_CHECK_EQUAL( chain.PointCount(), 10 );
823 chain.Append( targetSegment.
A );
824 chain.Append( targetSegment.
B );
825 BOOST_CHECK_EQUAL( chain.PointCount(), 12 );
827 chain.Append( secondArc );
828 BOOST_CHECK_EQUAL( chain.PointCount(), 20 );
839 BOOST_CHECK_EQUAL( sliceResult.
ArcCount(), 1 );
845 BOOST_CHECK_EQUAL( sliceResult.
Arc( 0 ).
GetP0(), expectedSliceArc0.
GetP0() );
849 BOOST_CHECK_EQUAL( sliceResult.
PointCount(), 10 );
850 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 0 ), firstArc.
GetP1() );
851 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 1 ), targetSegment.
A );
852 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 2 ), targetSegment.
B );
853 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 3 ), expectedSliceArc0.
GetP0() );
854 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( 3 ),
true );
856 for(
int i = 4; i <= 8; i++ )
857 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( i ),
false );
859 for(
int i = 3; i <= 7; i++ )
860 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( i ),
false );
862 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( 9 ),
true );
863 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 9 ), expectedSliceArc0.
GetP1() );
874 BOOST_CHECK_EQUAL( sliceResult.
ArcCount(), 1 );
880 BOOST_CHECK_EQUAL( sliceResult.
Arc( 0 ).
GetP1(),
881 expectedSliceArc0.
GetP1() );
885 BOOST_CHECK_EQUAL( sliceResult.
PointCount(), 8 );
886 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 0 ),
887 expectedSliceArc0.
GetP0() );
888 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( 0 ),
true );
890 for(
int i = 1; i <= 4; i++ )
891 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( i ),
false );
893 for(
int i = 0; i <= 3; i++ )
894 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( i ),
false );
896 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( 4 ),
true );
897 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 4 ),
898 expectedSliceArc0.
GetP1() );
900 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 5 ), targetSegment.
A );
901 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 6 ), targetSegment.
B );
902 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 7 ), secondArc.
GetP0() );
913 BOOST_CHECK_EQUAL( sliceResult.
ArcCount(), 1 );
917 BOOST_CHECK_EQUAL( firstArc.
GetP1(), sliceArc0.
GetP1() );
919 BOOST_CHECK_EQUAL( firstArc.
GetP1(), sliceArc0.
GetP1() );
921 BOOST_CHECK_EQUAL( sliceResult.
PointCount(), 7 );
922 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 0 ), sliceArc0.
GetP0() );
923 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( 0 ),
true );
925 for(
int i = 1; i <= 6; i++ )
926 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( i ),
false );
928 for(
int i = 0; i <= 5; i++ )
929 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( i ),
false );
931 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( 6 ),
true );
932 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 6 ), sliceArc0.
GetP1() );
943 BOOST_CHECK_EQUAL( sliceResult.
ArcCount(), 1 );
947 BOOST_CHECK_EQUAL( firstArc.
GetP1(), sliceArc0.
GetP1() );
949 BOOST_CHECK_EQUAL( firstArc.
GetP1(), sliceArc0.
GetP1() );
951 BOOST_CHECK_EQUAL( sliceResult.
PointCount(), 10 );
952 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 0 ), sliceArc0.
GetP0() );
953 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( 0 ),
true );
955 for(
int i = 1; i <= 6; i++ )
956 BOOST_CHECK_EQUAL( sliceResult.
IsArcStart( i ),
false );
958 for(
int i = 0; i <= 5; i++ )
959 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( i ),
false );
961 BOOST_CHECK_EQUAL( sliceResult.
IsArcEnd( 6 ),
true );
962 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 6 ), sliceArc0.
GetP1() );
964 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 7 ), targetSegment.
A );
965 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 8 ), targetSegment.
B );
966 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 9 ), secondArc.
GetP0() );
976 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( -1 ),
VECTOR2I( 400000, 400000 ) );
984 BOOST_CHECK_EQUAL( sliceResult.
PointCount(), 1 );
985 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 0 ),
VECTOR2I( 233450000, 228360000 ) );
986 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( -1 ),
VECTOR2I( 233450000, 228360000 ) );
994 BOOST_CHECK_EQUAL( sliceResult.
PointCount(), 2 );
995 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 0 ),
VECTOR2I( 233450000, 228360000 ) );
996 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( 1 ),
VECTOR2I( 263450000, 258360000 ) );
997 BOOST_CHECK_EQUAL( sliceResult.
GetPoint( -1 ),
VECTOR2I( 263450000, 258360000 ) );
1011 BOOST_CHECK_EQUAL( chain.PointCount(), 2 );
1013 chain.Append( arc );
1014 BOOST_CHECK_EQUAL( chain.PointCount(), 9 );
1016 chain.Append( seg2.
A );
1017 chain.Append( seg2.
B );
1018 BOOST_CHECK_EQUAL( chain.PointCount(), 11 );
1021 VECTOR2I ptOnArcCloseToStart( 297553, 31697 );
1022 VECTOR2I ptOnArcCloseToEnd( 139709, 82983 );
1024 BOOST_CHECK_EQUAL( chain.NearestPoint( ptOnArcCloseToStart,
true ), ptOnArcCloseToStart );
1025 BOOST_CHECK_EQUAL( chain.NearestPoint( ptOnArcCloseToStart,
false ), arc.
GetP0() );
1027 BOOST_CHECK_EQUAL( chain.NearestPoint( ptOnArcCloseToEnd,
true ), ptOnArcCloseToEnd );
1028 BOOST_CHECK_EQUAL( chain.NearestPoint( ptOnArcCloseToEnd,
false ), arc.
GetP1() );
1037 std::vector<VECTOR2I> linePts = {
1038 { 206000000, 140110000 }, { 192325020, 140110000 }, { 192325020, 113348216 },
1039 { 192251784, 113274980 }, { 175548216, 113274980 }, { 175474980, 113348216 },
1040 { 175474980, 136694980 }, { 160774511, 121994511 }, { 160774511, 121693501 },
1041 { 160086499, 121005489 }, { 159785489, 121005489 }, { 159594511, 120814511 },
1042 { 160086499, 120814511 }, { 160774511, 120126499 }, { 160774511, 119153501 },
1043 { 160086499, 118465489 }, { 159113501, 118465489 }, { 158425489, 119153501 },
1044 { 158425489, 119645489 }, { 157325020, 118545020 }, { 157325020, 101925020 },
1045 { 208674980, 101925020 }, { 208674980, 145474980 }, { 192325020, 145474980 },
1046 { 192325020, 140110000 }
1051 BOOST_CHECK_EQUAL( baseChain.
PointCount(), linePts.size() );
1054 BOOST_CHECK_EQUAL( replaceChain.PointCount(), 1 );
1056 baseChain.
Replace( 1, 23, replaceChain );
1058 BOOST_CHECK_EQUAL( baseChain.
PointCount(), linePts.size() - ( 23 - 1 ) );
1067BOOST_AUTO_TEST_SUITE_END()
const VECTOR2I & GetArcMid() const
SHAPE_ARC & ConstructFromStartEndCenter(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aClockwise=false, double aWidth=0)
Constructs this arc from the given start, end and center.
const VECTOR2I & GetP1() const
bool Collide(const SEG &aSeg, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the segment aSeg than aClearance,...
static double DefaultAccuracyForPCB()
VECTOR2I GetCenter() const
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
bool IsPtOnArc(size_t aPtIndex) const
const SHAPE_ARC & Arc(size_t aArc) const
bool IsClosed() const override
virtual const VECTOR2I GetPoint(int aIndex) const override
int Split(const VECTOR2I &aP, bool aExact=false)
Insert the point aP belonging to one of the our segments, splitting the adjacent segment in two.
int ShapeCount() const
Return the number of shapes (line segments or arcs) in this line chain.
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
void Simplify(int aMaxError=0)
Simplify the line chain by removing colinear adjacent segments and duplicate vertices.
int PointCount() const
Return the number of points (vertices) in this line chain.
bool IsArcEnd(size_t aIndex) const
void Replace(int aStartIndex, int aEndIndex, const VECTOR2I &aP)
Replace points with indices in range [start_index, end_index] with a single point aP.
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex=-1) const
Return a subset of this line chain containing the [start_index, end_index] range of points.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const std::vector< std::pair< ssize_t, ssize_t > > & CShapes() const
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
void RemoveShape(int aPointIndex)
Remove the shape at the given index from the line chain.
bool IsArcStart(size_t aIndex) const
void SetWidth(int aWidth)
Set the width of all segments in the chain.
bool IsSharedPt(size_t aIndex) const
Test if a point is shared between multiple shapes.
const std::vector< VECTOR2I > & CPoints() const
static constexpr EDA_ANGLE ANGLE_180
bool IsOutlineValid(const SHAPE_LINE_CHAIN &aChain)
Verify that a SHAPE_LINE_CHAIN has been assembled correctly by ensuring that the arc start and end po...
Numerical test predicates.
int m_expected_point_count
int m_expected_shape_count
int m_expected_shape_count
NOTE: Collision of SHAPE_LINE_CHAIN with arcs is tested in test_shape_arc.cpp.
SHAPE_LINE_CHAIN EmptyChain
SHAPE_LINE_CHAIN Circle1Arc
SHAPE_LINE_CHAIN ArcsCoincident
SHAPE_ARC Arc1
start coincident with Arc0a end
SHAPE_ARC Arc2
Independent arc.
SHAPE_ARC Arc3
Arc with angle >180.
SHAPE_ARC Arc0a
First half of a circle.
SHAPE_LINE_CHAIN DuplicateArcs
SHAPE_LINE_CHAIN Circle2Arcs
SHAPE_LINE_CHAIN ArcsCoincidentClosed
SHAPE_LINE_CHAIN TwoPoints
SHAPE_LINE_CHAIN SegAndArcCoincident
SHAPE_LINE_CHAIN ArcsIndependent
SHAPE_ARC ArcCircle
Full Circle arc.
SHAPE_LINE_CHAIN ThreePoints
SHAPE_LINE_CHAIN ArcAndPoint
SHAPE_LINE_CHAIN ArcsAndSegMixed
SHAPE_LINE_CHAIN OnePoint
SHAPE_ARC Arc0b
Second half of a circle.
BOOST_CHECK(box.ClosestPointTo(VECTOR2D(0, 0))==VECTOR2D(1, 2))
Test suite for KiCad math code.
static const std::vector< CLOSE_TOGGLE_SHAPE_CASE > close_toggle_shape_cases
BOOST_AUTO_TEST_CASE(ClipperConstructorCase1)
static const std::vector< REMOVE_SHAPE_CASE > remove_shape_cases
#define BOOST_TEST_CONTEXT(A)
#define BOOST_TEST_INFO(A)
If HAVE_EXPECTED_FAILURES is defined, this means that boost::unit_test::expected_failures is availabl...