• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3 
4 // Copyright (c) 2012-2019 Barend Gehrels, Amsterdam, the Netherlands.
5 
6 // This file was modified by Oracle on 2016, 2019.
7 // Modifications copyright (c) 2016, Oracle and/or its affiliates.
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
9 
10 // Use, modification and distribution is subject to the Boost Software License,
11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12 // http://www.boost.org/LICENSE_1_0.txt)
13 
14 #include "test_buffer.hpp"
15 
16 
17 static std::string const simplex
18     = "POLYGON ((0 0,1 5,6 1,0 0))";
19 static std::string const concave_simplex
20     = "POLYGON ((0 0,3 5,3 3,5 3,0 0))";
21 static std::string const concave_b
22     = "POLYGON((0 10,5 15,6 13,8 11,0 10))";
23 static std::string const square_simplex
24     = "POLYGON ((0 0,0 1,1 1,1 0,0 0))";
25 static std::string const spike_simplex
26     = "POLYGON ((0 0,1 5,3 3,5 5,3 3,5 1,0 0))";
27 static std::string const chained_box
28     = "POLYGON((0 0,0 4,4 4,8 4,12 4,12 0,8 0,4 0,0 0))";
29 
30 static std::string const join_types
31     = "POLYGON ((0 0,0 4,4 4,2 6,0 8,2 6,4 8,8 4,4 0,0 0))"; // first 4 join types are all different: convex, concave, continue, spike
32 
33 static std::string const donut_simplex
34     = "POLYGON ((0 0,1 9,8 1,0 0),(1 1,4 1,1 4,1 1))";
35 static std::string const donut_diamond
36     = "POLYGON((15 0,15 15,30 15,30 0,15 0),(26 11,22 14,19 10,23 07,26 11))";
37 static std::string const letter_L
38     = "POLYGON ((0 0,0 4,1 4,1 1,3 1,3 0,0 0))";
39 static std::string const indentation
40     = "POLYGON ((0 0,0 5,4 5,4 4,3 3,2 4,2 1,3 2,4 1,4 0,0 0))";
41 static std::string const funnelgate
42     = "POLYGON((0 0,0 7,7 7,7 0,5 0,5 1,6 6,1 6,2 1,2 0,0 0))";
43 static std::string const gammagate
44     = "POLYGON((0 0,0 6,9 6,9 0,4 0,4 2,7 2,7 4,2 4,2 0,0 0))";
45 static std::string const fork_a
46     = "POLYGON((0 0,0 6,9 6,9 0,4 0,4 2,7 2,7 4,6 4,6 5,5 5,5 4,4 4,4 5,3 5,3 4,2 4,2 0,0 0))";
47 static std::string const fork_b
48     = "POLYGON((0 0,0 8,14 8,14 0,4 0,4 2,13 2,13 4,12 4,12 7,9 7,9 4,7 4,7 7,4 7,4 4,2 4,2 0,0 0))";
49 static std::string const fork_c
50     = "POLYGON((0 0,0 9,12 9,12 0,4 0,4 4,6 4,6 2,8 2,8 4,10 4,10 7,6 7,6 6,2 6,2 0,0 0))";
51 
52 static std::string const arrow
53     = "POLYGON ((1 0,1 5,0.5 4.5,2 10,3.5 4.5,3 5,3 0,1 0))";
54 static std::string const tipped_aitch
55     = "POLYGON ((0 0,0 3,3 3,3 4,0 4,0 7,7 7,7 4,4 4,4 3,7 3,7 0,0 0))";
56 static std::string const snake
57     = "POLYGON ((0 0,0 3,3 3,3 4,0 4,0 7,8 7,8 4,6 4,6 3,8 3,8 0,7 0,7 2,5 2"
58                 ",5 5,7 5,7 6,1 6,1 5,4 5,4 2,1 2,1 1,6 1,6 0,0 0))";
59 static std::string const church
60     = "POLYGON ((0 0,0 3,2.999 3,3 8,3 0,0 0))";
61 static std::string const flower
62     = "POLYGON ((1 0,1 10,9 10,9 0,4.99 0,4.99 5.5,4.5 6,5 6.5,5.5 6,5.01 5.5,5.01 0.01,5.25 0.01,5.25 5,6 3,8 5,6 6,8 7,6 9,5 7,4 9,2 7,4 6,2 5,4 3,4.75 5,4.75 0,1 0))";
63 
64 static std::string const saw
65     = "POLYGON((1 3,1 8,1.5 6,5 8,5.5 6,9 8,9.5 6,13 8,13 3,1 3))";
66 
67 static std::string const bowl
68     = "POLYGON((1 2,1 7,2 7,3 5,5 4,7 5,8 7,9 7,9 2,1 2))";
69 
70 // Triangle with segmented sides, closing point at longest side
71 static std::string const triangle
72     = "POLYGON((4 5,5 4,4 4,3 4,3 5,3 6,4 5))";
73 
74 // Triangle which caused acos in join_round to fail with larger side strategy
75 static std::string const sharp_triangle
76     = "POLYGON((2 0,3 8,4 0,2 0))";
77 
78 static std::string const right_triangle
79     = "POLYGON((0 1,20 0,0 0,0 1))";
80 
81 
82 static std::string const degenerate0
83     = "POLYGON(())";
84 static std::string const degenerate1
85     = "POLYGON((5 5))";
86 static std::string const degenerate2
87     = "POLYGON((5 5,5 5,5 5,5 5))";
88 static std::string const degenerate3
89     = "POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,5 5,5 5,5 5))";
90 
91 
92 // Real-life examples
93 static std::string const county1
94     = "POLYGON((-111.700 41.200 ,-111.681388 41.181739 ,-111.682453 41.181506 ,-111.684052 41.180804 ,-111.685295 41.180538 ,-111.686318 41.180776 ,-111.687517 41.181416 ,-111.688982 41.181520 ,-111.690670 41.181523 ,-111.692135 41.181460 ,-111.693646 41.182034 ,-111.695156 41.182204 ,-111.696489 41.182274 ,-111.697775 41.182075 ,-111.698974 41.181539 ,-111.700485 41.182348 ,-111.701374 41.182955 ,-111.700 41.200))";
95 
96 //static std::string const invalid_parcel
97 //    =  "POLYGON((116042.20 464335.07,116056.35 464294.59,116066.41 464264.16,116066.44 464264.09,116060.35 464280.93,116028.89 464268.43,116028.89 464268.44,116024.74 464280.7,116018.91 464296.71,116042.2 464335.07))";
98 
99 static std::string const parcel1
100     = "POLYGON((225343.489 585110.376,225319.123 585165.731,225323.497 585167.287,225323.134 585167.157,225313.975 585169.208,225321.828 585172,225332.677 585175.83,225367.032 585186.977,225401.64 585196.671,225422.799 585201.029,225429.784 585202.454,225418.859 585195.112,225423.803 585196.13,225425.389 585196.454,225397.027 585165.48,225363.802 585130.372,225354.086 585120.261,225343.489 585110.376))";
101 static std::string const parcel2
102     = "POLYGON((173356.986490154 605912.122380707,173358.457939143 605902.891897507,173358.458257372 605902.889901239,173214.162964795 605901.13020255,173214.162746654 605901.132200038,173213.665 605905.69,173212.712441616 605913.799985923,173356.986490154 605912.122380707))";
103 static std::string const parcel3
104     = "POLYGON((120528.56 462115.62,120533.4 462072.1,120533.4 462072.01,120533.39 462071.93,120533.36 462071.86,120533.33 462071.78,120533.28 462071.72,120533.22 462071.66,120533.15 462071.61,120533.08 462071.58,120533 462071.55,120532.92 462071.54,120467.68 462068.66,120468.55 462059.04,120517.39 462062.87,120517.47 462062.87,120517.55 462062.86,120517.62 462062.83,120517.69 462062.79,120517.76 462062.74,120517.81 462062.68,120517.86 462062.62,120517.89 462062.55,120517.92 462062.47,120530.49 461998.63,120530.5 461998.55,120530.49 461998.47,120530.47 461998.39,120530.44 461998.31,120530.4 461998.24,120530.35 461998.18,120530.28 461998.13,120530.21 461998.09,120530.13 461998.06,120482.19 461984.63,120485 461963.14,120528.2 461950.66,120528.28 461950.63,120528.35 461950.59,120528.42 461950.53,120528.47 461950.47,120528.51 461950.4,120528.54 461950.32,120528.56 461950.24,120528.56 461950.15,120528.55 461950.07,120528.53 461949.99,120528.49 461949.92,120528.44 461949.85,120497.49 461915.03,120497.43 461914.98,120497.37 461914.93,120497.3 461914.9,120497.23 461914.88,120497.15 461914.86,120424.61 461910.03,120424.53 461910.03,120424.45 461910.05,120424.37 461910.07,120424.3 461910.11,120424.24 461910.16,120424.18 461910.22,120424.14 461910.29,120424.11 461910.37,120424.09 461910.45,120424.08 461910.53,120424.08 461967.59,120424.08 461967.67,120424.1 461967.75,120424.14 461967.82,120424.18 461967.89,120424.23 461967.95,120424.3 461968,120424.37 461968.04,120424.44 461968.07,120424.52 461968.09,120473.31 461973.83,120469.63 461993.16,120399.48 461986.43,120399.4 461986.43,120399.32 461986.44,120399.25 461986.47,120399.17 461986.5,120399.11 461986.55,120399.05 461986.61,120399.01 461986.67,120398.97 461986.74,120398.95 461986.82,120398.93 461986.9,120394.1 462057.5,120394.1 462057.58,120394.11 462057.66,120394.14 462057.74,120394.18 462057.81,120394.23 462057.87,120394.29 462057.93,120394.35 462057.97,120394.43 462058,120394.5 462058.03,120394.58 462058.03,120458.74 462059.95,120455.16 462072.48,120396.57 462067.68,120396.49 462067.68,120396.4 462067.69,120396.32 462067.72,120396.25 462067.76,120396.18 462067.82,120396.13 462067.88,120396.08 462067.96,120396.05 462068.04,120396.03 462068.12,120392.17 462103.9,120392.16 462103.99,120392.18 462104.07,120392.2 462104.15,120392.24 462104.22,120392.29 462104.29,120392.35 462104.35,120392.42 462104.4,120392.5 462104.43,120392.58 462104.45,120392.66 462104.46,120393.63 462104.46,120393.63 462103.46,120393.22 462103.46,120396.98 462068.71,120455.49 462073.51,120455.57 462073.51,120455.66 462073.49,120455.74 462073.46,120455.81 462073.42,120455.88 462073.37,120455.93 462073.3,120455.98 462073.23,120456.01 462073.15,120459.88 462059.61,120459.89 462059.52,120459.9 462059.44,120459.88 462059.36,120459.86 462059.28,120459.82 462059.21,120459.77 462059.14,120459.72 462059.08,120459.65 462059.04,120459.57 462059,120459.49 462058.98,120459.41 462058.97,120395.13 462057.05,120399.9 461987.48,120469.99 461994.2,120470.07 461994.2,120470.15 461994.19,120470.23 461994.16,120470.3 461994.13,120470.37 461994.08,120470.42 461994.02,120470.47 461993.95,120470.5 461993.88,120470.53 461993.8,120474.4 461973.48,120474.4 461973.4,120474.4 461973.32,120474.38 461973.24,120474.35 461973.16,120474.31 461973.09,120474.25 461973.03,120474.19 461972.98,120474.12 461972.94,120474.04 461972.91,120473.96 461972.9,120425.08 461967.14,120425.08 461911.06,120496.88 461915.85,120527.16 461949.92,120484.4 461962.27,120484.33 461962.3,120484.25 461962.35,120484.19 461962.4,120484.14 461962.46,120484.09 461962.53,120484.06 461962.61,120484.05 461962.69,120481.14 461984.93,120481.14 461985.01,120481.15 461985.09,120481.17 461985.17,120481.2 461985.24,120481.25 461985.31,120481.3 461985.36,120481.36 461985.41,120481.43 461985.45,120481.51 461985.48,120529.42 461998.9,120517.02 462061.84,120468.14 462058,120468.05 462058,120467.97 462058.02,120467.89 462058.05,120467.81 462058.09,120467.75 462058.15,120467.69 462058.22,120467.65 462058.29,120467.62 462058.37,120467.6 462058.46,120466.64 462069.1,120466.63 462069.18,120466.65 462069.26,120466.67 462069.33,120466.71 462069.4,120466.76 462069.47,120466.81 462069.53,120466.88 462069.57,120466.95 462069.61,120467.03 462069.63,120467.11 462069.64,120532.34 462072.52,120527.62 462115.03,120391.73 462106.36,120391.66 462107.36,120528.03 462116.06,120528.12 462116.06,120528.2 462116.04,120528.28 462116.02,120528.35 462115.97,120528.42 462115.92,120528.47 462115.85,120528.51 462115.78,120528.54 462115.7,120528.56 462115.62))";
105 
106 static std::string const parcel3_bend // of parcel_3 - clipped
107     = "POLYGON((120399.40000152588 461986.43000030518, 120399.47999954224 461986.43000030518, 120403 461986.76769953477, 120403 461987.777217312, 120399.90000152588 461987.47999954224, 120399.72722010587 461990, 120398.71791817161 461990, 120398.93000030518 461986.90000152588, 120398.95000076294 461986.81999969482, 120398.9700012207 461986.74000167847, 120399.00999832153 461986.66999816895, 120399.04999923706 461986.61000061035, 120399.11000061035 461986.54999923706, 120399.16999816895 461986.5, 120399.25 461986.4700012207, 120399.31999969482 461986.43999862671, 120399.40000152588 461986.43000030518))";
108 
109 // Has concavety
110 static std::string const italy_part1
111     = "POLYGON ((1660000 5190000 , 1651702.9375 5167014.5, 1650311.34375 5167763.53125, 1643318.59375 5172188.15625, 1642488.03125 5172636.75, 1640818.25 5173802.75, 1640107.03125 5174511.21875, 1638931.9375 5176054.03125, 1638684.5625 5177095.75, 1660000 5190000))";
112 
113 // Did have a self-intersection without pretraverse
114 static std::string const italy_part2
115     = "POLYGON ((1792367.255086994031444 4724456.568442338146269,1909252.60910044144839 4777690.547005645930767,1817506.869651311077178 4621340.239452145062387,1740727.367822392610833 4604255.192098897881806,1783739.994550514500588 4682197.288425728678703,1786152.065277023706585 4682158.049781472422183,1788625.584362450055778 4681761.819279043003917,1790914.090454180026427 4681245.758200471289456,1792150.627357912017033 4680453.383482984267175,1792707.3361313669011 4680334.832171658985317,1795490.546040181070566 4681008.495863274671137,1800252.571217337390408 4684615.251035280525684,1800994.404303982388228 4685209.840326445177197,1801272.925669946707785 4685567.095846899785101,1802819.153397066518664 4688660.170577370561659,1804117.69525716942735 4692190.08131886087358,1804426.829483100911602 4693301.616071742959321,1805323.730620422400534 4697309.691134516149759,1805601.80670842458494 4699214.415976728312671,1805725.371343206381425 4702868.090166873298585,1805880.439393880078569 4708906.485807630233467,1805725.371343206381425 4710575.432937441393733,1805509.300211574882269 4710973.931955102831125,1805200.165985643398017 4711211.894124387763441,1802726.090302763739601 4711926.958936070092022,1799170.100488863186911 4713835.571500253863633,1798026.070081980666146 4714671.060250979848206,1792367.255086994031444 4724456.568442338146269))";
116 
117 // Did have a self-intersection for first flat/convex solution
118 static std::string const nl_part1
119     = "POLYGON ((471871.966884626832325 6683515.683521211147308,470695.876464393688366 6681756.129975977353752,469211.542374156008009 6679924.978601523675025,464542.357652322971262 6674631.078279769048095,463243.59315323777264 6673494.345109832473099,459502.033748187706806 6670774.304660517722368,452204.484529234410729 6666030.372161027044058,439990.287360413349234 6659313.515823394991457,434547.988775020290632 6657783.034025833010674,433867.715366783668287 6657685.311832630075514,433063.65468478546245 6657783.034025833010674,423725.285241116478574 6659758.338574352674186,422581.143514745577704 6660350.880751021206379,422333.791606202081311 6660844.461689073592424,421993.599242338153999 6662622.453031159006059,421993.599242338153999 6663363.130126810632646,422612.090333183819894 6667314.244697011075914,422241.062470370030496 6667759.324870104901493,421096.80942450783914 6668303.522556710988283,408449.802075482031796 6673245.655735924839973,401646.845354124438018 6675273.665065255947411,400842.895991614612285 6675372.844085373915732,400255.351719210040756 6675224.699206517077982,392370.258227849320974 6672455.311684883199632,391968.283546594379004 6672009.975794731639326,391875.554410762328189 6671219.573235900141299,391937.336728153284639 6670527.121663697995245,392122.906319305824582 6669933.841785561293364,392339.311409408226609 6667957.501854715868831,392308.475910458364524 6665733.178529324010015,391937.336728153284639 6665289.631341196596622,387793.802641845482867 6664449.731981083750725,385814.7647345236619 6664202.740090588107705,384268.648326894966885 6664300.5401631873101,382846.319193030707538 6664646.406163938343525,382289.610419573145919 6664943.560305980034173,377186.502322628628463 6668957.888622742146254,376352.608017096004914 6669834.728738470934331,376197.985244384559337 6670428.001423852518201,375548.658654586179182 6676313.056885857135057,375243.086652359867003 6687692.866469252854586,379228.324422756850254 6689778.692146780900657,391782.713955441897269 6694388.125634397380054,393885.427817036863416 6694487.537080916576087,395215.139134563156404 6694091.147844122722745,405171.999669074953999 6689084.665672835893929,414263.128523688821588 6684478.40333267301321,415778.298112876422238 6683439.398042757064104,416396.677884233708028 6683192.009851422160864,419025.042381353967357 6682597.809754087589681,429909.63955213711597 6681508.792763692326844,430497.183824544539675 6681656.873437026515603,440979.806314075656701 6686955.330480101518333,467325.344922157470137 6687797.546342735178769,468129.294284664443694 6687698.216345063410699,468747.785375512961764 6687450.699095219373703,469211.542374156008009 6687054.651439971290529,469489.952420631831046 6686707.835750493220985,471871.966884626832325 6683515.683521211147308))";
120 
121 static std::string const erode_triangle ="POLYGON((-262.6446228027343700 -261.9999389648437500, -261.0000000000000000 -262.0000000000000000, -261.0000915527343700 -262.5285644531250000, -262.6446228027343700 -261.9999389648437500))";
122 
123 static std::string const forming_uu_a ="POLYGON((0 0,0 10,5 6,10 10,10 0,5 4,0 0))";
124 static std::string const forming_uu_b ="POLYGON((0 0,0 10,5 6,10 10,10 0,5 4,0 0),(1.25 2.5, 4.25 5,1.25 7.5,1.25 5.5,2.25 5.0,1.25 4.5,1.25 2.5))";
125 
126 // Ticket 10398, fails at next distances ( /10.0 ):
127 // #1: 5,25,84
128 // #2: 5,13,45,49,60,62,66,73
129 // #3: 4,8,12,35,45,54
130 // #4: 6,19,21,23,30,43,45,66,78,91
131 
132 static std::string const ticket_10398_1
133     = "POLYGON((897866.5 6272518.7,897882.5 6272519.2,897882.6 6272519,897883.3 6272508.7,897883.5 6272505.5,897855 6272503.5,897852.4 6272505.6,897850.1 6272517.6,897860.8 6272518.5,897866.5 6272518.7))";
134 static std::string const ticket_10398_2
135     = "POLYGON((898882.3 6271337.3,898895.7 6271339.9,898898 6271328.3,898881.6 6271325.1,898879.3 6271336.7,898882.3 6271337.3))";
136 static std::string const ticket_10398_3
137     = "POLYGON((897558.7 6272055,897552.5 6272054.2,897552.5 6272053.7,897546.1 6272052.7,897545.6 6272057.7,897560.7 6272059.6,897560.9 6272055.3,897558.7 6272055))";
138 static std::string const ticket_10398_4
139     = "POLYGON((898563.3 6272366.9,898554.7 6272379.2,898559.7 6272382.3,898561.6 6272379.4,898568.7 6272369.1,898563.8 6272366.2,898563.3 6272366.9))";
140 
141 static std::string const ticket_10412
142     = "POLYGON((897747.8 6270564.3,897764.3 6270569.7,897776.5 6270529.5,897768.1 6270527.1,897767.6 6270529.4,897756.3 6270525.8,897745.8 6270522.3,897752 6270502.9,897749.7 6270502,897750.7 6270499.1,897751.8 6270498.6,897752.3 6270499.3,897754.6 6270497.9,897755.8 6270500.2,897766.8 6270494.1,897765.6 6270491.5,897768.3 6270490.5,897770.9 6270491.5,897770.2 6270494.6,897780.1 6270497.5,897781 6270494.6,897786.8 6270496.6,897790.8 6270482.5,897785.3 6270480.7,897785.9 6270478.2,897768.9 6270473.2,897768.1 6270475.8,897766.1 6270475.2,897758.7 6270479.2,897753.2 6270481.8,897751.9 6270479,897746.5 6270481.9,897748 6270484.6,897745.2 6270486.1,897743.9 6270483.3,897741.4 6270484.7,897742.6 6270487.3,897739.4 6270488.9,897738.3 6270486.3,897735.6 6270487.8,897733.1 6270496.8,897731.2 6270502.7,897732.4 6270503.2,897731.5 6270506.1,897730.3 6270505.7,897725.8 6270520.2,897726.8 6270520.7,897726 6270523,897728 6270523.7,897726.3 6270529.6,897742.8 6270534.5,897741.2 6270539.9,897751.4 6270543.4,897750.7 6270546.4,897753.2 6270547.2,897747.8 6270564.3))";
143 
144 static std::string const ticket_11580
145     = "POLYGON((14.02 474.96,14.02 494.96,14.022 494.96,14.022 486.24,14.02 474.96))";
146 
147 static std::string const issue_369
148     = "POLYGON((-0.0149622653 -0.0269554816,-0.0149539290 -0.0271028206,-0.0149470828 -0.0271355230,-0.0149622653 -0.0269554816))";
149 
150 static std::string const issue_555
151     = "POLYGON((100.0637755102041 100.0770239202989,100.0360264929713 100.1,100 100.1,0 100.1,-0.0999999999999943 100.1,-0.09999999999999432 100,-0.1000000000000014 0,-0.1000000000000014 -0.1000000000000014,-1.836970198721056e-17 -0.1000000000000014,100 -0.1000000000000014,100.0360264929713 -0.1000000000000012,100.0637755102041 -0.07702392029888726,101.1041649480706 0.7844145387331185,103.4026139046043 2.203948968996805,105.8748306243106 3.293026604107826,108.4735936784235 4.030845140790255,111.1492644962378 4.403311621418428,113.8507355037622 4.403311621418428,116.5264063215765 4.030845140790252,119.1251693756894 3.293026604107823,121.5973860953957 2.203948968996801,123.8958350519294 0.7844145387331167,124.9362244897959 -0.07702392029888117,124.9639735070287 -0.09999999999999432,125 -0.09999999999999432,135 -0.1000000000000014,135.1 -0.0999999999999943,135.1 0,135.1 100,135.1 100.1,135 100.1,125 100.1,124.9639735070287 100.1,124.9362244897959 100.0770239202989,123.8958350519294 99.21558546126688,121.5973860953958 97.7960510310032,119.1251693756894 96.70697339589218,116.5264063215765 95.96915485920975,113.8507355037622 95.59668837858158,111.1492644962378 95.59668837858158,108.4735936784235 95.96915485920975,105.8748306243106 96.70697339589218,103.4026139046043 97.7960510310032,101.1041649480706 99.21558546126688,100.0637755102041 100.0770239202989),(124.9 71.15855631858324,124.9 28.84144368141676,124.9 27.45166011926875,124.5057975806765 24.70018817664119,123.7253617444602 22.03243382063001,122.574469398775 19.50232706258395,121.0763864178284 17.16101529763987,119.2613973111302 15.0558293341122,117.1661930067267 13.22932657712651,114.8331291254269 11.71843070902665,112.3093697403817 10.55368525835367,109.6459339313539 9.758636146879443,106.8966644080684 9.349355696820595,104.1171390524456 9.33411772066918,101.3635473834475 9.7132302618644,100.0275510204082 10.0961298147011,100.014047339233 10.09999999999999,100 10.09999999999999,29.6 10.1,28.20533247460344 10.1,25.44438883273841 10.49696376664363,22.76804145044581 11.28281026239098,20.2307730424806 12.44154191878281,17.88423507675108 13.94957030080114,15.77619629938279 15.77619629938281,13.94957030080113 17.88423507675109,12.44154191878281 20.23077304248061,11.28281026239098 22.76804145044582,10.49696376664362 25.44438883273843,10.1 28.20533247460346,10.1 29.6,10.1 70.40000000000001,10.1 71.79466752539656,10.49696376664363 74.5556111672616,11.28281026239098 77.23195854955421,12.44154191878281 79.76922695751941,13.94957030080114 82.11576492324893,15.77619629938281 84.22380370061721,17.88423507675109 86.05042969919887,20.23077304248062 87.5584580812172,22.76804145044583 88.71718973760903,25.44438883273843 89.50303623335638,28.20533247460346 89.90000000000001,29.6 89.90000000000001,100 89.90000000000001,100.014047339233 89.90000000000001,100.0275510204082 89.9038701852989,101.3635473834475 90.2867697381356,104.1171390524456 90.66588227933082,106.8966644080684 90.6506443031794,109.6459339313539 90.24136385312056,112.3093697403817 89.44631474164633,114.8331291254269 88.28156929097335,117.1661930067267 86.77067342287347,119.2613973111302 84.94417066588778,121.0763864178284 82.83898470236012,122.574469398775 80.49767293741604,123.7253617444602 77.96756617936998,124.5057975806765 75.29981182335879,124.9 72.54833988073125,124.9 71.15855631858324))";
152 
153 // CCW Polygons not working in 1.56
154 static std::string const mysql_report_2014_10_24
155     = "POLYGON((0 0, 0 8, 8 8, 8 10, -10 10, -10 0, 0 0))";
156 static std::string const mysql_report_2014_10_28_1
157     = "POLYGON((0 0,10 10,0 8,0 0))";
158 static std::string const mysql_report_2014_10_28_2
159     = "POLYGON((1 1,10 10,0 8,1 1))";
160 static std::string const mysql_report_2014_10_28_3
161     = "POLYGON((2 2,8 2,8 8,2 8,2 2))";
162 
163 // Polygons having problems with negative distances in 1.57
164 static std::string const mysql_report_2015_02_17_1
165     = "POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4))";
166 static std::string const mysql_report_2015_02_17_2
167     = "POLYGON((0 0,0 10,10 10,10 0,0 0))";
168 static std::string const mysql_report_2015_02_17_3
169     = "POLYGON((10 10,10 20,20 20,20 10,10 10))";
170 
171 // Polygons causing assertion failure
172 static std::string const mysql_report_2015_07_05_0
173     = "POLYGON((0 0,0 30000,30000 20000,25000 0,0 0),(-11 3,4.99294e+306 1.78433e+307,15 -14,-11 3))";
174 static std::string const mysql_report_2015_07_05_1
175     = "POLYGON((9192 27876,128 4.5036e+15,-1 5,3 9,9192 27876),(-11 3,4.99294e+306 1.78433e+307,15 -14,-11 3))";
176 static std::string const mysql_report_2015_07_05_2
177     = "POLYGON((-15 -15,1.31128e+308 2.47964e+307,-20 -9,-15 -15),(11 -4,1.04858e+06 5.36871e+08,7.03687e+13 -1.15292e+18,-12 17,10284 -21812,11 -4),(-28066 -10001,2.19902e+12 3.35544e+07,8.80784e+306 1.04773e+308,1.42177e+308 1.6141e+308,-28066 -10001))";
178 static std::string const mysql_report_2015_07_05_3
179     = "POLYGON((-2.68435e+08 -12,27090 -14130,5.76461e+17 5.49756e+11,-2.68435e+08 -12),(2.68435e+08 65539,1.42845e+308 1.63164e+308,-1 -8,-4 10,2.68435e+08 65539),(13 17,8.79609e+12 -2.2518e+15,1.02101e+308 3.13248e+306,17868 780,5 -4,13 17),(-1 14,1.35905e+308 2.09331e+307,1.37439e+11 -2047,-1 14))";
180 static std::string const mysql_report_2015_07_05_4
181     = "POLYGON((2.19902e+12 524287,1.13649e+308 1.36464e+308,-10 -19,2.19902e+12 524287),(1.44115e+17 -1.09951e+12,-14 0,-4347 16243,1.44115e+17 -1.09951e+12))";
182 static std::string const mysql_report_2015_07_05_5
183     = "POLYGON((9 3,-8193 8.38861e+06,-2 -4,9 3),(-10 -2,32268 -2557,1.72036e+308 5.67867e+307,4.91634e+307 1.41031e+308,-2.68435e+08 -19,-10 -2),(-5 4,9.50167e+307 1.05883e+308,-422 -25737,-5 4))";
184 
185 // Versions without interiors
186 static std::string const mysql_report_2015_07_05_0_wi
187     = "POLYGON((0 0,0 30000,30000 20000,25000 0,0 0))";
188 static std::string const mysql_report_2015_07_05_1_wi
189     = "POLYGON((9192 27876,128 4.5036e+15,-1 5,3 9,9192 27876))";
190 static std::string const mysql_report_2015_07_05_2_wi
191     = "POLYGON((-15 -15,1.31128e+308 2.47964e+307,-20 -9,-15 -15))";
192 static std::string const mysql_report_2015_07_05_3_wi
193     = "POLYGON((-2.68435e+08 -12,27090 -14130,5.76461e+17 5.49756e+11,-2.68435e+08 -12))";
194 static std::string const mysql_report_2015_07_05_4_wi
195     = "POLYGON((2.19902e+12 524287,1.13649e+308 1.36464e+308,-10 -19,2.19902e+12 524287))";
196 static std::string const mysql_report_2015_07_05_5_wi
197     = "POLYGON((9 3,-8193 8.38861e+06,-2 -4,9 3))";
198 
199 class buffer_custom_side_strategy
200 {
201 public :
202     template
203     <
204         typename Point,
205         typename OutputRange,
206         typename DistanceStrategy
207     >
apply(Point const & input_p1,Point const & input_p2,bg::strategy::buffer::buffer_side_selector side,DistanceStrategy const & distance,OutputRange & output_range)208     static inline bg::strategy::buffer::result_code apply(
209                 Point const& input_p1, Point const& input_p2,
210                 bg::strategy::buffer::buffer_side_selector side,
211                 DistanceStrategy const& distance,
212                 OutputRange& output_range)
213     {
214         // Generate a block along (left or right of) the segment
215 
216         double const dx = bg::get<0>(input_p2) - bg::get<0>(input_p1);
217         double const dy = bg::get<1>(input_p2) - bg::get<1>(input_p1);
218 
219         // For normalization [0,1] (=dot product d.d, sqrt)
220         double const length = bg::math::sqrt(dx * dx + dy * dy);
221 
222         if (bg::math::equals(length, 0))
223         {
224             return bg::strategy::buffer::result_no_output;
225         }
226 
227         // Generate the perpendicular p, to the left (ccw), and use an adapted distance
228         double const d = 1.1 * distance.apply(input_p1, input_p2, side);
229         double const px = d * -dy / length;
230         double const py = d * dx / length;
231 
232         output_range.resize(2);
233 
234         bg::set<0>(output_range.front(), bg::get<0>(input_p1) + px);
235         bg::set<1>(output_range.front(), bg::get<1>(input_p1) + py);
236         bg::set<0>(output_range.back(), bg::get<0>(input_p2) + px);
237         bg::set<1>(output_range.back(), bg::get<1>(input_p2) + py);
238 
239         return bg::strategy::buffer::result_normal;
240     }
241 };
242 
243 
244 template <bool Clockwise, typename P>
test_all()245 void test_all()
246 {
247     typedef bg::model::polygon<P, Clockwise, true> polygon_type;
248 
249     bg::strategy::buffer::join_miter join_miter(10.0);
250     bg::strategy::buffer::join_round join_round(100);
251     bg::strategy::buffer::join_round join_round_rough(12);
252     bg::strategy::buffer::end_flat end_flat;
253     bg::strategy::buffer::end_round end_round(100);
254 
255     test_one<polygon_type, polygon_type>("simplex", simplex, join_round, end_flat, 47.9408, 1.5);
256     test_one<polygon_type, polygon_type>("simplex", simplex, join_miter, end_flat, 52.8733, 1.5);
257 
258     test_one<polygon_type, polygon_type>("simplex", simplex, join_round, end_flat, 7.04043, -0.5);
259     test_one<polygon_type, polygon_type>("simplex", simplex, join_miter, end_flat, 7.04043, -0.5);
260 
261     test_one<polygon_type, polygon_type>("square_simplex", square_simplex, join_round, end_flat, 14.0639, 1.5);
262     test_one<polygon_type, polygon_type>("square_simplex", square_simplex, join_miter, end_flat, 16.0000, 1.5);
263 
264     test_one<polygon_type, polygon_type>("square_simplex01", square_simplex, join_miter, end_flat, 0.6400, -0.1);
265     test_one<polygon_type, polygon_type>("square_simplex04", square_simplex, join_miter, end_flat, 0.0400, -0.4);
266     test_one<polygon_type, polygon_type>("square_simplex05", square_simplex, join_miter, end_flat, 0.0, -0.5);
267     test_one<polygon_type, polygon_type>("square_simplex06", square_simplex, join_miter, end_flat, 0.0, -0.6);
268 
269     test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_round, end_flat, 14.5616, 0.5);
270     test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_miter, end_flat, 16.3861, 0.5);
271 
272     test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_round, end_flat, 0.777987, -0.5);
273     test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_miter, end_flat, 0.724208, -0.5);
274 
275     test_one<polygon_type, polygon_type>("concave_b10", concave_b, join_miter, end_flat, 836.9106, 10.0);
276     test_one<polygon_type, polygon_type>("concave_b25", concave_b, join_miter, end_flat, 4386.6479, 25.0);
277     test_one<polygon_type, polygon_type>("concave_b50", concave_b, join_miter, end_flat, 16487.2000, 50.0);
278     test_one<polygon_type, polygon_type>("concave_b75", concave_b, join_miter, end_flat, 36318.1506, 75.0);
279     test_one<polygon_type, polygon_type>("concave_b100", concave_b, join_miter, end_flat, 63879.5186, 100.0);
280 
281     test_one<polygon_type, polygon_type>("concave_b10", concave_b, join_round, end_flat, 532.2875, 10.0);
282     test_one<polygon_type, polygon_type>("concave_b25", concave_b, join_round, end_flat, 2482.8329, 25.0);
283     test_one<polygon_type, polygon_type>("concave_b50", concave_b, join_round, end_flat, 8872.9719, 50.0);
284     test_one<polygon_type, polygon_type>("concave_b75", concave_b, join_round, end_flat, 19187.5490, 75.0);
285     test_one<polygon_type, polygon_type>("concave_b100", concave_b, join_round, end_flat, 33426.6139, 100.0);
286 
287     test_one<polygon_type, polygon_type>("concave_b_rough_10", concave_b, join_round_rough, end_flat, 520.312, 10.0);
288     test_one<polygon_type, polygon_type>("concave_b_rough_25", concave_b, join_round_rough, end_flat, 2409.384, 25.0);
289     test_one<polygon_type, polygon_type>("concave_b_rough_50", concave_b, join_round_rough, end_flat, 8586.812, 50.0);
290     test_one<polygon_type, polygon_type>("concave_b_rough_75", concave_b, join_round_rough, end_flat, 18549.018, 75.0);
291     test_one<polygon_type, polygon_type>("concave_b_rough_100", concave_b, join_round_rough, end_flat, 32295.917, 100.0);
292 
293     test_one<polygon_type, polygon_type>("spike_simplex15", spike_simplex, join_round, end_round, 50.3633, 1.5);
294     test_one<polygon_type, polygon_type>("spike_simplex15", spike_simplex, join_miter, end_flat, 51.5509, 1.5);
295     test_one<polygon_type, polygon_type>("spike_simplex30", spike_simplex, join_round, end_round, 100.9199, 3.0);
296     test_one<polygon_type, polygon_type>("spike_simplex30", spike_simplex, join_miter, end_flat, 106.6979, 3.0);
297     test_one<polygon_type, polygon_type>("spike_simplex150", spike_simplex, join_round, end_round, 998.9821, 15.0);
298     test_one<polygon_type, polygon_type>("spike_simplex150", spike_simplex, join_miter, end_flat, 1428.1560, 15.0);
299 
300     test_one<polygon_type, polygon_type>("join_types", join_types, join_round, end_flat, 88.2060, 1.5);
301 
302     test_one<polygon_type, polygon_type>("chained_box", chained_box, join_round, end_flat, 83.1403, 1.0);
303     test_one<polygon_type, polygon_type>("chained_box", chained_box, join_miter, end_flat, 84, 1.0);
304     test_one<polygon_type, polygon_type>("L", letter_L, join_round, end_flat, 13.7314, 0.5);
305     test_one<polygon_type, polygon_type>("L", letter_L, join_miter, end_flat, 14.0, 0.5);
306 
307     test_one<polygon_type, polygon_type>("chained_box", chained_box, join_miter, end_flat, 84, 1.0);
308     test_one<polygon_type, polygon_type>("chained_box", chained_box, join_round, end_flat, 83.1403, 1.0);
309 
310     test_one<polygon_type, polygon_type>("indentation4", indentation, join_miter, end_flat, 25.7741, 0.4);
311     test_one<polygon_type, polygon_type>("indentation4", indentation, join_round, end_flat, 25.5695, 0.4);
312     test_one<polygon_type, polygon_type>("indentation5", indentation, join_miter, end_flat, 28.2426, 0.5);
313     test_one<polygon_type, polygon_type>("indentation5", indentation, join_round, end_flat, 27.9953, 0.5);
314     test_one<polygon_type, polygon_type>("indentation6", indentation, join_miter, end_flat, 30.6712, 0.6);
315 
316     // SQL Server gives 30.34479159164
317     test_one<polygon_type, polygon_type>("indentation6", indentation, join_round, end_flat, 30.3445, 0.6);
318 
319     test_one<polygon_type, polygon_type>("indentation7", indentation, join_miter, end_flat, 33.0958, 0.7);
320     test_one<polygon_type, polygon_type>("indentation7", indentation, join_round, end_flat, 32.6533, 0.7);
321 
322     test_one<polygon_type, polygon_type>("indentation8", indentation, join_miter, end_flat, 35.5943, 0.8);
323     test_one<polygon_type, polygon_type>("indentation8", indentation, join_round, end_flat, 35.0164, 0.8);
324     test_one<polygon_type, polygon_type>("indentation12", indentation, join_miter, end_flat, 46.3541, 1.2);
325     test_one<polygon_type, polygon_type>("indentation12", indentation, join_round, end_flat, 45.0537, 1.2);
326 
327     // Indentation - deflated
328     test_one<polygon_type, polygon_type>("indentation4", indentation, join_miter, end_flat, 6.991, -0.4);
329     test_one<polygon_type, polygon_type>("indentation4", indentation, join_round, end_flat, 7.255, -0.4);
330     test_one<polygon_type, polygon_type>("indentation8", indentation, join_miter, end_flat, 1.369, -0.8);
331     test_one<polygon_type, polygon_type>("indentation8", indentation, join_round, end_flat, 1.374, -0.8);
332     test_one<polygon_type, polygon_type>("indentation12", indentation, join_miter, end_flat, 0, -1.2);
333     test_one<polygon_type, polygon_type>("indentation12", indentation, join_round, end_flat, 0, -1.2);
334 
335     test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_miter, end_flat, 53.648, 0.6);
336     test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_round, end_flat, 52.820, 0.6);
337     test_one<polygon_type, polygon_type>("donut_simplex8", donut_simplex, join_miter, end_flat, 61.132, 0.8);
338     test_one<polygon_type, polygon_type>("donut_simplex8", donut_simplex, join_round, end_flat, 59.6713, 0.8);
339     test_one<polygon_type, polygon_type>("donut_simplex10", donut_simplex, join_miter, end_flat, 68.670, 1.0);
340     test_one<polygon_type, polygon_type>("donut_simplex10", donut_simplex, join_round, end_flat, 66.387, 1.0);
341     test_one<polygon_type, polygon_type>("donut_simplex12", donut_simplex, join_miter, end_flat, 76.605, 1.2);
342     test_one<polygon_type, polygon_type>("donut_simplex12", donut_simplex, join_round, end_flat, 73.3179, 1.2);
343     test_one<polygon_type, polygon_type>("donut_simplex14", donut_simplex, join_miter, end_flat, 84.974, 1.4);
344     test_one<polygon_type, polygon_type>("donut_simplex14", donut_simplex, join_round, end_flat, 80.500, 1.4);
345     test_one<polygon_type, polygon_type>("donut_simplex16", donut_simplex, join_miter, end_flat, 93.777, 1.6);
346     test_one<polygon_type, polygon_type>("donut_simplex16", donut_simplex, join_round, end_flat, 87.933, 1.6);
347 
348     test_one<polygon_type, polygon_type>("donut_simplex3", donut_simplex, join_miter, end_flat, 19.7636, -0.3);
349     test_one<polygon_type, polygon_type>("donut_simplex3", donut_simplex, join_round, end_flat, 19.8861, -0.3);
350     test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_miter, end_flat, 12.8920, -0.6);
351     test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_round, end_flat, 12.9157, -0.6);
352 
353     test_one<polygon_type, polygon_type>("donut_diamond1", donut_diamond, join_miter, end_flat, 280.0, 1.0);
354     test_one<polygon_type, polygon_type>("donut_diamond4", donut_diamond, join_miter, end_flat, 529.0, 4.0);
355     test_one<polygon_type, polygon_type>("donut_diamond5", donut_diamond, join_miter, end_flat, 625.0, 5.0);
356     test_one<polygon_type, polygon_type>("donut_diamond6", donut_diamond, join_miter, end_flat, 729.0, 6.0);
357 
358     test_one<polygon_type, polygon_type>("donut_diamond1", donut_diamond, join_miter, end_flat, 122.0417, -1.0);
359     test_one<polygon_type, polygon_type>("donut_diamond2", donut_diamond, join_miter, end_flat, 56.3750, -2.0);
360     test_one<polygon_type, polygon_type>("donut_diamond3", donut_diamond, join_miter, end_flat, 17.7084, -3.0);
361 
362     test_one<polygon_type, polygon_type>("arrow4", arrow, join_miter, end_flat, 28.265, 0.4);
363     test_one<polygon_type, polygon_type>("arrow4", arrow, join_round, end_flat, 27.039, 0.4);
364     test_one<polygon_type, polygon_type>("arrow5", arrow, join_miter, end_flat, 31.500, 0.5);
365     test_one<polygon_type, polygon_type>("arrow5", arrow, join_round, end_flat, 29.621, 0.5);
366     test_one<polygon_type, polygon_type>("arrow6", arrow, join_miter, end_flat, 34.903, 0.6);
367     test_one<polygon_type, polygon_type>("arrow6", arrow, join_round, end_flat, 32.268, 0.6);
368 
369     test_one<polygon_type, polygon_type>("tipped_aitch3", tipped_aitch, join_miter, end_flat, 55.36, 0.3);
370     test_one<polygon_type, polygon_type>("tipped_aitch9", tipped_aitch, join_miter, end_flat, 77.44, 0.9);
371     test_one<polygon_type, polygon_type>("tipped_aitch13", tipped_aitch, join_miter, end_flat, 92.16, 1.3);
372 
373     // SQL Server: 55.205415532967 76.6468846383224 90.642916957136
374     test_one<polygon_type, polygon_type>("tipped_aitch3", tipped_aitch, join_round, end_flat, 55.2053, 0.3);
375     test_one<polygon_type, polygon_type>("tipped_aitch9", tipped_aitch, join_round, end_flat, 76.6457, 0.9);
376     test_one<polygon_type, polygon_type>("tipped_aitch13", tipped_aitch, join_round, end_flat, 90.641, 1.3);
377 
378     test_one<polygon_type, polygon_type>("snake4", snake, join_miter, end_flat, 64.44, 0.4);
379     test_one<polygon_type, polygon_type>("snake5", snake, join_miter, end_flat, 72, 0.5);
380     test_one<polygon_type, polygon_type>("snake6", snake, join_miter, end_flat, 75.44, 0.6);
381     test_one<polygon_type, polygon_type>("snake16", snake, join_miter, end_flat, 114.24, 1.6);
382 
383     test_one<polygon_type, polygon_type>("funnelgate2", funnelgate, join_miter, end_flat, 120.982, 2.0);
384     test_one<polygon_type, polygon_type>("funnelgate3", funnelgate, join_miter, end_flat, 13.0*13.0, 3.0);
385     test_one<polygon_type, polygon_type>("funnelgate4", funnelgate, join_miter, end_flat, 15.0*15.0, 4.0);
386     test_one<polygon_type, polygon_type>("gammagate1", gammagate, join_miter, end_flat, 88.0, 1.0);
387     test_one<polygon_type, polygon_type>("fork_a1", fork_a, join_miter, end_flat, 88.0, 1.0);
388     test_one<polygon_type, polygon_type>("fork_b1", fork_b, join_miter, end_flat, 154.0, 1.0);
389     test_one<polygon_type, polygon_type>("fork_c1", fork_c, join_miter, end_flat, 152.0, 1.0);
390     test_one<polygon_type, polygon_type>("triangle", triangle, join_miter, end_flat, 14.6569, 1.0);
391 
392     test_one<polygon_type, polygon_type>("degenerate0", degenerate0, join_round, end_round, 0.0, 1.0);
393     test_one<polygon_type, polygon_type>("degenerate1", degenerate1, join_round, end_round, 3.1389, 1.0);
394     test_one<polygon_type, polygon_type>("degenerate2", degenerate2, join_round, end_round, 3.1389, 1.0);
395     test_one<polygon_type, polygon_type>("degenerate3", degenerate3, join_round, end_round, 143.1395, 1.0);
396 
397     test_one<polygon_type, polygon_type>("gammagate2", gammagate, join_miter, end_flat, 130.0, 2.0);
398 
399     test_one<polygon_type, polygon_type>("flower1", flower, join_miter, end_flat, 67.614, 0.1);
400     test_one<polygon_type, polygon_type>("flower20", flower, join_miter, end_flat, 74.894, 0.20);
401     test_one<polygon_type, polygon_type>("flower25", flower, join_miter, end_flat, 78.226, 0.25);
402     test_one<polygon_type, polygon_type>("flower30", flower, join_miter, end_flat, 81.492, 0.30);
403     test_one<polygon_type, polygon_type>("flower35", flower, join_miter, end_flat, 84.694, 0.35);
404     test_one<polygon_type, polygon_type>("flower40", flower, join_miter, end_flat, 87.831, 0.40);
405     test_one<polygon_type, polygon_type>("flower45", flower, join_miter, end_flat, 90.902, 0.45);
406     test_one<polygon_type, polygon_type>("flower50", flower, join_miter, end_flat, 93.908, 0.50);
407     test_one<polygon_type, polygon_type>("flower55", flower, join_miter, end_flat, 96.849, 0.55);
408     test_one<polygon_type, polygon_type>("flower60", flower, join_miter, end_flat, 99.724, 0.60);
409 
410     test_one<polygon_type, polygon_type>("flower10", flower, join_round, end_flat, 67.486, 0.10);
411     test_one<polygon_type, polygon_type>("flower20", flower, join_round, end_flat, 74.702, 0.20);
412     test_one<polygon_type, polygon_type>("flower25", flower, join_round, end_flat, 78.071, 0.25);
413     test_one<polygon_type, polygon_type>("flower30", flower, join_round, end_flat, 81.352, 0.30);
414     test_one<polygon_type, polygon_type>("flower35", flower, join_round, end_flat, 84.547, 0.35);
415     test_one<polygon_type, polygon_type>("flower40", flower, join_round, end_flat, 87.665, 0.40);
416     test_one<polygon_type, polygon_type>("flower45", flower, join_round, end_flat, 90.709, 0.45);
417     test_one<polygon_type, polygon_type>("flower50", flower, join_round, end_flat, 93.680, 0.50);
418     test_one<polygon_type, polygon_type>("flower55", flower, join_round, end_flat, 96.580, 0.55);
419     test_one<polygon_type, polygon_type>("flower60", flower, join_round, end_flat, 99.408, 0.60);
420 
421     // Flower - deflated
422     test_one<polygon_type, polygon_type>("flower60", flower, join_round, end_flat, 19.3210, -0.60);
423 
424     // Saw
425     {
426         // SQL Server:
427         // 68.6258859984014 90.2254986930165 112.799509089077 136.392823913949 161.224547934625 187.427508982734
428         //215.063576036522 244.167935815974 274.764905445676 306.878264367143 340.530496138041 375.720107548269
429         int const n = 12;
430         double expected_round[n] =
431             {
432                 68.6252,  90.222, 112.792, 136.397, 161.230, 187.435,
433                 215.073, 244.179, 274.779, 306.894, 340.543, 375.734
434             };
435         double expected_miter[n] =
436             {
437                 70.7706,  98.804, 132.101, 170.661, 214.484, 263.57,
438                 317.92,  377.532, 442.408, 512.546, 587.948, 668.613
439             };
440 
441         for (int i = 1; i <= n; i++)
442         {
443             std::ostringstream out;
444             out << "saw_" << i;
445             test_one<polygon_type, polygon_type>(out.str(), saw, join_round, end_flat, expected_round[i - 1], double(i) / 2.0, ut_settings(0.1));
446             test_one<polygon_type, polygon_type>(out.str(), saw, join_miter, end_flat, expected_miter[i - 1], double(i) / 2.0);
447         }
448     }
449 
450     // Bowl
451     {
452         // SQL Server values - see query below.
453         //1 43.2425133175081 60.0257800296593 78.3497997564532 98.2145746255142 119.620102487345 142.482792724034
454         //2 166.499856911107 191.763334982583 218.446279387336 246.615018368511 276.300134755606 307.518458532186
455 
456         int const n = 12;
457         double expected_round[n] =
458             {
459                 43.2423,  60.025,  78.3477,  98.2109, 119.614, 142.487,
460                 166.505, 191.77, 218.455, 246.625, 276.312, 307.532
461             };
462         double expected_miter[n] =
463             {
464                 43.4895,  61.014,  80.5726,  102.166, 125.794, 151.374,
465                 178.599, 207.443, 237.904, 270.000, 304.0, 340.000
466             };
467 
468         for (int i = 1; i <= n; i++)
469         {
470             std::ostringstream out;
471             out << "bowl_" << i;
472             test_one<polygon_type, polygon_type>(out.str(), bowl, join_round, end_flat, expected_round[i - 1], double(i) / 2.0, ut_settings(0.1));
473             test_one<polygon_type, polygon_type>(out.str(), bowl, join_miter, end_flat, expected_miter[i - 1], double(i) / 2.0);
474         }
475     }
476 
477     {
478         ut_settings settings;
479         settings.use_ln_area = true;
480         test_one<polygon_type, polygon_type>("county1", county1, join_round, end_flat, 0.00114, 0.01, settings);
481         test_one<polygon_type, polygon_type>("county1", county1, join_miter, end_flat, 0.00133, 0.01, settings);
482         test_one<polygon_type, polygon_type>("county1", county1, join_round, end_flat, 3.94411e-05, -0.003, settings);
483         test_one<polygon_type, polygon_type>("county1", county1, join_miter, end_flat, 3.94301e-05, -0.003, settings);
484     }
485 
486     test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_round, end_flat, 7571.405, 10.0);
487     test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_miter, end_flat, 8207.453, 10.0);
488     test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_round, end_flat, 11648.111, 20.0);
489     test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_miter, end_flat, 14184.022, 20.0);
490     test_one<polygon_type, polygon_type>("parcel1_30", parcel1, join_round, end_flat, 16350.488, 30.0);
491     test_one<polygon_type, polygon_type>("parcel1_30", parcel1, join_miter, end_flat, 22417.799, 30.0);
492 
493     test_one<polygon_type, polygon_type>("parcel2_10", parcel2, join_round, end_flat, 5000.867, 10.0);
494     test_one<polygon_type, polygon_type>("parcel2_10", parcel2, join_miter, end_flat, 5091.122, 10.0);
495     test_one<polygon_type, polygon_type>("parcel2_20", parcel2, join_round, end_flat, 9049.673, 20.0);
496     test_one<polygon_type, polygon_type>("parcel2_20", parcel2, join_miter, end_flat, 9410.691, 20.0);
497     test_one<polygon_type, polygon_type>("parcel2_30", parcel2, join_round, end_flat, 13726.528, 30.0);
498     test_one<polygon_type, polygon_type>("parcel2_30", parcel2, join_miter, end_flat, 14535.232, 30.0);
499 
500     test_one<polygon_type, polygon_type>("parcel3_10", parcel3, join_round, end_flat, 19993.007, 10.0);
501     test_one<polygon_type, polygon_type>("parcel3_10", parcel3, join_miter, end_flat, 20024.558, 10.0, ut_settings(0.05)); // MSVC 14 reports 20024.51456, so we increase the tolerance
502     test_one<polygon_type, polygon_type>("parcel3_20", parcel3, join_round, end_flat, 34505.837, 20.0);
503     test_one<polygon_type, polygon_type>("parcel3_20", parcel3, join_miter, end_flat, 34633.261, 20.0);
504     test_one<polygon_type, polygon_type>("parcel3_30", parcel3, join_round, end_flat, 45262.452, 30.0);
505     test_one<polygon_type, polygon_type>("parcel3_30", parcel3, join_miter, end_flat, 45567.388, 30.0);
506 
507     test_one<polygon_type, polygon_type>("parcel3_bend_5", parcel3_bend, join_round, end_flat, 155.634, 5.0);
508     test_one<polygon_type, polygon_type>("parcel3_bend_10", parcel3_bend, join_round, end_flat, 458.454, 10.0);
509 
510     // These cases differ a bit based on point order, because piece generation is different in one corner. Tolerance is increased
511     test_one<polygon_type, polygon_type>("parcel3_bend_15", parcel3_bend, join_round, end_flat, 918.06, 15.0, ut_settings(0.25));
512     test_one<polygon_type, polygon_type>("parcel3_bend_20", parcel3_bend, join_round, end_flat, 1534.64, 20.0, ut_settings(0.25));
513 
514     // Parcel - deflated
515     test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_round, end_flat, 1571.9024, -10.0);
516     test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_miter, end_flat, 1473.7325, -10.0);
517     test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_round, end_flat, 209.3579, -20.0);
518     test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_miter, end_flat, 188.4224, -20.0);
519 
520     test_one<polygon_type, polygon_type>("nl_part1_2", nl_part1,
521         join_round, end_flat,  BG_IF_RESCALED(1848737356.991, 1848737292.653), -0.2 * 1000.0);
522     test_one<polygon_type, polygon_type>("nl_part1_5", nl_part1,
523         join_round, end_flat,  BG_IF_RESCALED(1775953811.679, 1775953824.799), -0.5 * 1000.0);
524 
525     test_one<polygon_type, polygon_type>("italy_part1_30", italy_part1,
526         join_round, end_flat,  BG_IF_RESCALED(5015638814.956, 5015638827.704), 30.0 * 1000.0);
527     test_one<polygon_type, polygon_type>("italy_part1_50", italy_part1,
528         join_round, end_flat, BG_IF_RESCALED(11363180044.822, 11363180033.564), 50.0 * 1000.0);
529     test_one<polygon_type, polygon_type>("italy_part1_60", italy_part1, join_round, end_flat, 15479097108.720, 60.0 * 1000.0);
530 
531     test_one<polygon_type, polygon_type>("italy_part2_5", italy_part2,
532         join_round, end_flat, BG_IF_RESCALED(12496082123.6245, 12496082120.9337444), 5 * 1000.0);
533 
534     {
535         ut_settings settings;
536         settings.set_test_validity(false);
537 
538         // Tickets
539         test_one<polygon_type, polygon_type>("ticket_10398_1_5", ticket_10398_1, join_miter, end_flat, 494.7192, 0.5, settings);
540         test_one<polygon_type, polygon_type>("ticket_10398_1_25", ticket_10398_1, join_miter, end_flat, 697.7798, 2.5, settings);
541         {
542             // qcc-arm reports 1470.79863681712281
543             ut_settings specific = settings;
544             specific.tolerance = 0.02;
545             test_one<polygon_type, polygon_type>("ticket_10398_1_84", ticket_10398_1, join_miter, end_flat, 1470.8096, 8.4, specific);
546         }
547 
548         test_one<polygon_type, polygon_type>("ticket_10398_2_45", ticket_10398_2, join_miter, end_flat, 535.4780, 4.5, settings);
549         test_one<polygon_type, polygon_type>("ticket_10398_2_62", ticket_10398_2, join_miter, end_flat, 705.2046, 6.2, settings);
550         test_one<polygon_type, polygon_type>("ticket_10398_2_73", ticket_10398_2, join_miter, end_flat, 827.3394, 7.3, settings);
551 
552         test_one<polygon_type, polygon_type>("ticket_10398_3_12", ticket_10398_3, join_miter, end_flat, 122.9443, 1.2, settings);
553         test_one<polygon_type, polygon_type>("ticket_10398_3_35", ticket_10398_3, join_miter, end_flat, 258.2729, 3.5, settings);
554         test_one<polygon_type, polygon_type>("ticket_10398_3_54", ticket_10398_3, join_miter, end_flat, 402.0571, 5.4, settings);
555 
556         test_one<polygon_type, polygon_type>("ticket_10398_4_30", ticket_10398_4, join_miter, end_flat, 257.9482, 3.0, settings);
557         test_one<polygon_type, polygon_type>("ticket_10398_4_66", ticket_10398_4, join_miter, end_flat, 553.0112, 6.6, settings);
558         test_one<polygon_type, polygon_type>("ticket_10398_4_91", ticket_10398_4, join_miter, end_flat, 819.1406, 9.1, settings);
559 
560         test_one<polygon_type, polygon_type>("ticket_10412", ticket_10412, join_miter, end_flat, 3109.6616, 1.5, settings);
561         test_one<polygon_type, polygon_type>("ticket_11580_100", ticket_11580, join_miter, end_flat, 52.0221000, 1.00, settings);
562     #if defined(BOOST_GEOMETRY_TEST_FAILURES)
563         // Larger distance, resulting in only one circle. Not solved yet in non-rescaled mode.
564         test_one<polygon_type, polygon_type>("ticket_11580_237", ticket_11580, join_miter, end_flat, 999.999, 2.37, settings);
565     #endif
566     }
567 
568     // Tickets - deflated
569     test_one<polygon_type, polygon_type>("ticket_10398_1_5", ticket_10398_1, join_miter, end_flat, 404.3936, -0.5);
570     test_one<polygon_type, polygon_type>("ticket_10398_1_25", ticket_10398_1, join_miter, end_flat, 246.7329, -2.5);
571 
572     {
573         // Test issue 369 as reported (1.15e-3) and some variants
574         // Use high tolerance because output areas are very small
575         const double distance = 1.15e-3;
576         const double join_distance = 0.1e-3;
577         const int points_per_circle = 2 * 3.1415 * distance / join_distance;
578 
579         ut_settings specific;
580         specific.use_ln_area = true;
581         specific.tolerance = 0.01;
582         bg::strategy::buffer::join_round jr(points_per_circle);
583         bg::strategy::buffer::end_round er(points_per_circle);
584         test_one<polygon_type, polygon_type>("issue_369", issue_369, jr, er, 4.566e-06, distance, specific);
585         test_one<polygon_type, polygon_type>("issue_369_10", issue_369, jr, er, 8.346e-08, distance / 10.0, specific);
586         test_one<polygon_type, polygon_type>("issue_369_100", issue_369, jr, er, 4.942e-09, distance / 100.0, specific);
587         test_one<polygon_type, polygon_type>("issue_369_1000", issue_369, jr, er, 7.881e-10, distance / 1000.0, specific);
588     }
589 
590     {
591         // Test issue 555 as reported (-0.000001) and some variants
592         bg::strategy::buffer::join_round jr(180);
593         bg::strategy::buffer::end_round er(180);
594 #if ! defined(BOOST_GEOMETRY_USE_RESCALING) || defined(BOOST_GEOMETRY_TEST_FAILURES)
595         // With rescaling the interior ring is missing
596         test_one<polygon_type, polygon_type>("issue_555", issue_555, jr, er, 4520.7942, -0.000001);
597 #endif
598         test_one<polygon_type, polygon_type>("issue_555", issue_555, jr, er, 4520.7957, +0.000001);
599         test_one<polygon_type, polygon_type>("issue_555_1000", issue_555, jr, er, 4521.6280, +0.001);
600         test_one<polygon_type, polygon_type>("issue_555_1000", issue_555, jr, er, 4519.9627, -0.001);
601     }
602 
603     {
604         bg::strategy::buffer::join_round join_round32(32);
605         bg::strategy::buffer::end_round end_round32(32);
606         test_one<polygon_type, polygon_type>("mysql_report_2014_10_24", mysql_report_2014_10_24,
607             join_round32, end_round32, 174.902, 1.0);
608         test_one<polygon_type, polygon_type>("mysql_report_2014_10_28_1", mysql_report_2014_10_28_1,
609             join_round32, end_round32, 75.46, 1.0);
610         test_one<polygon_type, polygon_type>("mysql_report_2014_10_28_2", mysql_report_2014_10_28_2,
611             join_round32, end_round32, 69.117, 1.0);
612         test_one<polygon_type, polygon_type>("mysql_report_2014_10_28_3", mysql_report_2014_10_28_3,
613             join_round32, end_round32, 63.121, 1.0);
614 
615         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d1",
616             mysql_report_2015_02_17_1,
617             join_round32, end_round32, 48.879, -1);
618         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d5",
619             mysql_report_2015_02_17_1,
620             join_round32, end_round32, 0.0, -5.0);
621         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d6",
622             mysql_report_2015_02_17_1,
623             join_round32, end_round32, 0.0, -6.0);
624         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d10",
625             mysql_report_2015_02_17_1,
626             join_round32, end_round32, 0.0, -10.0);
627 
628         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_2_d1",
629             mysql_report_2015_02_17_2,
630             join_round32, end_round32, 64.0, -1.0);
631         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_2_d10",
632             mysql_report_2015_02_17_2,
633             join_round32, end_round32, 0.0, -10.0);
634         test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_3_d1",
635             mysql_report_2015_02_17_3,
636             join_round32, end_round32, 64.0, -1.0);
637 
638         {
639             // These extreme testcases, containing huge coordinate differences
640             // and huge buffer distances, are to verify assertions.
641             // No assertions should be raised.
642 
643             // The buffers themselves are most often wrong. Versions
644             // without interior rings might be smaller (or have no output)
645             // then their versions with interior rings.
646 
647             // Therefore all checks on area, validity, self-intersections
648             // or having output at all are omitted.
649 
650             // Details (for versions with interior rings)
651             // Case 3 is reported as invalid
652             // On MinGW, also case 2 and 4 are reported as invalid
653             // On PowerPC, also case 1 is reported as invalid
654 
655             ut_settings settings = ut_settings::assertions_only();
656             const double no_area = ut_settings::ignore_area();
657 
658             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_0", mysql_report_2015_07_05_0,
659                 join_round32, end_round32, no_area, 6.0, settings);
660             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_1", mysql_report_2015_07_05_1,
661                 join_round32, end_round32, no_area, 6.0, settings);
662             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_2", mysql_report_2015_07_05_2,
663                 join_round32, end_round32, no_area, 549755813889.0, settings);
664             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_3", mysql_report_2015_07_05_3,
665                 join_round32, end_round32, no_area, 49316.0, settings);
666             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_4", mysql_report_2015_07_05_4,
667                 join_round32, end_round32, no_area, 1479986.0, settings);
668             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_5", mysql_report_2015_07_05_5,
669                 join_round32, end_round32, no_area, 38141.0, settings);
670 
671             // Versions without interior rings (area should be smaller but still no checks)
672             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_0_wi", mysql_report_2015_07_05_0_wi,
673                 join_round32, end_round32, no_area, 6.0, settings);
674             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_1_wi", mysql_report_2015_07_05_1_wi,
675                 join_round32, end_round32, no_area, 6.0, settings);
676             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_2_wi", mysql_report_2015_07_05_2_wi,
677                 join_round32, end_round32, no_area, 549755813889.0, settings);
678             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_3_wi", mysql_report_2015_07_05_3_wi,
679                 join_round32, end_round32, no_area, 49316.0, settings);
680             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_4_wi", mysql_report_2015_07_05_4_wi,
681                 join_round32, end_round32, no_area, 1479986.0, settings);
682             test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_5_wi", mysql_report_2015_07_05_5_wi,
683                 join_round32, end_round32, no_area, 38141.0, settings);
684         }
685     }
686 
687 
688     {
689         using bg::strategy::buffer::join_round;
690         using bg::strategy::buffer::join_miter;
691         bg::strategy::buffer::side_straight side_strategy;
692         bg::strategy::buffer::point_circle point_strategy;
693         typedef bg::strategy::buffer::distance_symmetric
694         <
695             typename bg::coordinate_type<P>::type
696         > distance;
697 
698         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j12",
699                 sharp_triangle,
700                 join_round(12), end_flat, distance(1.0), side_strategy, point_strategy,
701                 29.1604);
702         // Test very various number of points (min is 3)
703         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j2",
704                 sharp_triangle,
705                 join_round(2), end_flat, distance(1.0), side_strategy, point_strategy,
706                 27.2399);
707         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j5",
708                 sharp_triangle,
709                 join_round(5), end_flat, distance(1.0), side_strategy, point_strategy,
710                 28.8563);
711 
712         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j36",
713                 sharp_triangle,
714                 join_round(36), end_flat, distance(1.0), side_strategy, point_strategy,
715                 29.2482);
716         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j360",
717                 sharp_triangle,
718                 join_round(360), end_flat, distance(1.0), side_strategy, point_strategy,
719                 29.2659);
720 
721         // Test with various miter limits
722         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m2",
723                 sharp_triangle,
724                 join_miter(2), end_flat, distance(4.0), side_strategy, point_strategy,
725                 148.500);
726         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m3",
727                 sharp_triangle,
728                 join_miter(3), end_flat, distance(4.0), side_strategy, point_strategy,
729                 164.376);
730         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m4",
731                 sharp_triangle,
732                 join_miter(4), end_flat, distance(4.0), side_strategy, point_strategy,
733                 180.2529);
734         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m5",
735                 sharp_triangle,
736                 join_miter(5), end_flat, distance(4.0), side_strategy, point_strategy,
737                 196.1293);
738         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m25",
739                 sharp_triangle,
740                 join_miter(25), end_flat, distance(4.0), side_strategy, point_strategy,
741                 244.7471);
742 
743         // Right triangles, testing both points around sharp corner as well as points
744         // around right corners in join_round strategy
745         test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j3",
746                 right_triangle,
747                 join_round(3), end_flat, distance(1.0), side_strategy, point_strategy,
748                 53.0240);
749         test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j4",
750                 right_triangle,
751                 join_round(4), end_flat, distance(1.0), side_strategy, point_strategy,
752                 53.2492);
753         test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j5",
754                 right_triangle,
755                 join_round(5), end_flat, distance(1.0), side_strategy, point_strategy,
756                 53.7430);
757         test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j6",
758                 right_triangle,
759                 join_round(6), end_flat, distance(1.0), side_strategy, point_strategy,
760                 53.7430);
761 
762         buffer_custom_side_strategy custom_side_strategy;
763         test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_custom_side",
764                 sharp_triangle,
765                 join_round(49), end_flat, distance(1.0), custom_side_strategy, point_strategy,
766                 31.1087);
767     }
768 }
769 
770 template <bool Clockwise, typename P>
test_deflate_special_cases()771 void test_deflate_special_cases()
772 {
773     typedef bg::model::polygon<P, Clockwise, true> polygon_type;
774 
775     bg::strategy::buffer::join_miter join_miter(5);
776     bg::strategy::buffer::join_round join_round(8);
777     bg::strategy::buffer::end_flat end_flat;
778 
779     // This case fails for <float> because there is an IP formed at the border of the original
780     test_one<polygon_type, polygon_type>("erode_50", erode_triangle, join_miter, end_flat, 0, 0, 0.0, -0.50);
781     test_one<polygon_type, polygon_type>("erode_40", erode_triangle, join_miter, end_flat, 0, 0, 0.0, -0.40);
782     test_one<polygon_type, polygon_type>("erode_60", erode_triangle, join_miter, end_flat, 0, 0, 0.0, -0.60);
783 
784     // This case generates a uu-turn in deflate, at 1.0
785     test_one<polygon_type, polygon_type>("forming_uu_a_95", forming_uu_a, join_round, end_flat, 1, 0, 23.0516, -0.95);
786     test_one<polygon_type, polygon_type>("forming_uu_a_10", forming_uu_a, join_round, end_flat, 2, 0, 21.4606, -1.0);
787     test_one<polygon_type, polygon_type>("forming_uu_a_15", forming_uu_a, join_round, end_flat, 2, 0, 8.8272, -1.5);
788     test_one<polygon_type, polygon_type>("forming_uu_a_20", forming_uu_a, join_round, end_flat, 2, 0, 1.7588, -2.0);
789     test_one<polygon_type, polygon_type>("forming_uu_a_21", forming_uu_a, join_round, end_flat, 2, 0, 0.9944, -2.1);
790 
791     test_one<polygon_type, polygon_type>("forming_uu_b_25", forming_uu_b, join_round, end_flat, 1, 1, 38.4064, -0.25);
792     test_one<polygon_type, polygon_type>("forming_uu_b_50", forming_uu_b, join_round, end_flat, 1, 1, 24.4551, -0.50);
793     test_one<polygon_type, polygon_type>("forming_uu_b_95", forming_uu_b, join_round, end_flat, 1, 0, 11.5009, -0.95);
794     test_one<polygon_type, polygon_type>("forming_uu_b_10", forming_uu_b, join_round, end_flat, 1, 0, 10.7152, -1.0);
795     test_one<polygon_type, polygon_type>("forming_uu_b_15", forming_uu_b, join_round, end_flat,  1, 0, 4.4136, -1.5);
796 
797     test_one<polygon_type, polygon_type>("forming_uu_b_25", forming_uu_b, join_round, end_flat, 1, 1, 67.7139, 0.25);
798     test_one<polygon_type, polygon_type>("forming_uu_b_50", forming_uu_b, join_round, end_flat, 1, 1, 82.0260, 0.50);
799     test_one<polygon_type, polygon_type>("forming_uu_b_70", forming_uu_b, join_round, end_flat, 1, 3, 93.0760, 0.70);
800 
801     // From here on a/b have the same result
802     test_one<polygon_type, polygon_type>("forming_uu_a_10", forming_uu_a, join_round, end_flat, 1, 0, 108.0959, 1.0);
803     test_one<polygon_type, polygon_type>("forming_uu_b_10", forming_uu_b, join_round, end_flat, 1, 0, 108.0959, 1.0);
804 }
805 
806 template
807 <
808     typename InputPoint,
809     typename OutputPoint,
810     bool InputClockwise,
811     bool OutputClockwise,
812     bool InputClosed,
813     bool OutputClosed
814 >
test_mixed()815 void test_mixed()
816 {
817     typedef bg::model::polygon<InputPoint, InputClockwise, InputClosed> input_polygon_type;
818     typedef bg::model::polygon<OutputPoint, OutputClockwise, OutputClosed> output_polygon_type;
819 
820     bg::strategy::buffer::join_round join_round(12);
821     bg::strategy::buffer::end_flat end_flat;
822 
823     std::ostringstream name;
824     name << "mixed_" << std::boolalpha
825         << InputClockwise << "_" << OutputClockwise
826         << "_" << InputClosed << "_" << OutputClosed;
827 
828     test_one<input_polygon_type, output_polygon_type>(name.str(),
829             simplex, join_round, end_flat, 47.4831, 1.5);
830 }
831 
832 #ifdef HAVE_TTMATH
833 #include <ttmath_stub.hpp>
834 #endif
835 
test_main(int,char * [])836 int test_main(int, char* [])
837 {
838     BoostGeometryWriteTestConfiguration();
839 
840     typedef bg::model::point<default_test_type, 2, bg::cs::cartesian> dpoint;
841 
842     test_all<true, dpoint>();
843     test_deflate_special_cases<true, dpoint>();
844 
845 
846 #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_ORDER)
847     test_all<false, dpoint>();
848     test_deflate_special_cases<false, dpoint>();
849 #endif
850 
851 #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE)
852     typedef bg::model::point<float, 2, bg::cs::cartesian> fpoint;
853     test_deflate_special_cases<true, fpoint>();
854 
855     test_mixed<dpoint, dpoint, false, false, true, true>();
856     test_mixed<dpoint, dpoint, false, true, true, true>();
857     test_mixed<dpoint, dpoint, true, false, true, true>();
858     test_mixed<dpoint, dpoint, true, true, true, true>();
859 
860     test_mixed<dpoint, dpoint, false, false, false, true>();
861     test_mixed<dpoint, dpoint, false, true, false, true>();
862     test_mixed<dpoint, dpoint, true, false, false, true>();
863     test_mixed<dpoint, dpoint, true, true, false, true>();
864 
865 #ifdef HAVE_TTMATH
866     test_all<bg::model::point<tt, 2, bg::cs::cartesian> >();
867 #endif
868 
869 #endif
870 
871 #if defined(BOOST_GEOMETRY_TEST_FAILURES)
872     BoostGeometryWriteExpectedFailures(2, 1);
873 #endif
874 
875     return 0;
876 }
877