buffer_polygon.cpp 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Unit Test
  3. // Copyright (c) 2012-2019 Barend Gehrels, Amsterdam, the Netherlands.
  4. // This file was modified by Oracle on 2016, 2019.
  5. // Modifications copyright (c) 2016, Oracle and/or its affiliates.
  6. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  7. // Use, modification and distribution is subject to the Boost Software License,
  8. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. #include "test_buffer.hpp"
  11. static std::string const simplex
  12. = "POLYGON ((0 0,1 5,6 1,0 0))";
  13. static std::string const concave_simplex
  14. = "POLYGON ((0 0,3 5,3 3,5 3,0 0))";
  15. static std::string const concave_b
  16. = "POLYGON((0 10,5 15,6 13,8 11,0 10))";
  17. static std::string const square_simplex
  18. = "POLYGON ((0 0,0 1,1 1,1 0,0 0))";
  19. static std::string const spike_simplex
  20. = "POLYGON ((0 0,1 5,3 3,5 5,3 3,5 1,0 0))";
  21. static std::string const chained_box
  22. = "POLYGON((0 0,0 4,4 4,8 4,12 4,12 0,8 0,4 0,0 0))";
  23. static std::string const join_types
  24. = "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
  25. static std::string const donut_simplex
  26. = "POLYGON ((0 0,1 9,8 1,0 0),(1 1,4 1,1 4,1 1))";
  27. static std::string const donut_diamond
  28. = "POLYGON((15 0,15 15,30 15,30 0,15 0),(26 11,22 14,19 10,23 07,26 11))";
  29. static std::string const letter_L
  30. = "POLYGON ((0 0,0 4,1 4,1 1,3 1,3 0,0 0))";
  31. static std::string const indentation
  32. = "POLYGON ((0 0,0 5,4 5,4 4,3 3,2 4,2 1,3 2,4 1,4 0,0 0))";
  33. static std::string const funnelgate
  34. = "POLYGON((0 0,0 7,7 7,7 0,5 0,5 1,6 6,1 6,2 1,2 0,0 0))";
  35. static std::string const gammagate
  36. = "POLYGON((0 0,0 6,9 6,9 0,4 0,4 2,7 2,7 4,2 4,2 0,0 0))";
  37. static std::string const fork_a
  38. = "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))";
  39. static std::string const fork_b
  40. = "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))";
  41. static std::string const fork_c
  42. = "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))";
  43. static std::string const arrow
  44. = "POLYGON ((1 0,1 5,0.5 4.5,2 10,3.5 4.5,3 5,3 0,1 0))";
  45. static std::string const tipped_aitch
  46. = "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))";
  47. static std::string const snake
  48. = "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"
  49. ",5 5,7 5,7 6,1 6,1 5,4 5,4 2,1 2,1 1,6 1,6 0,0 0))";
  50. static std::string const church
  51. = "POLYGON ((0 0,0 3,2.999 3,3 8,3 0,0 0))";
  52. static std::string const flower
  53. = "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))";
  54. static std::string const saw
  55. = "POLYGON((1 3,1 8,1.5 6,5 8,5.5 6,9 8,9.5 6,13 8,13 3,1 3))";
  56. static std::string const bowl
  57. = "POLYGON((1 2,1 7,2 7,3 5,5 4,7 5,8 7,9 7,9 2,1 2))";
  58. // Triangle with segmented sides, closing point at longest side
  59. static std::string const triangle
  60. = "POLYGON((4 5,5 4,4 4,3 4,3 5,3 6,4 5))";
  61. // Triangle which caused acos in join_round to fail with larger side strategy
  62. static std::string const sharp_triangle
  63. = "POLYGON((2 0,3 8,4 0,2 0))";
  64. static std::string const right_triangle
  65. = "POLYGON((0 1,20 0,0 0,0 1))";
  66. static std::string const degenerate0
  67. = "POLYGON(())";
  68. static std::string const degenerate1
  69. = "POLYGON((5 5))";
  70. static std::string const degenerate2
  71. = "POLYGON((5 5,5 5,5 5,5 5))";
  72. static std::string const degenerate3
  73. = "POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,5 5,5 5,5 5))";
  74. // Real-life examples
  75. static std::string const county1
  76. = "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))";
  77. //static std::string const invalid_parcel
  78. // = "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))";
  79. static std::string const parcel1
  80. = "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))";
  81. static std::string const parcel2
  82. = "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))";
  83. static std::string const parcel3
  84. = "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))";
  85. static std::string const parcel3_bend // of parcel_3 - clipped
  86. = "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))";
  87. // Has concavety
  88. static std::string const italy_part1
  89. = "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))";
  90. // Did have a self-intersection for first flat/convex solution
  91. static std::string const nl_part1
  92. = "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))";
  93. static std::string const erode_triangle ="POLYGON((-262.6446228027343700 -261.9999389648437500, -261.0000000000000000 -262.0000000000000000, -261.0000915527343700 -262.5285644531250000, -262.6446228027343700 -261.9999389648437500))";
  94. static std::string const forming_uu_a ="POLYGON((0 0,0 10,5 6,10 10,10 0,5 4,0 0))";
  95. 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))";
  96. // Ticket 10398, fails at next distances ( /10.0 ):
  97. // #1: 5,25,84
  98. // #2: 5,13,45,49,60,62,66,73
  99. // #3: 4,8,12,35,45,54
  100. // #4: 6,19,21,23,30,43,45,66,78,91
  101. static std::string const ticket_10398_1
  102. = "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))";
  103. static std::string const ticket_10398_2
  104. = "POLYGON((898882.3 6271337.3,898895.7 6271339.9,898898 6271328.3,898881.6 6271325.1,898879.3 6271336.7,898882.3 6271337.3))";
  105. static std::string const ticket_10398_3
  106. = "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))";
  107. static std::string const ticket_10398_4
  108. = "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))";
  109. static std::string const ticket_10412
  110. = "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))";
  111. static std::string const ticket_11580
  112. = "POLYGON((14.02 474.96,14.02 494.96,14.022 494.96,14.022 486.24,14.02 474.96))";
  113. static std::string const issue_369
  114. = "POLYGON((-0.0149622653 -0.0269554816,-0.0149539290 -0.0271028206,-0.0149470828 -0.0271355230,-0.0149622653 -0.0269554816))";
  115. static std::string const issue_555
  116. = "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))";
  117. // CCW Polygons not working in 1.56
  118. static std::string const mysql_report_2014_10_24
  119. = "POLYGON((0 0, 0 8, 8 8, 8 10, -10 10, -10 0, 0 0))";
  120. static std::string const mysql_report_2014_10_28_1
  121. = "POLYGON((0 0,10 10,0 8,0 0))";
  122. static std::string const mysql_report_2014_10_28_2
  123. = "POLYGON((1 1,10 10,0 8,1 1))";
  124. static std::string const mysql_report_2014_10_28_3
  125. = "POLYGON((2 2,8 2,8 8,2 8,2 2))";
  126. // Polygons having problems with negative distances in 1.57
  127. static std::string const mysql_report_2015_02_17_1
  128. = "POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4))";
  129. static std::string const mysql_report_2015_02_17_2
  130. = "POLYGON((0 0,0 10,10 10,10 0,0 0))";
  131. static std::string const mysql_report_2015_02_17_3
  132. = "POLYGON((10 10,10 20,20 20,20 10,10 10))";
  133. // Polygons causing assertion failure
  134. static std::string const mysql_report_2015_07_05_0
  135. = "POLYGON((0 0,0 30000,30000 20000,25000 0,0 0),(-11 3,4.99294e+306 1.78433e+307,15 -14,-11 3))";
  136. static std::string const mysql_report_2015_07_05_1
  137. = "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))";
  138. static std::string const mysql_report_2015_07_05_2
  139. = "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))";
  140. static std::string const mysql_report_2015_07_05_3
  141. = "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))";
  142. static std::string const mysql_report_2015_07_05_4
  143. = "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))";
  144. static std::string const mysql_report_2015_07_05_5
  145. = "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))";
  146. // Versions without interiors
  147. static std::string const mysql_report_2015_07_05_0_wi
  148. = "POLYGON((0 0,0 30000,30000 20000,25000 0,0 0))";
  149. static std::string const mysql_report_2015_07_05_1_wi
  150. = "POLYGON((9192 27876,128 4.5036e+15,-1 5,3 9,9192 27876))";
  151. static std::string const mysql_report_2015_07_05_2_wi
  152. = "POLYGON((-15 -15,1.31128e+308 2.47964e+307,-20 -9,-15 -15))";
  153. static std::string const mysql_report_2015_07_05_3_wi
  154. = "POLYGON((-2.68435e+08 -12,27090 -14130,5.76461e+17 5.49756e+11,-2.68435e+08 -12))";
  155. static std::string const mysql_report_2015_07_05_4_wi
  156. = "POLYGON((2.19902e+12 524287,1.13649e+308 1.36464e+308,-10 -19,2.19902e+12 524287))";
  157. static std::string const mysql_report_2015_07_05_5_wi
  158. = "POLYGON((9 3,-8193 8.38861e+06,-2 -4,9 3))";
  159. class buffer_custom_side_strategy
  160. {
  161. public :
  162. template
  163. <
  164. typename Point,
  165. typename OutputRange,
  166. typename DistanceStrategy
  167. >
  168. static inline bg::strategy::buffer::result_code apply(
  169. Point const& input_p1, Point const& input_p2,
  170. bg::strategy::buffer::buffer_side_selector side,
  171. DistanceStrategy const& distance,
  172. OutputRange& output_range)
  173. {
  174. // Generate a block along (left or right of) the segment
  175. double const dx = bg::get<0>(input_p2) - bg::get<0>(input_p1);
  176. double const dy = bg::get<1>(input_p2) - bg::get<1>(input_p1);
  177. // For normalization [0,1] (=dot product d.d, sqrt)
  178. double const length = bg::math::sqrt(dx * dx + dy * dy);
  179. if (bg::math::equals(length, 0))
  180. {
  181. return bg::strategy::buffer::result_no_output;
  182. }
  183. // Generate the perpendicular p, to the left (ccw), and use an adapted distance
  184. double const d = 1.1 * distance.apply(input_p1, input_p2, side);
  185. double const px = d * -dy / length;
  186. double const py = d * dx / length;
  187. output_range.resize(2);
  188. bg::set<0>(output_range.front(), bg::get<0>(input_p1) + px);
  189. bg::set<1>(output_range.front(), bg::get<1>(input_p1) + py);
  190. bg::set<0>(output_range.back(), bg::get<0>(input_p2) + px);
  191. bg::set<1>(output_range.back(), bg::get<1>(input_p2) + py);
  192. return bg::strategy::buffer::result_normal;
  193. }
  194. };
  195. template <bool Clockwise, typename P>
  196. void test_all()
  197. {
  198. typedef bg::model::polygon<P, Clockwise, true> polygon_type;
  199. bg::strategy::buffer::join_miter join_miter(10.0);
  200. bg::strategy::buffer::join_round join_round(100);
  201. bg::strategy::buffer::join_round join_round_rough(12);
  202. bg::strategy::buffer::end_flat end_flat;
  203. bg::strategy::buffer::end_round end_round(100);
  204. test_one<polygon_type, polygon_type>("simplex", simplex, join_round, end_flat, 47.9408, 1.5);
  205. test_one<polygon_type, polygon_type>("simplex", simplex, join_miter, end_flat, 52.8733, 1.5);
  206. test_one<polygon_type, polygon_type>("simplex", simplex, join_round, end_flat, 7.04043, -0.5);
  207. test_one<polygon_type, polygon_type>("simplex", simplex, join_miter, end_flat, 7.04043, -0.5);
  208. test_one<polygon_type, polygon_type>("square_simplex", square_simplex, join_round, end_flat, 14.0639, 1.5);
  209. test_one<polygon_type, polygon_type>("square_simplex", square_simplex, join_miter, end_flat, 16.0000, 1.5);
  210. test_one<polygon_type, polygon_type>("square_simplex01", square_simplex, join_miter, end_flat, 0.6400, -0.1);
  211. test_one<polygon_type, polygon_type>("square_simplex04", square_simplex, join_miter, end_flat, 0.0400, -0.4);
  212. test_one<polygon_type, polygon_type>("square_simplex05", square_simplex, join_miter, end_flat, 0.0, -0.5);
  213. test_one<polygon_type, polygon_type>("square_simplex06", square_simplex, join_miter, end_flat, 0.0, -0.6);
  214. test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_round, end_flat, 14.5616, 0.5);
  215. test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_miter, end_flat, 16.3861, 0.5);
  216. test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_round, end_flat, 0.777987, -0.5);
  217. test_one<polygon_type, polygon_type>("concave_simplex", concave_simplex, join_miter, end_flat, 0.724208, -0.5);
  218. test_one<polygon_type, polygon_type>("concave_b10", concave_b, join_miter, end_flat, 836.9106, 10.0);
  219. test_one<polygon_type, polygon_type>("concave_b25", concave_b, join_miter, end_flat, 4386.6479, 25.0);
  220. test_one<polygon_type, polygon_type>("concave_b50", concave_b, join_miter, end_flat, 16487.2000, 50.0);
  221. test_one<polygon_type, polygon_type>("concave_b75", concave_b, join_miter, end_flat, 36318.1506, 75.0);
  222. test_one<polygon_type, polygon_type>("concave_b100", concave_b, join_miter, end_flat, 63879.5186, 100.0);
  223. test_one<polygon_type, polygon_type>("concave_b10", concave_b, join_round, end_flat, 532.2875, 10.0);
  224. test_one<polygon_type, polygon_type>("concave_b25", concave_b, join_round, end_flat, 2482.8329, 25.0);
  225. test_one<polygon_type, polygon_type>("concave_b50", concave_b, join_round, end_flat, 8872.9719, 50.0);
  226. test_one<polygon_type, polygon_type>("concave_b75", concave_b, join_round, end_flat, 19187.5490, 75.0);
  227. test_one<polygon_type, polygon_type>("concave_b100", concave_b, join_round, end_flat, 33426.6139, 100.0);
  228. test_one<polygon_type, polygon_type>("concave_b_rough_10", concave_b, join_round_rough, end_flat, 520.312, 10.0);
  229. test_one<polygon_type, polygon_type>("concave_b_rough_25", concave_b, join_round_rough, end_flat, 2409.384, 25.0);
  230. test_one<polygon_type, polygon_type>("concave_b_rough_50", concave_b, join_round_rough, end_flat, 8586.812, 50.0);
  231. test_one<polygon_type, polygon_type>("concave_b_rough_75", concave_b, join_round_rough, end_flat, 18549.018, 75.0);
  232. test_one<polygon_type, polygon_type>("concave_b_rough_100", concave_b, join_round_rough, end_flat, 32295.917, 100.0);
  233. test_one<polygon_type, polygon_type>("spike_simplex15", spike_simplex, join_round, end_round, 50.3633, 1.5);
  234. test_one<polygon_type, polygon_type>("spike_simplex15", spike_simplex, join_miter, end_flat, 51.5509, 1.5);
  235. test_one<polygon_type, polygon_type>("spike_simplex30", spike_simplex, join_round, end_round, 100.9199, 3.0);
  236. test_one<polygon_type, polygon_type>("spike_simplex30", spike_simplex, join_miter, end_flat, 106.6979, 3.0);
  237. test_one<polygon_type, polygon_type>("spike_simplex150", spike_simplex, join_round, end_round, 998.9821, 15.0);
  238. test_one<polygon_type, polygon_type>("spike_simplex150", spike_simplex, join_miter, end_flat, 1428.1560, 15.0);
  239. test_one<polygon_type, polygon_type>("join_types", join_types, join_round, end_flat, 88.2060, 1.5);
  240. test_one<polygon_type, polygon_type>("chained_box", chained_box, join_round, end_flat, 83.1403, 1.0);
  241. test_one<polygon_type, polygon_type>("chained_box", chained_box, join_miter, end_flat, 84, 1.0);
  242. test_one<polygon_type, polygon_type>("L", letter_L, join_round, end_flat, 13.7314, 0.5);
  243. test_one<polygon_type, polygon_type>("L", letter_L, join_miter, end_flat, 14.0, 0.5);
  244. test_one<polygon_type, polygon_type>("chained_box", chained_box, join_miter, end_flat, 84, 1.0);
  245. test_one<polygon_type, polygon_type>("chained_box", chained_box, join_round, end_flat, 83.1403, 1.0);
  246. test_one<polygon_type, polygon_type>("indentation4", indentation, join_miter, end_flat, 25.7741, 0.4);
  247. test_one<polygon_type, polygon_type>("indentation4", indentation, join_round, end_flat, 25.5695, 0.4);
  248. test_one<polygon_type, polygon_type>("indentation5", indentation, join_miter, end_flat, 28.2426, 0.5);
  249. test_one<polygon_type, polygon_type>("indentation5", indentation, join_round, end_flat, 27.9953, 0.5);
  250. test_one<polygon_type, polygon_type>("indentation6", indentation, join_miter, end_flat, 30.6712, 0.6);
  251. // SQL Server gives 30.34479159164
  252. test_one<polygon_type, polygon_type>("indentation6", indentation, join_round, end_flat, 30.3445, 0.6);
  253. test_one<polygon_type, polygon_type>("indentation7", indentation, join_miter, end_flat, 33.0958, 0.7);
  254. test_one<polygon_type, polygon_type>("indentation7", indentation, join_round, end_flat, 32.6533, 0.7);
  255. test_one<polygon_type, polygon_type>("indentation8", indentation, join_miter, end_flat, 35.5943, 0.8);
  256. test_one<polygon_type, polygon_type>("indentation8", indentation, join_round, end_flat, 35.0164, 0.8);
  257. test_one<polygon_type, polygon_type>("indentation12", indentation, join_miter, end_flat, 46.3541, 1.2);
  258. test_one<polygon_type, polygon_type>("indentation12", indentation, join_round, end_flat, 45.0537, 1.2);
  259. // Indentation - deflated
  260. test_one<polygon_type, polygon_type>("indentation4", indentation, join_miter, end_flat, 6.991, -0.4);
  261. test_one<polygon_type, polygon_type>("indentation4", indentation, join_round, end_flat, 7.255, -0.4);
  262. test_one<polygon_type, polygon_type>("indentation8", indentation, join_miter, end_flat, 1.369, -0.8);
  263. test_one<polygon_type, polygon_type>("indentation8", indentation, join_round, end_flat, 1.374, -0.8);
  264. test_one<polygon_type, polygon_type>("indentation12", indentation, join_miter, end_flat, 0, -1.2);
  265. test_one<polygon_type, polygon_type>("indentation12", indentation, join_round, end_flat, 0, -1.2);
  266. test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_miter, end_flat, 53.648, 0.6);
  267. test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_round, end_flat, 52.820, 0.6);
  268. test_one<polygon_type, polygon_type>("donut_simplex8", donut_simplex, join_miter, end_flat, 61.132, 0.8);
  269. test_one<polygon_type, polygon_type>("donut_simplex8", donut_simplex, join_round, end_flat, 59.6713, 0.8);
  270. test_one<polygon_type, polygon_type>("donut_simplex10", donut_simplex, join_miter, end_flat, 68.670, 1.0);
  271. test_one<polygon_type, polygon_type>("donut_simplex10", donut_simplex, join_round, end_flat, 66.387, 1.0);
  272. test_one<polygon_type, polygon_type>("donut_simplex12", donut_simplex, join_miter, end_flat, 76.605, 1.2);
  273. test_one<polygon_type, polygon_type>("donut_simplex12", donut_simplex, join_round, end_flat, 73.3179, 1.2);
  274. test_one<polygon_type, polygon_type>("donut_simplex14", donut_simplex, join_miter, end_flat, 84.974, 1.4);
  275. test_one<polygon_type, polygon_type>("donut_simplex14", donut_simplex, join_round, end_flat, 80.500, 1.4);
  276. test_one<polygon_type, polygon_type>("donut_simplex16", donut_simplex, join_miter, end_flat, 93.777, 1.6);
  277. test_one<polygon_type, polygon_type>("donut_simplex16", donut_simplex, join_round, end_flat, 87.933, 1.6);
  278. test_one<polygon_type, polygon_type>("donut_simplex3", donut_simplex, join_miter, end_flat, 19.7636, -0.3);
  279. test_one<polygon_type, polygon_type>("donut_simplex3", donut_simplex, join_round, end_flat, 19.8861, -0.3);
  280. test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_miter, end_flat, 12.8920, -0.6);
  281. test_one<polygon_type, polygon_type>("donut_simplex6", donut_simplex, join_round, end_flat, 12.9157, -0.6);
  282. test_one<polygon_type, polygon_type>("donut_diamond1", donut_diamond, join_miter, end_flat, 280.0, 1.0);
  283. test_one<polygon_type, polygon_type>("donut_diamond4", donut_diamond, join_miter, end_flat, 529.0, 4.0);
  284. test_one<polygon_type, polygon_type>("donut_diamond5", donut_diamond, join_miter, end_flat, 625.0, 5.0);
  285. test_one<polygon_type, polygon_type>("donut_diamond6", donut_diamond, join_miter, end_flat, 729.0, 6.0);
  286. test_one<polygon_type, polygon_type>("donut_diamond1", donut_diamond, join_miter, end_flat, 122.0417, -1.0);
  287. test_one<polygon_type, polygon_type>("donut_diamond2", donut_diamond, join_miter, end_flat, 56.3750, -2.0);
  288. test_one<polygon_type, polygon_type>("donut_diamond3", donut_diamond, join_miter, end_flat, 17.7084, -3.0);
  289. test_one<polygon_type, polygon_type>("arrow4", arrow, join_miter, end_flat, 28.265, 0.4);
  290. test_one<polygon_type, polygon_type>("arrow4", arrow, join_round, end_flat, 27.039, 0.4);
  291. test_one<polygon_type, polygon_type>("arrow5", arrow, join_miter, end_flat, 31.500, 0.5);
  292. test_one<polygon_type, polygon_type>("arrow5", arrow, join_round, end_flat, 29.621, 0.5);
  293. test_one<polygon_type, polygon_type>("arrow6", arrow, join_miter, end_flat, 34.903, 0.6);
  294. test_one<polygon_type, polygon_type>("arrow6", arrow, join_round, end_flat, 32.268, 0.6);
  295. test_one<polygon_type, polygon_type>("tipped_aitch3", tipped_aitch, join_miter, end_flat, 55.36, 0.3);
  296. test_one<polygon_type, polygon_type>("tipped_aitch9", tipped_aitch, join_miter, end_flat, 77.44, 0.9);
  297. test_one<polygon_type, polygon_type>("tipped_aitch13", tipped_aitch, join_miter, end_flat, 92.16, 1.3);
  298. // SQL Server: 55.205415532967 76.6468846383224 90.642916957136
  299. test_one<polygon_type, polygon_type>("tipped_aitch3", tipped_aitch, join_round, end_flat, 55.2053, 0.3);
  300. test_one<polygon_type, polygon_type>("tipped_aitch9", tipped_aitch, join_round, end_flat, 76.6457, 0.9);
  301. test_one<polygon_type, polygon_type>("tipped_aitch13", tipped_aitch, join_round, end_flat, 90.641, 1.3);
  302. test_one<polygon_type, polygon_type>("snake4", snake, join_miter, end_flat, 64.44, 0.4);
  303. test_one<polygon_type, polygon_type>("snake5", snake, join_miter, end_flat, 72, 0.5);
  304. test_one<polygon_type, polygon_type>("snake6", snake, join_miter, end_flat, 75.44, 0.6);
  305. test_one<polygon_type, polygon_type>("snake16", snake, join_miter, end_flat, 114.24, 1.6);
  306. test_one<polygon_type, polygon_type>("funnelgate2", funnelgate, join_miter, end_flat, 120.982, 2.0);
  307. test_one<polygon_type, polygon_type>("funnelgate3", funnelgate, join_miter, end_flat, 13.0*13.0, 3.0);
  308. test_one<polygon_type, polygon_type>("funnelgate4", funnelgate, join_miter, end_flat, 15.0*15.0, 4.0);
  309. test_one<polygon_type, polygon_type>("gammagate1", gammagate, join_miter, end_flat, 88.0, 1.0);
  310. test_one<polygon_type, polygon_type>("fork_a1", fork_a, join_miter, end_flat, 88.0, 1.0);
  311. test_one<polygon_type, polygon_type>("fork_b1", fork_b, join_miter, end_flat, 154.0, 1.0);
  312. test_one<polygon_type, polygon_type>("fork_c1", fork_c, join_miter, end_flat, 152.0, 1.0);
  313. test_one<polygon_type, polygon_type>("triangle", triangle, join_miter, end_flat, 14.6569, 1.0);
  314. test_one<polygon_type, polygon_type>("degenerate0", degenerate0, join_round, end_round, 0.0, 1.0);
  315. test_one<polygon_type, polygon_type>("degenerate1", degenerate1, join_round, end_round, 3.1389, 1.0);
  316. test_one<polygon_type, polygon_type>("degenerate2", degenerate2, join_round, end_round, 3.1389, 1.0);
  317. test_one<polygon_type, polygon_type>("degenerate3", degenerate3, join_round, end_round, 143.1395, 1.0);
  318. test_one<polygon_type, polygon_type>("gammagate2", gammagate, join_miter, end_flat, 130.0, 2.0);
  319. test_one<polygon_type, polygon_type>("flower1", flower, join_miter, end_flat, 67.614, 0.1);
  320. test_one<polygon_type, polygon_type>("flower20", flower, join_miter, end_flat, 74.894, 0.20);
  321. test_one<polygon_type, polygon_type>("flower25", flower, join_miter, end_flat, 78.226, 0.25);
  322. test_one<polygon_type, polygon_type>("flower30", flower, join_miter, end_flat, 81.492, 0.30);
  323. test_one<polygon_type, polygon_type>("flower35", flower, join_miter, end_flat, 84.694, 0.35);
  324. test_one<polygon_type, polygon_type>("flower40", flower, join_miter, end_flat, 87.831, 0.40);
  325. test_one<polygon_type, polygon_type>("flower45", flower, join_miter, end_flat, 90.902, 0.45);
  326. test_one<polygon_type, polygon_type>("flower50", flower, join_miter, end_flat, 93.908, 0.50);
  327. test_one<polygon_type, polygon_type>("flower55", flower, join_miter, end_flat, 96.849, 0.55);
  328. test_one<polygon_type, polygon_type>("flower60", flower, join_miter, end_flat, 99.724, 0.60);
  329. test_one<polygon_type, polygon_type>("flower10", flower, join_round, end_flat, 67.486, 0.10);
  330. test_one<polygon_type, polygon_type>("flower20", flower, join_round, end_flat, 74.702, 0.20);
  331. test_one<polygon_type, polygon_type>("flower25", flower, join_round, end_flat, 78.071, 0.25);
  332. test_one<polygon_type, polygon_type>("flower30", flower, join_round, end_flat, 81.352, 0.30);
  333. test_one<polygon_type, polygon_type>("flower35", flower, join_round, end_flat, 84.547, 0.35);
  334. test_one<polygon_type, polygon_type>("flower40", flower, join_round, end_flat, 87.665, 0.40);
  335. test_one<polygon_type, polygon_type>("flower45", flower, join_round, end_flat, 90.709, 0.45);
  336. test_one<polygon_type, polygon_type>("flower50", flower, join_round, end_flat, 93.680, 0.50);
  337. test_one<polygon_type, polygon_type>("flower55", flower, join_round, end_flat, 96.580, 0.55);
  338. test_one<polygon_type, polygon_type>("flower60", flower, join_round, end_flat, 99.408, 0.60);
  339. // Flower - deflated
  340. test_one<polygon_type, polygon_type>("flower60", flower, join_round, end_flat, 19.3210, -0.60);
  341. // Saw
  342. {
  343. // SQL Server:
  344. // 68.6258859984014 90.2254986930165 112.799509089077 136.392823913949 161.224547934625 187.427508982734
  345. //215.063576036522 244.167935815974 274.764905445676 306.878264367143 340.530496138041 375.720107548269
  346. int const n = 12;
  347. double expected_round[n] =
  348. {
  349. 68.6252, 90.222, 112.792, 136.397, 161.230, 187.435,
  350. 215.073, 244.179, 274.779, 306.894, 340.543, 375.734
  351. };
  352. double expected_miter[n] =
  353. {
  354. 70.7706, 98.804, 132.101, 170.661, 214.484, 263.57,
  355. 317.92, 377.532, 442.408, 512.546, 587.948, 668.613
  356. };
  357. for (int i = 1; i <= n; i++)
  358. {
  359. std::ostringstream out;
  360. out << "saw_" << i;
  361. 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));
  362. test_one<polygon_type, polygon_type>(out.str(), saw, join_miter, end_flat, expected_miter[i - 1], double(i) / 2.0);
  363. }
  364. }
  365. // Bowl
  366. {
  367. // SQL Server values - see query below.
  368. //1 43.2425133175081 60.0257800296593 78.3497997564532 98.2145746255142 119.620102487345 142.482792724034
  369. //2 166.499856911107 191.763334982583 218.446279387336 246.615018368511 276.300134755606 307.518458532186
  370. int const n = 12;
  371. double expected_round[n] =
  372. {
  373. 43.2423, 60.025, 78.3477, 98.2109, 119.614, 142.487,
  374. 166.505, 191.77, 218.455, 246.625, 276.312, 307.532
  375. };
  376. double expected_miter[n] =
  377. {
  378. 43.4895, 61.014, 80.5726, 102.166, 125.794, 151.374,
  379. 178.599, 207.443, 237.904, 270.000, 304.0, 340.000
  380. };
  381. for (int i = 1; i <= n; i++)
  382. {
  383. std::ostringstream out;
  384. out << "bowl_" << i;
  385. 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));
  386. test_one<polygon_type, polygon_type>(out.str(), bowl, join_miter, end_flat, expected_miter[i - 1], double(i) / 2.0);
  387. }
  388. }
  389. {
  390. ut_settings settings;
  391. settings.use_ln_area = true;
  392. test_one<polygon_type, polygon_type>("county1", county1, join_round, end_flat, 0.00114, 0.01, settings);
  393. test_one<polygon_type, polygon_type>("county1", county1, join_miter, end_flat, 0.00133, 0.01, settings);
  394. test_one<polygon_type, polygon_type>("county1", county1, join_round, end_flat, 3.94411e-05, -0.003, settings);
  395. test_one<polygon_type, polygon_type>("county1", county1, join_miter, end_flat, 3.94301e-05, -0.003, settings);
  396. }
  397. test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_round, end_flat, 7571.405, 10.0);
  398. test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_miter, end_flat, 8207.453, 10.0);
  399. test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_round, end_flat, 11648.111, 20.0);
  400. test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_miter, end_flat, 14184.022, 20.0);
  401. test_one<polygon_type, polygon_type>("parcel1_30", parcel1, join_round, end_flat, 16350.488, 30.0);
  402. test_one<polygon_type, polygon_type>("parcel1_30", parcel1, join_miter, end_flat, 22417.799, 30.0);
  403. test_one<polygon_type, polygon_type>("parcel2_10", parcel2, join_round, end_flat, 5000.867, 10.0);
  404. test_one<polygon_type, polygon_type>("parcel2_10", parcel2, join_miter, end_flat, 5091.122, 10.0);
  405. test_one<polygon_type, polygon_type>("parcel2_20", parcel2, join_round, end_flat, 9049.673, 20.0);
  406. test_one<polygon_type, polygon_type>("parcel2_20", parcel2, join_miter, end_flat, 9410.691, 20.0);
  407. test_one<polygon_type, polygon_type>("parcel2_30", parcel2, join_round, end_flat, 13726.528, 30.0);
  408. test_one<polygon_type, polygon_type>("parcel2_30", parcel2, join_miter, end_flat, 14535.232, 30.0);
  409. test_one<polygon_type, polygon_type>("parcel3_10", parcel3, join_round, end_flat, 19993.007, 10.0);
  410. 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
  411. test_one<polygon_type, polygon_type>("parcel3_20", parcel3, join_round, end_flat, 34505.837, 20.0);
  412. test_one<polygon_type, polygon_type>("parcel3_20", parcel3, join_miter, end_flat, 34633.261, 20.0);
  413. test_one<polygon_type, polygon_type>("parcel3_30", parcel3, join_round, end_flat, 45262.452, 30.0);
  414. test_one<polygon_type, polygon_type>("parcel3_30", parcel3, join_miter, end_flat, 45567.388, 30.0);
  415. test_one<polygon_type, polygon_type>("parcel3_bend_5", parcel3_bend, join_round, end_flat, 155.634, 5.0);
  416. test_one<polygon_type, polygon_type>("parcel3_bend_10", parcel3_bend, join_round, end_flat, 458.454, 10.0);
  417. // These cases differ a bit based on point order, because piece generation is different in one corner. Tolerance is increased
  418. test_one<polygon_type, polygon_type>("parcel3_bend_15", parcel3_bend, join_round, end_flat, 918.06, 15.0, ut_settings(0.25));
  419. test_one<polygon_type, polygon_type>("parcel3_bend_20", parcel3_bend, join_round, end_flat, 1534.64, 20.0, ut_settings(0.25));
  420. // Parcel - deflated
  421. test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_round, end_flat, 1571.9024, -10.0);
  422. test_one<polygon_type, polygon_type>("parcel1_10", parcel1, join_miter, end_flat, 1473.7325, -10.0);
  423. test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_round, end_flat, 209.3579, -20.0);
  424. test_one<polygon_type, polygon_type>("parcel1_20", parcel1, join_miter, end_flat, 188.4224, -20.0);
  425. test_one<polygon_type, polygon_type>("nl_part1_2", nl_part1,
  426. join_round, end_flat, BG_IF_RESCALED(1848737356.991, 1848737292.653), -0.2 * 1000.0);
  427. test_one<polygon_type, polygon_type>("nl_part1_5", nl_part1,
  428. join_round, end_flat, BG_IF_RESCALED(1775953811.679, 1775953824.799), -0.5 * 1000.0);
  429. test_one<polygon_type, polygon_type>("italy_part1_30", italy_part1,
  430. join_round, end_flat, BG_IF_RESCALED(5015638814.956, 5015638827.704), 30.0 * 1000.0);
  431. test_one<polygon_type, polygon_type>("italy_part1_50", italy_part1,
  432. join_round, end_flat, BG_IF_RESCALED(11363180044.822, 11363180033.564), 50.0 * 1000.0);
  433. test_one<polygon_type, polygon_type>("italy_part1_60", italy_part1, join_round, end_flat, 15479097108.720, 60.0 * 1000.0);
  434. {
  435. ut_settings settings;
  436. settings.test_validity = false;
  437. // Tickets
  438. test_one<polygon_type, polygon_type>("ticket_10398_1_5", ticket_10398_1, join_miter, end_flat, 494.7192, 0.5, settings);
  439. test_one<polygon_type, polygon_type>("ticket_10398_1_25", ticket_10398_1, join_miter, end_flat, 697.7798, 2.5, settings);
  440. {
  441. // qcc-arm reports 1470.79863681712281
  442. ut_settings specific = settings;
  443. specific.tolerance = 0.02;
  444. test_one<polygon_type, polygon_type>("ticket_10398_1_84", ticket_10398_1, join_miter, end_flat, 1470.8096, 8.4, specific);
  445. }
  446. test_one<polygon_type, polygon_type>("ticket_10398_2_45", ticket_10398_2, join_miter, end_flat, 535.4780, 4.5, settings);
  447. test_one<polygon_type, polygon_type>("ticket_10398_2_62", ticket_10398_2, join_miter, end_flat, 705.2046, 6.2, settings);
  448. test_one<polygon_type, polygon_type>("ticket_10398_2_73", ticket_10398_2, join_miter, end_flat, 827.3394, 7.3, settings);
  449. test_one<polygon_type, polygon_type>("ticket_10398_3_12", ticket_10398_3, join_miter, end_flat, 122.9443, 1.2, settings);
  450. test_one<polygon_type, polygon_type>("ticket_10398_3_35", ticket_10398_3, join_miter, end_flat, 258.2729, 3.5, settings);
  451. test_one<polygon_type, polygon_type>("ticket_10398_3_54", ticket_10398_3, join_miter, end_flat, 402.0571, 5.4, settings);
  452. test_one<polygon_type, polygon_type>("ticket_10398_4_30", ticket_10398_4, join_miter, end_flat, 257.9482, 3.0, settings);
  453. test_one<polygon_type, polygon_type>("ticket_10398_4_66", ticket_10398_4, join_miter, end_flat, 553.0112, 6.6, settings);
  454. test_one<polygon_type, polygon_type>("ticket_10398_4_91", ticket_10398_4, join_miter, end_flat, 819.1406, 9.1, settings);
  455. test_one<polygon_type, polygon_type>("ticket_10412", ticket_10412, join_miter, end_flat, 3109.6616, 1.5, settings);
  456. test_one<polygon_type, polygon_type>("ticket_11580_100", ticket_11580, join_miter, end_flat, 52.0221000, 1.00, settings);
  457. #if defined(BOOST_GEOMETRY_TEST_FAILURES)
  458. // Larger distance, resulting in only one circle. Not solved yet in non-rescaled mode.
  459. test_one<polygon_type, polygon_type>("ticket_11580_237", ticket_11580, join_miter, end_flat, 999.999, 2.37, settings);
  460. #endif
  461. }
  462. // Tickets - deflated
  463. test_one<polygon_type, polygon_type>("ticket_10398_1_5", ticket_10398_1, join_miter, end_flat, 404.3936, -0.5);
  464. test_one<polygon_type, polygon_type>("ticket_10398_1_25", ticket_10398_1, join_miter, end_flat, 246.7329, -2.5);
  465. {
  466. // Test issue 369 as reported (1.15e-3) and some variants
  467. // Use high tolerance because output areas are very small
  468. const double distance = 1.15e-3;
  469. const double join_distance = 0.1e-3;
  470. const int points_per_circle = 2 * 3.1415 * distance / join_distance;
  471. ut_settings specific;
  472. specific.use_ln_area = true;
  473. specific.tolerance = 0.01;
  474. bg::strategy::buffer::join_round jr(points_per_circle);
  475. bg::strategy::buffer::end_round er(points_per_circle);
  476. test_one<polygon_type, polygon_type>("issue_369", issue_369, jr, er, 4.566e-06, distance, specific);
  477. test_one<polygon_type, polygon_type>("issue_369_10", issue_369, jr, er, 8.346e-08, distance / 10.0, specific);
  478. test_one<polygon_type, polygon_type>("issue_369_100", issue_369, jr, er, 4.942e-09, distance / 100.0, specific);
  479. test_one<polygon_type, polygon_type>("issue_369_1000", issue_369, jr, er, 7.881e-10, distance / 1000.0, specific);
  480. }
  481. {
  482. // Test issue 555 as reported (-0.000001) and some variants
  483. bg::strategy::buffer::join_round jr(180);
  484. bg::strategy::buffer::end_round er(180);
  485. #if ! defined(BOOST_GEOMETRY_USE_RESCALING)
  486. // With rescaling the interior ring is missing
  487. test_one<polygon_type, polygon_type>("issue_555", issue_555, jr, er, 4520.7942, -0.000001);
  488. #endif
  489. test_one<polygon_type, polygon_type>("issue_555", issue_555, jr, er, 4520.7957, +0.000001);
  490. test_one<polygon_type, polygon_type>("issue_555_1000", issue_555, jr, er, 4521.6280, +0.001);
  491. test_one<polygon_type, polygon_type>("issue_555_1000", issue_555, jr, er, 4519.9627, -0.001);
  492. }
  493. {
  494. bg::strategy::buffer::join_round join_round32(32);
  495. bg::strategy::buffer::end_round end_round32(32);
  496. test_one<polygon_type, polygon_type>("mysql_report_2014_10_24", mysql_report_2014_10_24,
  497. join_round32, end_round32, 174.902, 1.0);
  498. test_one<polygon_type, polygon_type>("mysql_report_2014_10_28_1", mysql_report_2014_10_28_1,
  499. join_round32, end_round32, 75.46, 1.0);
  500. test_one<polygon_type, polygon_type>("mysql_report_2014_10_28_2", mysql_report_2014_10_28_2,
  501. join_round32, end_round32, 69.117, 1.0);
  502. test_one<polygon_type, polygon_type>("mysql_report_2014_10_28_3", mysql_report_2014_10_28_3,
  503. join_round32, end_round32, 63.121, 1.0);
  504. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d1",
  505. mysql_report_2015_02_17_1,
  506. join_round32, end_round32, 48.879, -1);
  507. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d5",
  508. mysql_report_2015_02_17_1,
  509. join_round32, end_round32, 0.0, -5.0);
  510. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d6",
  511. mysql_report_2015_02_17_1,
  512. join_round32, end_round32, 0.0, -6.0);
  513. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_1_d10",
  514. mysql_report_2015_02_17_1,
  515. join_round32, end_round32, 0.0, -10.0);
  516. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_2_d1",
  517. mysql_report_2015_02_17_2,
  518. join_round32, end_round32, 64.0, -1.0);
  519. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_2_d10",
  520. mysql_report_2015_02_17_2,
  521. join_round32, end_round32, 0.0, -10.0);
  522. test_one<polygon_type, polygon_type>("mysql_report_2015_02_17_3_d1",
  523. mysql_report_2015_02_17_3,
  524. join_round32, end_round32, 64.0, -1.0);
  525. {
  526. // These extreme testcases, containing huge coordinate differences
  527. // and huge buffer distances, are to verify assertions.
  528. // No assertions should be raised.
  529. // The buffers themselves are most often wrong. Versions
  530. // without interior rings might be smaller (or have no output)
  531. // then their versions with interior rings.
  532. // Therefore all checks on area, validity, self-intersections
  533. // or having output at all are omitted.
  534. // Details (for versions with interior rings)
  535. // Case 3 is reported as invalid
  536. // On MinGW, also case 2 and 4 are reported as invalid
  537. // On PowerPC, also case 1 is reported as invalid
  538. ut_settings settings = ut_settings::assertions_only();
  539. const double no_area = ut_settings::ignore_area();
  540. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_0", mysql_report_2015_07_05_0,
  541. join_round32, end_round32, no_area, 6.0, settings);
  542. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_1", mysql_report_2015_07_05_1,
  543. join_round32, end_round32, no_area, 6.0, settings);
  544. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_2", mysql_report_2015_07_05_2,
  545. join_round32, end_round32, no_area, 549755813889.0, settings);
  546. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_3", mysql_report_2015_07_05_3,
  547. join_round32, end_round32, no_area, 49316.0, settings);
  548. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_4", mysql_report_2015_07_05_4,
  549. join_round32, end_round32, no_area, 1479986.0, settings);
  550. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_5", mysql_report_2015_07_05_5,
  551. join_round32, end_round32, no_area, 38141.0, settings);
  552. // Versions without interior rings (area should be smaller but still no checks)
  553. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_0_wi", mysql_report_2015_07_05_0_wi,
  554. join_round32, end_round32, no_area, 6.0, settings);
  555. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_1_wi", mysql_report_2015_07_05_1_wi,
  556. join_round32, end_round32, no_area, 6.0, settings);
  557. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_2_wi", mysql_report_2015_07_05_2_wi,
  558. join_round32, end_round32, no_area, 549755813889.0, settings);
  559. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_3_wi", mysql_report_2015_07_05_3_wi,
  560. join_round32, end_round32, no_area, 49316.0, settings);
  561. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_4_wi", mysql_report_2015_07_05_4_wi,
  562. join_round32, end_round32, no_area, 1479986.0, settings);
  563. test_one<polygon_type, polygon_type>("mysql_report_2015_07_05_5_wi", mysql_report_2015_07_05_5_wi,
  564. join_round32, end_round32, no_area, 38141.0, settings);
  565. }
  566. }
  567. {
  568. using bg::strategy::buffer::join_round;
  569. using bg::strategy::buffer::join_miter;
  570. bg::strategy::buffer::side_straight side_strategy;
  571. bg::strategy::buffer::point_circle point_strategy;
  572. typedef bg::strategy::buffer::distance_symmetric
  573. <
  574. typename bg::coordinate_type<P>::type
  575. > distance;
  576. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j12",
  577. sharp_triangle,
  578. join_round(12), end_flat, distance(1.0), side_strategy, point_strategy,
  579. 29.1604);
  580. // Test very various number of points (min is 3)
  581. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j2",
  582. sharp_triangle,
  583. join_round(2), end_flat, distance(1.0), side_strategy, point_strategy,
  584. 27.2399);
  585. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j5",
  586. sharp_triangle,
  587. join_round(5), end_flat, distance(1.0), side_strategy, point_strategy,
  588. 28.8563);
  589. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j36",
  590. sharp_triangle,
  591. join_round(36), end_flat, distance(1.0), side_strategy, point_strategy,
  592. 29.2482);
  593. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_j360",
  594. sharp_triangle,
  595. join_round(360), end_flat, distance(1.0), side_strategy, point_strategy,
  596. 29.2659);
  597. // Test with various miter limits
  598. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m2",
  599. sharp_triangle,
  600. join_miter(2), end_flat, distance(4.0), side_strategy, point_strategy,
  601. 148.500);
  602. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m3",
  603. sharp_triangle,
  604. join_miter(3), end_flat, distance(4.0), side_strategy, point_strategy,
  605. 164.376);
  606. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m4",
  607. sharp_triangle,
  608. join_miter(4), end_flat, distance(4.0), side_strategy, point_strategy,
  609. 180.2529);
  610. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m5",
  611. sharp_triangle,
  612. join_miter(5), end_flat, distance(4.0), side_strategy, point_strategy,
  613. 196.1293);
  614. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_m25",
  615. sharp_triangle,
  616. join_miter(25), end_flat, distance(4.0), side_strategy, point_strategy,
  617. 244.7471);
  618. // Right triangles, testing both points around sharp corner as well as points
  619. // around right corners in join_round strategy
  620. test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j3",
  621. right_triangle,
  622. join_round(3), end_flat, distance(1.0), side_strategy, point_strategy,
  623. 53.0240);
  624. test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j4",
  625. right_triangle,
  626. join_round(4), end_flat, distance(1.0), side_strategy, point_strategy,
  627. 53.2492);
  628. test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j5",
  629. right_triangle,
  630. join_round(5), end_flat, distance(1.0), side_strategy, point_strategy,
  631. 53.7430);
  632. test_with_custom_strategies<polygon_type, polygon_type>("right_triangle_j6",
  633. right_triangle,
  634. join_round(6), end_flat, distance(1.0), side_strategy, point_strategy,
  635. 53.7430);
  636. buffer_custom_side_strategy custom_side_strategy;
  637. test_with_custom_strategies<polygon_type, polygon_type>("sharp_triangle_custom_side",
  638. sharp_triangle,
  639. join_round(49), end_flat, distance(1.0), custom_side_strategy, point_strategy,
  640. 31.1087);
  641. }
  642. }
  643. template <bool Clockwise, typename P>
  644. void test_deflate_special_cases()
  645. {
  646. typedef bg::model::polygon<P, Clockwise, true> polygon_type;
  647. bg::strategy::buffer::join_miter join_miter(5);
  648. bg::strategy::buffer::join_round join_round(8);
  649. bg::strategy::buffer::end_flat end_flat;
  650. // This case fails for <float> because there is an IP formed at the border of the original
  651. test_one<polygon_type, polygon_type>("erode_50", erode_triangle, join_miter, end_flat, 0, 0, 0.0, -0.50);
  652. test_one<polygon_type, polygon_type>("erode_40", erode_triangle, join_miter, end_flat, 0, 0, 0.0, -0.40);
  653. test_one<polygon_type, polygon_type>("erode_60", erode_triangle, join_miter, end_flat, 0, 0, 0.0, -0.60);
  654. // This case generates a uu-turn in deflate, at 1.0
  655. test_one<polygon_type, polygon_type>("forming_uu_a_95", forming_uu_a, join_round, end_flat, 1, 0, 23.0516, -0.95);
  656. test_one<polygon_type, polygon_type>("forming_uu_a_10", forming_uu_a, join_round, end_flat, 2, 0, 21.4606, -1.0);
  657. test_one<polygon_type, polygon_type>("forming_uu_a_15", forming_uu_a, join_round, end_flat, 2, 0, 8.8272, -1.5);
  658. test_one<polygon_type, polygon_type>("forming_uu_a_20", forming_uu_a, join_round, end_flat, 2, 0, 1.7588, -2.0);
  659. test_one<polygon_type, polygon_type>("forming_uu_a_21", forming_uu_a, join_round, end_flat, 2, 0, 0.9944, -2.1);
  660. test_one<polygon_type, polygon_type>("forming_uu_b_25", forming_uu_b, join_round, end_flat, 1, 1, 38.4064, -0.25);
  661. test_one<polygon_type, polygon_type>("forming_uu_b_50", forming_uu_b, join_round, end_flat, 1, 1, 24.4551, -0.50);
  662. test_one<polygon_type, polygon_type>("forming_uu_b_95", forming_uu_b, join_round, end_flat, 1, 0, 11.5009, -0.95);
  663. test_one<polygon_type, polygon_type>("forming_uu_b_10", forming_uu_b, join_round, end_flat, 1, 0, 10.7152, -1.0);
  664. test_one<polygon_type, polygon_type>("forming_uu_b_15", forming_uu_b, join_round, end_flat, 1, 0, 4.4136, -1.5);
  665. test_one<polygon_type, polygon_type>("forming_uu_b_25", forming_uu_b, join_round, end_flat, 1, 1, 67.7139, 0.25);
  666. test_one<polygon_type, polygon_type>("forming_uu_b_50", forming_uu_b, join_round, end_flat, 1, 1, 82.0260, 0.50);
  667. test_one<polygon_type, polygon_type>("forming_uu_b_70", forming_uu_b, join_round, end_flat, 1, 3, 93.0760, 0.70);
  668. // From here on a/b have the same result
  669. test_one<polygon_type, polygon_type>("forming_uu_a_10", forming_uu_a, join_round, end_flat, 1, 0, 108.0959, 1.0);
  670. test_one<polygon_type, polygon_type>("forming_uu_b_10", forming_uu_b, join_round, end_flat, 1, 0, 108.0959, 1.0);
  671. }
  672. template
  673. <
  674. typename InputPoint,
  675. typename OutputPoint,
  676. bool InputClockwise,
  677. bool OutputClockwise,
  678. bool InputClosed,
  679. bool OutputClosed
  680. >
  681. void test_mixed()
  682. {
  683. typedef bg::model::polygon<InputPoint, InputClockwise, InputClosed> input_polygon_type;
  684. typedef bg::model::polygon<OutputPoint, OutputClockwise, OutputClosed> output_polygon_type;
  685. bg::strategy::buffer::join_round join_round(12);
  686. bg::strategy::buffer::end_flat end_flat;
  687. std::ostringstream name;
  688. name << "mixed_" << std::boolalpha
  689. << InputClockwise << "_" << OutputClockwise
  690. << "_" << InputClosed << "_" << OutputClosed;
  691. test_one<input_polygon_type, output_polygon_type>(name.str(),
  692. simplex, join_round, end_flat, 47.4831, 1.5);
  693. }
  694. #ifdef HAVE_TTMATH
  695. #include <ttmath_stub.hpp>
  696. #endif
  697. int test_main(int, char* [])
  698. {
  699. BoostGeometryWriteTestConfiguration();
  700. typedef bg::model::point<default_test_type, 2, bg::cs::cartesian> dpoint;
  701. test_all<true, dpoint>();
  702. test_deflate_special_cases<true, dpoint>();
  703. #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_ORDER)
  704. test_all<false, dpoint>();
  705. test_deflate_special_cases<false, dpoint>();
  706. #endif
  707. #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE)
  708. typedef bg::model::point<float, 2, bg::cs::cartesian> fpoint;
  709. test_deflate_special_cases<true, fpoint>();
  710. test_mixed<dpoint, dpoint, false, false, true, true>();
  711. test_mixed<dpoint, dpoint, false, true, true, true>();
  712. test_mixed<dpoint, dpoint, true, false, true, true>();
  713. test_mixed<dpoint, dpoint, true, true, true, true>();
  714. test_mixed<dpoint, dpoint, false, false, false, true>();
  715. test_mixed<dpoint, dpoint, false, true, false, true>();
  716. test_mixed<dpoint, dpoint, true, false, false, true>();
  717. test_mixed<dpoint, dpoint, true, true, false, true>();
  718. #ifdef HAVE_TTMATH
  719. test_all<bg::model::point<tt, 2, bg::cs::cartesian> >();
  720. #endif
  721. #endif
  722. return 0;
  723. }