diff --git a/src/PartSegCore_compiled_backend/triangulation/intersection.hpp b/src/PartSegCore_compiled_backend/triangulation/intersection.hpp index 026b19e..99ed529 100644 --- a/src/PartSegCore_compiled_backend/triangulation/intersection.hpp +++ b/src/PartSegCore_compiled_backend/triangulation/intersection.hpp @@ -133,8 +133,12 @@ enum Orientation { */ inline Orientation _orientation(const point::Point& p, const point::Point& q, const point::Point& r) { - double val1 = ((q.y - p.y) * (r.x - q.x)); - double val2 = ((r.y - q.y) * (q.x - p.x)); + // Promote to double before multiplying: the float products lose precision + // and can flip the result for nearly collinear points. + double val1 = + (static_cast(q.y) - p.y) * (static_cast(r.x) - q.x); + double val2 = + (static_cast(r.y) - q.y) * (static_cast(q.x) - p.x); // This commented code if for debugging purposes of differences between macOS // and linux double val = ((q.y - p.y) * (r.x - q.x)) - ((r.y - q.y) * (q.x - // p.x)); if (val!= 0 && val1 == val2) { @@ -337,15 +341,16 @@ inline std::unordered_set _find_intersections( */ inline std::vector _find_intersection(const point::Segment& s1, const point::Segment& s2) { + // To reduce problems with float precision, the same pair of segments + // should always be calculated in the same order. + if (s2 < s1) return _find_intersection(s2, s1); // ReSharper disable CppJoinDeclarationAndAssignment - point::Point::coordinate_t a1, b1, a2, b2, det, x, y, t; - // point::Point::coordinate_t c1, c2, u; - a1 = s1.top.y - s1.bottom.y; - b1 = s1.bottom.x - s1.top.x; - // c1 = a1 * s1.bottom.x + b1 * s1.bottom.y; - a2 = s2.top.y - s2.bottom.y; - b2 = s2.bottom.x - s2.top.x; - // c2 = a2 * s2.bottom.x + b2 * s2.bottom.y; + double a1, b1, a2, b2, det, t; + point::Point::coordinate_t x, y; + a1 = static_cast(s1.top.y) - s1.bottom.y; + b1 = static_cast(s1.bottom.x) - s1.top.x; + a2 = static_cast(s2.top.y) - s2.bottom.y; + b2 = static_cast(s2.bottom.x) - s2.top.x; det = a1 * b2 - a2 * b1; if (det == 0) { // collinear case @@ -356,15 +361,13 @@ inline std::vector _find_intersection(const point::Segment& s1, if (s2.point_on_line(s1.top)) res.push_back(s1.top); return res; } - t = ((s2.top.x - s1.top.x) * (s2.bottom.y - s2.top.y) - - (s2.top.y - s1.top.y) * (s2.bottom.x - s2.top.x)) / + t = ((static_cast(s2.top.x) - s1.top.x) * -a2 - + (static_cast(s2.top.y) - s1.top.y) * b2) / det; - // u = ((s2.top.x - s1.top.x) * (s1.bottom.y - s1.top.y) - - // (s2.top.y - s1.top.y) * (s2.bottom.x - s2.top.x)) / det; if (t < 0) return {s1.top}; if (t > 1) return {s1.bottom}; - x = s1.top.x + t * b1; - y = s1.top.y + t * (-a1); + x = s1.top.x + static_cast(t * b1); + y = s1.top.y + static_cast(t * (-a1)); return {{x, y}}; } } // namespace partsegcore::intersection diff --git a/src/tests/data/create_holes_triangulation_failure.txt b/src/tests/data/create_holes_triangulation_failure.txt new file mode 100644 index 0000000..def5de5 --- /dev/null +++ b/src/tests/data/create_holes_triangulation_failure.txt @@ -0,0 +1,570 @@ +2.029067968750000000e+04 2.404950195312500000e+04 +2.026631835937500000e+04 2.403294726562500000e+04 +2.025670898437500000e+04 2.396467578125000000e+04 +2.028290039062500000e+04 2.394192968750000000e+04 +2.026603710937500000e+04 2.388205273437500000e+04 +2.023153515625000000e+04 2.388622070312500000e+04 +2.022579492187500000e+04 2.381791601562500000e+04 +2.017229492187500000e+04 2.374486523437500000e+04 +2.021608593750000000e+04 2.373803710937500000e+04 +2.011988867187500000e+04 2.364859179687500000e+04 +2.007155859375000000e+04 2.357678710937500000e+04 +2.001443164062500000e+04 2.353214257812500000e+04 +1.990998828125000000e+04 2.353433984375000000e+04 +1.985698437500000000e+04 2.351932226562500000e+04 +1.979911718750000000e+04 2.353917187500000000e+04 +1.974989453125000000e+04 2.351380468750000000e+04 +1.971911914062500000e+04 2.353470703125000000e+04 +1.968275976562500000e+04 2.350535937500000000e+04 +1.965597460937500000e+04 2.354041406250000000e+04 +1.960955078125000000e+04 2.354081835937500000e+04 +1.956032617187500000e+04 2.351545117187500000e+04 +1.954836718750000000e+04 2.347428320312500000e+04 +1.947315429687500000e+04 2.342592773437500000e+04 +1.939641992187500000e+04 2.335050000000000000e+04 +1.934934570312500000e+04 2.327481445312500000e+04 +1.927438476562500000e+04 2.325611914062500000e+04 +1.920283203125000000e+04 2.318322656250000000e+04 +1.916012109375000000e+04 2.316554101562500000e+04 +1.914307031250000000e+04 2.313215429687500000e+04 +1.911074218750000000e+04 2.312211718750000000e+04 +1.912474804687500000e+04 2.310087109375000000e+04 +1.909763671875000000e+04 2.308096093750000000e+04 +1.900979296875000000e+04 2.308043359375000000e+04 +1.899569531250000000e+04 2.309087304687500000e+04 +1.895284179687500000e+04 2.305642382812500000e+04 +1.889984765625000000e+04 2.304269531250000000e+04 +1.882214257812500000e+04 2.300467968750000000e+04 +1.875972460937500000e+04 2.294460351562500000e+04 +1.866389843750000000e+04 2.289900585937500000e+04 +1.854620507812500000e+04 2.286004492187500000e+04 +1.847483593750000000e+04 2.280907421875000000e+04 +1.844240234375000000e+04 2.283337109375000000e+04 +1.838576757812500000e+04 2.282527343750000000e+04 +1.829405273437500000e+04 2.276732226562500000e+04 +1.822769531250000000e+04 2.269442187500000000e+04 +1.812605273437500000e+04 2.264884765625000000e+04 +1.801439062500000000e+04 2.258997265625000000e+04 +1.797648242187500000e+04 2.254728906250000000e+04 +1.790965429687500000e+04 2.252949023437500000e+04 +1.783273437500000000e+04 2.249144140625000000e+04 +1.775533203125000000e+04 2.247691992187500000e+04 +1.766158398437500000e+04 2.242877539062500000e+04 +1.760719335937500000e+04 2.238886523437500000e+04 +1.754871875000000000e+04 2.237379296875000000e+04 +1.751932617187500000e+04 2.233774218750000000e+04 +1.730468945312500000e+04 2.226163867187500000e+04 +1.716951367187500000e+04 2.222368164062500000e+04 +1.704849804687500000e+04 2.216455273437500000e+04 +1.695317578125000000e+04 2.213281250000000000e+04 +1.683397070312500000e+04 2.207413281250000000e+04 +1.674663085937500000e+04 2.200170312500000000e+04 +1.667750976562500000e+04 2.197936523437500000e+04 +1.653255078125000000e+04 2.190480468750000000e+04 +1.645490625000000000e+04 2.188717187500000000e+04 +1.632388867187500000e+04 2.183085351562500000e+04 +1.627165332031250000e+04 2.179719921875000000e+04 +1.619081542968750000e+04 2.176954882812500000e+04 +1.606919335937500000e+04 2.170218554687500000e+04 +1.601641015625000000e+04 2.165886523437500000e+04 +1.589643554687500000e+04 2.160764648437500000e+04 +1.581010742187500000e+04 2.156095703125000000e+04 +1.574621582031250000e+04 2.153803125000000000e+04 +1.558749316406250000e+04 2.145598242187500000e+04 +1.543580566406250000e+04 2.135831835937500000e+04 +1.535383300781250000e+04 2.132332421875000000e+04 +1.528976367187500000e+04 2.126484765625000000e+04 +1.523956640625000000e+04 2.123276171875000000e+04 +1.519392089843750000e+04 2.118129296875000000e+04 +1.511895312500000000e+04 2.112278125000000000e+04 +1.503601660156250000e+04 2.104036328125000000e+04 +1.494150000000000000e+04 2.098348046875000000e+04 +1.485238964843750000e+04 2.095083203125000000e+04 +1.479880859375000000e+04 2.090628125000000000e+04 +1.473879199218750000e+04 2.089159960937500000e+04 +1.466992480468750000e+04 2.084809765625000000e+04 +1.460319824218750000e+04 2.082539062500000000e+04 +1.452040625000000000e+04 2.076732031250000000e+04 +1.435269726562500000e+04 2.067397460937500000e+04 +1.418946777343750000e+04 2.059455468750000000e+04 +1.413737792968750000e+04 2.055846289062500000e+04 +1.397711718750000000e+04 2.049582031250000000e+04 +1.396131054687500000e+04 2.047391992187500000e+04 +1.385148730468750000e+04 2.041424023437500000e+04 +1.374012011718750000e+04 2.038053710937500000e+04 +1.368979199218750000e+04 2.032446484375000000e+04 +1.357850976562500000e+04 2.025732031250000000e+04 +1.345941699218750000e+04 2.015480468750000000e+04 +1.339886914062500000e+04 2.012197070312500000e+04 +1.328145019531250000e+04 1.999242187500000000e+04 +1.317935546875000000e+04 1.985132812500000000e+04 +1.311469140625000000e+04 1.980786523437500000e+04 +1.306388671875000000e+04 1.975793554687500000e+04 +1.302976269531250000e+04 1.970267773437500000e+04 +1.297900390625000000e+04 1.965950585937500000e+04 +1.293863574218750000e+04 1.956527734375000000e+04 +1.286706250000000000e+04 1.945950976562500000e+04 +1.276580957031250000e+04 1.935908203125000000e+04 +1.268605761718750000e+04 1.929478125000000000e+04 +1.265612011718750000e+04 1.924507031250000000e+04 +1.258577832031250000e+04 1.921758398437500000e+04 +1.246133886718750000e+04 1.910845898437500000e+04 +1.243359179687500000e+04 1.904793554687500000e+04 +1.233253710937500000e+04 1.893472460937500000e+04 +1.226178222656250000e+04 1.881623437500000000e+04 +1.218814257812500000e+04 1.874299414062500000e+04 +1.209400683593750000e+04 1.857976367187500000e+04 +1.199378417968750000e+04 1.848818750000000000e+04 +1.196227734375000000e+04 1.843443945312500000e+04 +1.186742089843750000e+04 1.837880859375000000e+04 +1.180190039062500000e+04 1.830043164062500000e+04 +1.173422851562500000e+04 1.824772265625000000e+04 +1.164022851562500000e+04 1.821220117187500000e+04 +1.152188378906250000e+04 1.813688867187500000e+04 +1.147341308593750000e+04 1.809890820312500000e+04 +1.137171875000000000e+04 1.806403515625000000e+04 +1.126145117187500000e+04 1.798162304687500000e+04 +1.110342968750000000e+04 1.790550976562500000e+04 +1.099955371093750000e+04 1.789867968750000000e+04 +1.087742285156250000e+04 1.785025585937500000e+04 +1.077609570312500000e+04 1.782286132812500000e+04 +1.054201953125000000e+04 1.783133398437500000e+04 +1.041437500000000000e+04 1.782599023437500000e+04 +1.029124316406250000e+04 1.786110351562500000e+04 +1.020952246093750000e+04 1.786258593750000000e+04 +1.017280371093750000e+04 1.784928320312500000e+04 +1.010682714843750000e+04 1.779159570312500000e+04 +1.003645996093750000e+04 1.776483593750000000e+04 +9.998660156250000000e+03 1.772768359375000000e+04 +9.963460937500000000e+03 1.765066796875000000e+04 +9.873398437500000000e+03 1.757876953125000000e+04 +9.833862304687500000e+03 1.751049804687500000e+04 +9.774826171875000000e+03 1.747555273437500000e+04 +9.724547851562500000e+03 1.747375781250000000e+04 +9.644480468750000000e+03 1.744701757812500000e+04 +9.477606445312500000e+03 1.744846093750000000e+04 +9.329179687500000000e+03 1.739299609375000000e+04 +9.292694335937500000e+03 1.739331054687500000e+04 +9.216972656250000000e+03 1.736797851562500000e+04 +9.097304687500000000e+03 1.729554882812500000e+04 +8.972371093750000000e+03 1.726189648437500000e+04 +8.945245117187500000e+03 1.722702539062500000e+04 +8.886674804687500000e+03 1.719972460937500000e+04 +8.855001953125000000e+03 1.716859375000000000e+04 +8.820028320312500000e+03 1.716171289062500000e+04 +8.711138671875000000e+03 1.710685937500000000e+04 +8.643079101562500000e+03 1.711325195312500000e+04 +8.550609375000000000e+03 1.710824804687500000e+04 +8.481304687500000000e+03 1.711529687500000000e+04 +8.328781250000000000e+03 1.711016601562500000e+04 +8.247391601562500000e+03 1.711731835937500000e+04 +8.090074218750000000e+03 1.711867968750000000e+04 +7.914561523437500000e+03 1.716275976562500000e+04 +7.812727050781250000e+03 1.716364062500000000e+04 +7.713734863281250000e+03 1.718771289062500000e+04 +7.639409667968750000e+03 1.718835546875000000e+04 +7.522776367187500000e+03 1.722640429687500000e+04 +7.445793457031250000e+03 1.731133007812500000e+04 +7.422085937500000000e+03 1.732026562500000000e+04 +7.371176757812500000e+03 1.740150976562500000e+04 +7.377716796875000000e+03 1.750098242187500000e+04 +7.433875976562500000e+03 1.756747265625000000e+04 +7.461587890625000000e+03 1.766317773437500000e+04 +7.526603515625000000e+03 1.779081640625000000e+04 +7.579823242187500000e+03 1.783780664062500000e+04 +7.618174804687500000e+03 1.789868554687500000e+04 +7.641685546875000000e+03 1.798422460937500000e+04 +7.643786621093750000e+03 1.808340039062500000e+04 +7.656231445312500000e+03 1.816142578125000000e+04 +7.630340820312500000e+03 1.822558398437500000e+04 +7.618059570312500000e+03 1.828997070312500000e+04 +7.535269531250000000e+03 1.839992968750000000e+04 +7.479681640625000000e+03 1.844047460937500000e+04 +7.428769042968750000e+03 1.853045703125000000e+04 +7.352376464843750000e+03 1.858624218750000000e+04 +7.281804687500000000e+03 1.865902734375000000e+04 +7.206596679687500000e+03 1.868304882812500000e+04 +7.005042968750000000e+03 1.868479296875000000e+04 +6.952565429687500000e+03 1.866725390625000000e+04 +6.832694335937500000e+03 1.857284960937500000e+04 +6.772167480468750000e+03 1.849356250000000000e+04 +6.652600585937500000e+03 1.838494140625000000e+04 +6.608810546875000000e+03 1.835467578125000000e+04 +6.564916992187500000e+03 1.827479492187500000e+04 +6.526380371093750000e+03 1.824200781250000000e+04 +6.479379394531250000e+03 1.822985156250000000e+04 +6.384748046875000000e+03 1.818332421875000000e+04 +6.270885742187500000e+03 1.810817382812500000e+04 +6.201706542968750000e+03 1.810877343750000000e+04 +6.161563476562500000e+03 1.808716796875000000e+04 +5.952607421875000000e+03 1.808900195312500000e+04 +5.821907714843750000e+03 1.814706250000000000e+04 +5.763791992187500000e+03 1.820292187500000000e+04 +5.725899414062500000e+03 1.827377343750000000e+04 +5.717454101562500000e+03 1.831622656250000000e+04 +5.690277343750000000e+03 1.834616601562500000e+04 +5.676694335937500000e+03 1.839408203125000000e+04 +5.561963378906250000e+03 1.851080273437500000e+04 +5.485389648437500000e+03 1.866568164062500000e+04 +5.409885742187500000e+03 1.874379882812500000e+04 +5.335548828125000000e+03 1.879861132812500000e+04 +5.283369140625000000e+03 1.881576562500000000e+04 +5.120507324218750000e+03 1.881717382812500000e+04 +5.029332031250000000e+03 1.879312109375000000e+04 +4.867397949218750000e+03 1.870283398437500000e+04 +4.795847656250000000e+03 1.865103710937500000e+04 +4.778916992187500000e+03 1.861247851562500000e+04 +4.715666015625000000e+03 1.858096289062500000e+04 +4.638639160156250000e+03 1.857628906250000000e+04 +4.491806640625000000e+03 1.853079296875000000e+04 +4.460532714843750000e+03 1.851463281250000000e+04 +4.286552734375000000e+03 1.851598437500000000e+04 +4.186043945312500000e+03 1.854796289062500000e+04 +4.136017089843750000e+03 1.854839453125000000e+04 +4.101404296875000000e+03 1.857746875000000000e+04 +4.059087890625000000e+03 1.858664453125000000e+04 +4.032560302734375000e+03 1.861255273437500000e+04 +3.989743896484375000e+03 1.862205468750000000e+04 +3.746425537109375000e+03 1.886962695312500000e+04 +3.733618896484375000e+03 1.891776953125000000e+04 +3.658141845703125000e+03 1.899587304687500000e+04 +3.623775390625000000e+03 1.906561132812500000e+04 +3.615143554687500000e+03 1.910877734375000000e+04 +3.585714843750000000e+03 1.914373828125000000e+04 +3.586441162109375000e+03 1.922823828125000000e+04 +3.552091064453125000e+03 1.928332421875000000e+04 +3.552828857421875000e+03 1.936911328125000000e+04 +3.518478759765625000e+03 1.942419921875000000e+04 +3.513024414062500000e+03 1.949480859375000000e+04 +3.486005615234375000e+03 1.952352148437500000e+04 +3.473926513671875000e+03 1.958267187500000000e+04 +3.430375244140625000e+03 1.971651367187500000e+04 +3.385135498046875000e+03 1.980853125000000000e+04 +3.329718994140625000e+03 1.986599218750000000e+04 +3.278843261718750000e+03 2.000886132812500000e+04 +3.252946044921875000e+03 2.003743554687500000e+04 +3.244315429687500000e+03 2.008060156250000000e+04 +3.218855957031250000e+03 2.010758398437500000e+04 +3.210412841796875000e+03 2.015003906250000000e+04 +3.184515625000000000e+03 2.017861328125000000e+04 +3.149002685546875000e+03 2.029160742187500000e+04 +3.098723388671875000e+03 2.040473242187500000e+04 +3.090038330078125000e+03 2.044450585937500000e+04 +3.093437744140625000e+03 2.083804101562500000e+04 +3.126782226562500000e+03 2.096531250000000000e+04 +3.127619873046875000e+03 2.106216796875000000e+04 +3.180916748046875000e+03 2.119673437500000000e+04 +3.261877441406250000e+03 2.132216210937500000e+04 +3.296692382812500000e+03 2.141200390625000000e+04 +3.300525634765625000e+03 2.145102539062500000e+04 +3.329916992187500000e+03 2.152521875000000000e+04 +3.354444580078125000e+03 2.163790039062500000e+04 +3.370982421875000000e+03 2.176028906250000000e+04 +3.377687500000000000e+03 2.193858398437500000e+04 +3.349148193359375000e+03 2.215449804687500000e+04 +3.349399414062500000e+03 2.224585351562500000e+04 +3.359076171875000000e+03 2.232052539062500000e+04 +3.350291259765625000e+03 2.234856445312500000e+04 +3.351404052734375000e+03 2.247671093750000000e+04 +3.373951660156250000e+03 2.255569726562500000e+04 +3.418291992187500000e+03 2.260006835937500000e+04 +3.447371826171875000e+03 2.268570507812500000e+04 +3.447765136718750000e+03 2.273097460937500000e+04 +3.486172607421875000e+03 2.278719921875000000e+04 +3.482500976562500000e+03 2.292713671875000000e+04 +3.528857666015625000e+03 2.296607421875000000e+04 +3.538603759765625000e+03 2.303229882812500000e+04 +3.511715820312500000e+03 2.311427929687500000e+04 +3.523372314453125000e+03 2.315990234375000000e+04 +3.562746826171875000e+03 2.319086523437500000e+04 +3.589098388671875000e+03 2.323704492187500000e+04 +3.661531982421875000e+03 2.330539648437500000e+04 +3.755188232421875000e+03 2.336554101562500000e+04 +3.799999023437500000e+03 2.340762695312500000e+04 +3.846763183593750000e+03 2.342958593750000000e+04 +3.968414306640625000e+03 2.343573046875000000e+04 +4.014926757812500000e+03 2.341394140625000000e+04 +4.285226074218750000e+03 2.341160156250000000e+04 +4.363020996093750000e+03 2.337712109375000000e+04 +4.474038574218750000e+03 2.337514062500000000e+04 +4.588990722656250000e+03 2.338059375000000000e+04 +4.645762695312500000e+03 2.340099804687500000e+04 +4.783469238281250000e+03 2.355820703125000000e+04 +4.818433593750000000e+03 2.363371875000000000e+04 +4.848883300781250000e+03 2.366469335937500000e+04 +4.869827636718750000e+03 2.373280859375000000e+04 +4.977874023437500000e+03 2.383995898437500000e+04 +5.027005859375000000e+03 2.394141406250000000e+04 +5.113432128906250000e+03 2.398735742187500000e+04 +5.164187988281250000e+03 2.403084765625000000e+04 +5.187327636718750000e+03 2.406953515625000000e+04 +5.291292480468750000e+03 2.412124609375000000e+04 +5.365128417968750000e+03 2.419656445312500000e+04 +5.426392089843750000e+03 2.422333789062500000e+04 +5.457322265625000000e+03 2.426802148437500000e+04 +5.501503417968750000e+03 2.427331250000000000e+04 +5.585341796875000000e+03 2.431833593750000000e+04 +5.696886230468750000e+03 2.442140625000000000e+04 +5.780453613281250000e+03 2.445751953125000000e+04 +5.820649902343750000e+03 2.451921093750000000e+04 +5.833442871093750000e+03 2.457097656250000000e+04 +5.893768066406250000e+03 2.459364453125000000e+04 +5.938048828125000000e+03 2.462519726562500000e+04 +5.982570312500000000e+03 2.470219921875000000e+04 +6.004197265625000000e+03 2.477462890625000000e+04 +6.168975585937500000e+03 2.492888085937500000e+04 +6.179100097656250000e+03 2.496739843750000000e+04 +6.231009765625000000e+03 2.507829687500000000e+04 +6.308170898437500000e+03 2.517711132812500000e+04 +6.333130371093750000e+03 2.522637304687500000e+04 +6.347707519531250000e+03 2.529936523437500000e+04 +6.415401855468750000e+03 2.538333984375000000e+04 +6.459376464843750000e+03 2.546128906250000000e+04 +6.637791015625000000e+03 2.564421093750000000e+04 +6.679791015625000000e+03 2.567899414062500000e+04 +6.720562988281250000e+03 2.575946093750000000e+04 +6.794536132812500000e+03 2.585359570312500000e+04 +6.913812011718750000e+03 2.599312500000000000e+04 +7.010680175781250000e+03 2.606686328125000000e+04 +7.098095214843750000e+03 2.617323632812500000e+04 +7.171892578125000000e+03 2.628282421875000000e+04 +7.231979003906250000e+03 2.633450195312500000e+04 +7.310220214843750000e+03 2.646864843750000000e+04 +7.383843261718750000e+03 2.651822265625000000e+04 +7.487861328125000000e+03 2.662673437500000000e+04 +7.541147460937500000e+03 2.665875000000000000e+04 +7.629165039062500000e+03 2.673227929687500000e+04 +7.660623535156250000e+03 2.679626562500000000e+04 +7.829224609375000000e+03 2.690717187500000000e+04 +7.903329101562500000e+03 2.697215429687500000e+04 +8.014062011718750000e+03 2.702243750000000000e+04 +8.191990234375000000e+03 2.714118164062500000e+04 +8.274635742187500000e+03 2.722880273437500000e+04 +8.300904296875000000e+03 2.727598828125000000e+04 +8.392316406250000000e+03 2.733807421875000000e+04 +8.466873046875000000e+03 2.740474218750000000e+04 +8.498178710937500000e+03 2.744824609375000000e+04 +8.537940429687500000e+03 2.747352929687500000e+04 +8.663455078125000000e+03 2.759689453125000000e+04 +8.693246093750000000e+03 2.765316796875000000e+04 +8.811126953125000000e+03 2.769962304687500000e+04 +8.928100585937500000e+03 2.780034765625000000e+04 +9.119741210937500000e+03 2.789170312500000000e+04 +9.141291992187500000e+03 2.792733398437500000e+04 +9.120637695312500000e+03 2.796516406250000000e+04 +9.160181640625000000e+03 2.798921093750000000e+04 +9.242094726562500000e+03 2.806857031250000000e+04 +9.278351562500000000e+03 2.808233984375000000e+04 +9.342726562500000000e+03 2.814561328125000000e+04 +9.357148437500000000e+03 2.818157617187500000e+04 +9.579760742187500000e+03 2.840159375000000000e+04 +9.594115234375000000e+03 2.843874414062500000e+04 +9.651414062500000000e+03 2.849504882812500000e+04 +9.665859375000000000e+03 2.853227734375000000e+04 +9.723157226562500000e+03 2.858858203125000000e+04 +9.737551757812500000e+03 2.862591210937500000e+04 +9.787964843750000000e+03 2.867638281250000000e+04 +9.896620117187500000e+03 2.873605859375000000e+04 +9.984408203125000000e+03 2.882234570312500000e+04 +1.000492285156250000e+04 2.886496289062500000e+04 +1.003970312500000000e+04 2.887669531250000000e+04 +1.019773046875000000e+04 2.903201953125000000e+04 +1.021217578125000000e+04 2.906924609375000000e+04 +1.026947265625000000e+04 2.912555078125000000e+04 +1.028396679687500000e+04 2.916395117187500000e+04 +1.038789843750000000e+04 2.926495507812500000e+04 +1.044952441406250000e+04 2.937286523437500000e+04 +1.053023437500000000e+04 2.945218359375000000e+04 +1.054467871093750000e+04 2.948941015625000000e+04 +1.076847851562500000e+04 2.971065039062500000e+04 +1.078291113281250000e+04 2.974658789062500000e+04 +1.095278320312500000e+04 2.991355664062500000e+04 +1.098896093750000000e+04 2.992736523437500000e+04 +1.104753320312500000e+04 2.998365820312500000e+04 +1.115485351562500000e+04 3.004308593750000000e+04 +1.123694335937500000e+04 3.012264843750000000e+04 +1.127424218750000000e+04 3.013646093750000000e+04 +1.152166796875000000e+04 3.037936718750000000e+04 +1.157652050781250000e+04 3.041132812500000000e+04 +1.161271484375000000e+04 3.046887304687500000e+04 +1.172190820312500000e+04 3.052887890625000000e+04 +1.175431640625000000e+04 3.056169140625000000e+04 +1.186287500000000000e+04 3.062140625000000000e+04 +1.196790136718750000e+04 3.070061328125000000e+04 +1.210007910156250000e+04 3.076121679687500000e+04 +1.228117480468750000e+04 3.086563281250000000e+04 +1.234582812500000000e+04 3.088574414062500000e+04 +1.247823535156250000e+04 3.094623046875000000e+04 +1.251080371093750000e+04 3.097825585937500000e+04 +1.289564648437500000e+04 3.116595703125000000e+04 +1.300103515625000000e+04 3.118902929687500000e+04 +1.310840136718750000e+04 3.123504101562500000e+04 +1.315871679687500000e+04 3.123460156250000000e+04 +1.324943164062500000e+04 3.128024218750000000e+04 +1.330091992187500000e+04 3.127979492187500000e+04 +1.341481640625000000e+04 3.132652343750000000e+04 +1.344941894531250000e+04 3.132692968750000000e+04 +1.353224316406250000e+04 3.136078710937500000e+04 +1.356682519531250000e+04 3.134841406250000000e+04 +1.372189550781250000e+04 3.134706054687500000e+04 +1.376594824218750000e+04 3.137118359375000000e+04 +1.388590625000000000e+04 3.137013671875000000e+04 +1.392992187500000000e+04 3.139296875000000000e+04 +1.415975390625000000e+04 3.139096484375000000e+04 +1.420272460937500000e+04 3.136737304687500000e+04 +1.427623632812500000e+04 3.136673242187500000e+04 +1.431986718750000000e+04 3.134184570312500000e+04 +1.438080664062500000e+04 3.134131445312500000e+04 +1.442485839843750000e+04 3.136543554687500000e+04 +1.447516015625000000e+04 3.136499804687500000e+04 +1.451853125000000000e+04 3.138783593750000000e+04 +1.488891210937500000e+04 3.138460546875000000e+04 +1.493252832031250000e+04 3.136100781250000000e+04 +1.510019531250000000e+04 3.135954687500000000e+04 +1.514382519531250000e+04 3.133466015625000000e+04 +1.535982128906250000e+04 3.133277539062500000e+04 +1.540279199218750000e+04 3.130918554687500000e+04 +1.545308007812500000e+04 3.130874609375000000e+04 +1.553514843750000000e+04 3.126237304687500000e+04 +1.557003417968750000e+04 3.126129492187500000e+04 +1.566116210937500000e+04 3.121277929687500000e+04 +1.573466113281250000e+04 3.121213867187500000e+04 +1.577827636718750000e+04 3.118854296875000000e+04 +1.601299316406250000e+04 3.118778515625000000e+04 +1.605660937500000000e+04 3.116418945312500000e+04 +1.613014648437500000e+04 3.116354687500000000e+04 +1.617377734375000000e+04 3.113866210937500000e+04 +1.622526562500000000e+04 3.113821289062500000e+04 +1.634011523437500000e+04 3.107394726562500000e+04 +1.646544140625000000e+04 3.101620898437500000e+04 +1.657506640625000000e+04 3.095324023437500000e+04 +1.660423828125000000e+04 3.094586718750000000e+04 +1.664687695312500000e+04 3.090618359375000000e+04 +1.672301367187500000e+04 3.087316015625000000e+04 +1.685006835937500000e+04 3.075233789062500000e+04 +1.687947070312500000e+04 3.068923046875000000e+04 +1.701177148437500000e+04 3.055460156250000000e+04 +1.704899414062500000e+04 3.054015429687500000e+04 +1.710529492187500000e+04 3.048284960937500000e+04 +1.714380468750000000e+04 3.046839062500000000e+04 +1.719882812500000000e+04 3.041238671875000000e+04 +1.723604882812500000e+04 3.039793945312500000e+04 +1.737997460937500000e+04 3.025016992187500000e+04 +1.741167187500000000e+04 3.017346289062500000e+04 +1.745111914062500000e+04 3.010413085937500000e+04 +1.745164648437500000e+04 3.006772851562500000e+04 +1.747500195312500000e+04 3.003178710937500000e+04 +1.754283007812500000e+04 2.982087500000000000e+04 +1.754238867187500000e+04 2.976937890625000000e+04 +1.756651367187500000e+04 2.972531835937500000e+04 +1.756547460937500000e+04 2.960407812500000000e+04 +1.758831640625000000e+04 2.956069726562500000e+04 +1.758787890625000000e+04 2.950974414062500000e+04 +1.761072460937500000e+04 2.946689257812500000e+04 +1.761028320312500000e+04 2.941539648437500000e+04 +1.763312890625000000e+04 2.937254687500000000e+04 +1.763268750000000000e+04 2.932105078125000000e+04 +1.765681250000000000e+04 2.927698828125000000e+04 +1.765638085937500000e+04 2.922667968750000000e+04 +1.770183593750000000e+04 2.911345703125000000e+04 +1.773152539062500000e+04 2.896630859375000000e+04 +1.772811328125000000e+04 2.856783203125000000e+04 +1.771992187500000000e+04 2.851486914062500000e+04 +1.768052734375000000e+04 2.843237109375000000e+04 +1.768010156250000000e+04 2.838266796875000000e+04 +1.765521875000000000e+04 2.833841406250000000e+04 +1.765418164062500000e+04 2.821726367187500000e+04 +1.763060546875000000e+04 2.817481640625000000e+04 +1.762995898437500000e+04 2.809935937500000000e+04 +1.760721875000000000e+04 2.806417968750000000e+04 +1.759666992187500000e+04 2.799957812500000000e+04 +1.754902539062500000e+04 2.788883007812500000e+04 +1.748198828125000000e+04 2.776368750000000000e+04 +1.744511718750000000e+04 2.772740625000000000e+04 +1.741468359375000000e+04 2.765823046875000000e+04 +1.741353320312500000e+04 2.752397851562500000e+04 +1.740342968750000000e+04 2.746605273437500000e+04 +1.742522070312500000e+04 2.738745898437500000e+04 +1.747479882812500000e+04 2.730527148437500000e+04 +1.760346093750000000e+04 2.717260937500000000e+04 +1.767556835937500000e+04 2.712644140625000000e+04 +1.774347265625000000e+04 2.705795898437500000e+04 +1.788370507812500000e+04 2.696279296875000000e+04 +1.800704296875000000e+04 2.690249414062500000e+04 +1.807427734375000000e+04 2.685342773437500000e+04 +1.815277539062500000e+04 2.677356835937500000e+04 +1.824125390625000000e+04 2.662240039062500000e+04 +1.829629296875000000e+04 2.656641210937500000e+04 +1.830515429687500000e+04 2.653504492187500000e+04 +1.841929296875000000e+04 2.640612304687500000e+04 +1.854045117187500000e+04 2.635758203125000000e+04 +1.873197265625000000e+04 2.635591601562500000e+04 +1.877494726562500000e+04 2.633232617187500000e+04 +1.887964453125000000e+04 2.633141601562500000e+04 +1.891269335937500000e+04 2.631126562500000000e+04 +1.896242382812500000e+04 2.631006054687500000e+04 +1.900667773437500000e+04 2.628516992187500000e+04 +1.905764062500000000e+04 2.628472656250000000e+04 +1.912707617187500000e+04 2.626090820312500000e+04 +1.920977148437500000e+04 2.621453125000000000e+04 +1.924402734375000000e+04 2.621345898437500000e+04 +1.931244921875000000e+04 2.617205664062500000e+04 +1.939168164062500000e+04 2.613839062500000000e+04 +1.946241796875000000e+04 2.609015820312500000e+04 +1.956605273437500000e+04 2.598601367187500000e+04 +1.960197460937500000e+04 2.597157812500000000e+04 +1.969864453125000000e+04 2.587323437500000000e+04 +1.973289062500000000e+04 2.579392578125000000e+04 +1.982325976562500000e+04 2.565384960937500000e+04 +1.986222656250000000e+04 2.561080859375000000e+04 +1.991507031250000000e+04 2.549081640625000000e+04 +1.993931835937500000e+04 2.546094140625000000e+04 +1.995429882812500000e+04 2.540277343750000000e+04 +1.997972656250000000e+04 2.539336914062500000e+04 +1.997186718750000000e+04 2.534587304687500000e+04 +2.000095507812500000e+04 2.527855273437500000e+04 +1.999982226562500000e+04 2.514572070312500000e+04 +2.003843164062500000e+04 2.513635742187500000e+04 +2.002507421875000000e+04 2.508230468750000000e+04 +1.998919726562500000e+04 2.510970117187500000e+04 +1.998867968750000000e+04 2.504908789062500000e+04 +2.001278515625000000e+04 2.500244726562500000e+04 +2.001025390625000000e+04 2.485673046875000000e+04 +2.002043750000000000e+04 2.484116601562500000e+04 +2.002091406250000000e+04 2.474572070312500000e+04 +2.006262109375000000e+04 2.464604882812500000e+04 +2.013422070312500000e+04 2.457320312500000000e+04 +2.019986718750000000e+04 2.455844531250000000e+04 +2.019570117187500000e+04 2.452365820312500000e+04 +2.026135156250000000e+04 2.435800195312500000e+04 +2.026828515625000000e+04 2.426379296875000000e+04 +2.025897265625000000e+04 2.423033984375000000e+04 +2.029213085937500000e+04 2.421973437500000000e+04 +2.025854492187500000e+04 2.418004492187500000e+04 +2.026575390625000000e+04 2.411807421875000000e+04 +2.029139257812500000e+04 2.413332812500000000e+04 +2.029067968750000000e+04 2.404950195312500000e+04 +3.321274169921875000e+03 2.034471093750000000e+04 +3.370284423828125000e+03 2.018542773437500000e+04 +3.480557128906250000e+03 2.006290234375000000e+04 +3.652092773437500000e+03 1.997713281250000000e+04 +3.786870849609375000e+03 2.003839648437500000e+04 +3.823628417968750000e+03 2.020993164062500000e+04 +3.823628417968750000e+03 2.035696289062500000e+04 +3.762365722656250000e+03 2.061426562500000000e+04 +3.701103027343750000e+03 2.072453906250000000e+04 +3.603082763671875000e+03 2.083481250000000000e+04 +3.321274169921875000e+03 2.034471093750000000e+04 +2.029067968750000000e+04 2.404950195312500000e+04 +3.627587646484375000e+03 2.183952148437500000e+04 +3.713355468750000000e+03 2.165573242187500000e+04 +3.884891113281250000e+03 2.139842968750000000e+04 +4.044174316406250000e+03 2.138617578125000000e+04 +4.240214843750000000e+03 2.166798437500000000e+04 +4.240214843750000000e+03 2.180276367187500000e+04 +4.129941894531250000e+03 2.208457226562500000e+04 +3.970658935546875000e+03 2.221934960937500000e+04 +3.848133544921875000e+03 2.228061132812500000e+04 +3.725608154296875000e+03 2.224385546875000000e+04 +3.627587646484375000e+03 2.183952148437500000e+04 +2.029067968750000000e+04 2.404950195312500000e+04 diff --git a/src/tests/test_triangulate.py b/src/tests/test_triangulate.py index de80c75..27f7d31 100644 --- a/src/tests/test_triangulate.py +++ b/src/tests/test_triangulate.py @@ -1,3 +1,5 @@ +from pathlib import Path + import numpy as np import pytest from PartSegCore_compiled_backend.triangulate import ( @@ -20,6 +22,8 @@ triangulate_polygon_with_edge_numpy_li, ) +DATA_DIR = Path(__file__).parent / 'data' + def test_on_segment(): assert on_segment((0, 0), (0, 1), (0, 2)) @@ -743,3 +747,15 @@ def test_is_convex_regular_polygon(angle, n_vertex, reverse): rot = rotation_matrix(angle) rotated_poly = np.dot(poly, rot) assert is_convex(rotated_poly) + + +def test_hole_triangulation_precision(): + # Polygon with two holes (napari single path encoding) from napari/bermuda#194. + # Float precision errors in orientation/intersection used to silently drop ~30% of the area. + vertices = np.loadtxt(DATA_DIR / 'create_holes_triangulation_failure.txt', dtype=np.float32) + triangles, points = triangulate_polygon_numpy_li([vertices]) + tri_points = points.astype(np.float64)[triangles] + v1 = tri_points[:, 1] - tri_points[:, 0] + v2 = tri_points[:, 2] - tri_points[:, 0] + area = np.abs(v1[:, 0] * v2[:, 1] - v1[:, 1] * v2[:, 0]).sum() / 2 + assert area == pytest.approx(139420612.3, rel=1e-6)