From 227669d022b32e87dc348da36df7bd29d8892b03 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Fri, 20 Nov 2015 20:09:27 -0800 Subject: [PATCH] Improve fixing T-Joints --- web/app/engine.js | 1 + web/app/test/craft-fixtures.js | 1 + web/app/test/craft-tests.js | 2 +- web/app/workbench.js | 109 +++++++++++++++++++++++++-------- 4 files changed, 88 insertions(+), 25 deletions(-) diff --git a/web/app/engine.js b/web/app/engine.js index c4ae3ab4..03fe05b6 100644 --- a/web/app/engine.js +++ b/web/app/engine.js @@ -605,6 +605,7 @@ TCAD.utils.getDerivedFrom = function(shared) { /** @constructor */ TCAD.Solid = function(csg, material, type) { THREE.Geometry.call( this ); + csg = csg.reTesselated().canonicalized(); this.tCadType = type || 'SOLID'; this.csg = csg; this.dynamic = true; //true by default diff --git a/web/app/test/craft-fixtures.js b/web/app/test/craft-fixtures.js index 859dc015..4b43e73c 100644 --- a/web/app/test/craft-fixtures.js +++ b/web/app/test/craft-fixtures.js @@ -3,3 +3,4 @@ face0 = {"polygons":[{"vertices":[{"pos":{"_x":-139.91971276733113,"_y":-42.0424 face1 = {"polygons":[{"vertices":[{"pos":{"_x":186.76017988553747,"_y":-167.6901587281717,"_z":500},"tag":252},{"pos":{"_x":-185.45572292943226,"_y":-167.6901587281717,"_z":500},"tag":253},{"pos":{"_x":-12.512527212621677,"_y":-353.3319072242888,"_z":500},"tag":131}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":186.76017988553747,"_y":-167.6901587281717,"_z":500},"tag":252},{"pos":{"_x":187.82928632605396,"_y":-166.69418295288312,"_z":500},"tag":254},{"pos":{"_x":-10.468669108347044,"_y":-166.69418295288295,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":231},{"pos":{"_x":-49.09887613352758,"_y":-167.6901587281717,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":233}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-49.09887613352758,"_y":-167.6901587281717,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":233},{"pos":{"_x":-78.41019051675583,"_y":-164.25274670199042,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":234},{"pos":{"_x":-188.65800380439185,"_y":-164.25274670199047,"_z":500},"tag":255},{"pos":{"_x":-185.45572292943226,"_y":-167.6901587281717,"_z":500},"tag":253}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":187.82928632605396,"_y":-166.69418295288312,"_z":500},"tag":254},{"pos":{"_x":195.19899679951467,"_y":-159.82858676499436,"_z":500},"tag":256},{"pos":{"_x":41.935823053894126,"_y":-159.82858676499427,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":229},{"pos":{"_x":-10.468669108347044,"_y":-166.69418295288295,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":231}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-78.41019051675583,"_y":-164.25274670199042,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":234},{"pos":{"_x":-100.99472718823785,"_y":-157.05626748938366,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":236},{"pos":{"_x":-195.36221836291742,"_y":-157.0562674893837,"_z":500},"tag":257},{"pos":{"_x":-188.65800380439185,"_y":-164.25274670199047,"_z":500},"tag":255}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-100.99472718823785,"_y":-157.05626748938366,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":236},{"pos":{"_x":-118.40911170807782,"_y":-146.29689162837445,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":238},{"pos":{"_x":-205.3856148262412,"_y":-146.2968916283746,"_z":500},"tag":258},{"pos":{"_x":-195.36221836291742,"_y":-157.0562674893837,"_z":500},"tag":257}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":195.19899679951467,"_y":-159.82858676499436,"_z":500},"tag":256},{"pos":{"_x":211.9595984695577,"_y":-144.21446958264957,"_z":500},"tag":259},{"pos":{"_x":116.29066512165514,"_y":-144.2144695826496,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":227},{"pos":{"_x":41.935823053894126,"_y":-159.82858676499427,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":229}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":211.9595984695577,"_y":-144.21446958264957,"_z":500},"tag":259},{"pos":{"_x":216.13725708581467,"_y":-140.32257760488972,"_z":500},"tag":260},{"pos":{"_x":130.7240165469426,"_y":-140.32257760488986,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":154},{"pos":{"_x":116.29066512165514,"_y":-144.2144695826496,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":227}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-118.40911170807782,"_y":-146.29689162837445,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":238},{"pos":{"_x":-131.5719934078236,"_y":-131.7992925395276,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":241},{"pos":{"_x":-218.8915268150999,"_y":-131.79929253952716,"_z":500},"tag":261},{"pos":{"_x":-205.3856148262412,"_y":-146.2968916283746,"_z":500},"tag":258}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-131.5719934078236,"_y":-131.7992925395276,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":241},{"pos":{"_x":-140.95547887260085,"_y":-113.01987083485247,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":243},{"pos":{"_x":-236.386369594972,"_y":-113.01987083485217,"_z":500},"tag":262},{"pos":{"_x":-218.8915268150999,"_y":-131.79929253952716,"_z":500},"tag":261}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-140.95547887260085,"_y":-113.01987083485247,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":243},{"pos":{"_x":-146.65827348701345,"_y":-88.95906997611296,"_z":500.00000000000006,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":245},{"pos":{"_x":-258.8013264983923,"_y":-88.95906997611341,"_z":500},"tag":263},{"pos":{"_x":-236.386369594972,"_y":-113.01987083485217,"_z":500},"tag":262}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-146.65827348701345,"_y":-88.95906997611296,"_z":500.00000000000006,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":245},{"pos":{"_x":-148.3860834315919,"_y":-57.95087638517974,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":247},{"pos":{"_x":-287.68844987696707,"_y":-57.950876385179214,"_z":500},"tag":264},{"pos":{"_x":-258.8013264983923,"_y":-88.95906997611341,"_z":500},"tag":263}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-148.3860834315919,"_y":-57.95087638517974,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":247},{"pos":{"_x":-145.3190408272563,"_y":-17.23172254604061,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":249},{"pos":{"_x":-325.62226944542664,"_y":-17.231722546040665,"_z":500},"tag":265},{"pos":{"_x":-287.68844987696707,"_y":-57.950876385179214,"_z":500},"tag":264}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-145.3190408272563,"_y":-17.23172254604061,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":249},{"pos":{"_x":-135.77660147151167,"_y":37.95878915956841,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":251},{"pos":{"_x":-326.01722426759903,"_y":37.95878915956856,"_z":500},"tag":266},{"pos":{"_x":-353.3319072242888,"_y":12.512527212621677,"_z":500},"tag":134},{"pos":{"_x":-325.62226944542664,"_y":-17.231722546040665,"_z":500},"tag":265}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-135.77660147151167,"_y":37.95878915956841,"_z":499.9999999999999,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":251},{"pos":{"_x":-116.41704398014676,"_y":116.41238076953938,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":190},{"pos":{"_x":-241.80308758584388,"_y":116.41238076953792,"_z":500},"tag":267},{"pos":{"_x":-326.01722426759903,"_y":37.95878915956856,"_z":500},"tag":266}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":-116.41704398014676,"_y":116.41238076953938,"_z":499.99999999999994,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":190},{"pos":{"_x":-114.46231703302026,"_y":122.86684412679392,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":169},{"pos":{"_x":-234.87469784331117,"_y":122.8668441267942,"_z":500},"tag":268},{"pos":{"_x":-241.80308758584388,"_y":116.41238076953792,"_z":500},"tag":267}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":216.13725708581467,"_y":-140.32257760488972,"_z":500},"tag":260},{"pos":{"_x":353.3319072242888,"_y":-12.512527212621677,"_z":500},"tag":132},{"pos":{"_x":227.2129641350349,"_y":122.8668441267942,"_z":500},"tag":269},{"pos":{"_x":-114.46231703302026,"_y":122.86684412679392,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":169},{"pos":{"_x":130.7240165469426,"_y":-140.32257760488986,"_z":500,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":0}},"tag":154}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}},{"vertices":[{"pos":{"_x":227.2129641350349,"_y":122.8668441267942,"_z":500},"tag":269},{"pos":{"_x":12.512527212621677,"_y":353.3319072242888,"_z":500},"tag":133},{"pos":{"_x":-234.87469784331117,"_y":122.8668441267942,"_z":500},"tag":268}],"shared":{"color":[5,5,5,5],"__tcad":{"faceId":"0:1"},"tag":2},"plane":{"normal":{"_x":0,"_y":0,"_z":1},"w":500,"tag":125}}],"basis":[{"x":1,"y":0,"z":0},{"x":0,"y":1,"z":0},{"x":0,"y":0,"z":1}]} face2 = {"polygons":[{"vertices":[{"pos":{"_x":-41.80886661701135,"_y":-243.95416083551567,"_z":238,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":539},{"pos":{"_x":-50.52655387509194,"_y":-243.41119825127814,"_z":234.98609503037457,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":540},{"pos":{"_x":-109.39918449298024,"_y":-249.33123585400983,"_z":217.96725899468242},"tag":541},{"pos":{"_x":-80.67640321495499,"_y":-280.1630203369067,"_z":237.99999999999997,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":0}},"tag":489}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-50.52655387509194,"_y":-243.41119825127814,"_z":234.98609503037457,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":540},{"pos":{"_x":-63.611126395836386,"_y":-240.8061372198943,"_z":229.8397617108925,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":542},{"pos":{"_x":-112.73892876116642,"_y":-245.74626702707087,"_z":215.63795002905817},"tag":543},{"pos":{"_x":-109.39918449298024,"_y":-249.33123585400983,"_z":217.96725899468242},"tag":541}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-63.611126395836386,"_y":-240.8061372198943,"_z":229.8397617108925,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":542},{"pos":{"_x":-74.49162737865471,"_y":-236.72742424698856,"_z":224.89506200074408,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":544},{"pos":{"_x":-117.14514327162097,"_y":-241.0165211554313,"_z":212.5648300116266},"tag":545},{"pos":{"_x":-112.73892876116642,"_y":-245.74626702707087,"_z":215.63795002905817},"tag":543}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-74.49162737865471,"_y":-236.72742424698856,"_z":224.89506200074408,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":544},{"pos":{"_x":-83.4081104931287,"_y":-231.2547589941904,"_z":220.10192833629395,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":546},{"pos":{"_x":-122.5705013907885,"_y":-235.1927998850722,"_z":208.78090696426034},"tag":547},{"pos":{"_x":-117.14514327162097,"_y":-241.0165211554313,"_z":212.5648300116266},"tag":545}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-83.4081104931287,"_y":-231.2547589941904,"_z":220.10192833629395,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":546},{"pos":{"_x":-90.51363525869118,"_y":-224.40149359647938,"_z":215.4154051588147,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":548},{"pos":{"_x":-129.01673996310396,"_y":-228.27323884176116,"_z":204.28496952255858},"tag":549},{"pos":{"_x":-122.5705013907885,"_y":-235.1927998850722,"_z":208.78090696426034},"tag":547}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-90.51363525869118,"_y":-224.40149359647938,"_z":215.4154051588147,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":548},{"pos":{"_x":-95.88354470309952,"_y":-216.11996220938153,"_z":210.79449631126568,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":550},{"pos":{"_x":-136.53091426782672,"_y":-220.20732765831394,"_z":199.04419892105386},"tag":551},{"pos":{"_x":-129.01673996310396,"_y":-228.27323884176116,"_z":204.28496952255858},"tag":549}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-95.88354470309952,"_y":-216.11996220938153,"_z":210.79449631126568,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":550},{"pos":{"_x":-99.51816659905046,"_y":-206.30140737461008,"_z":206.201264067711,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":552},{"pos":{"_x":-145.20569211346054,"_y":-210.89559428595373,"_z":192.9939638766781},"tag":553},{"pos":{"_x":-136.53091426782672,"_y":-220.20732765831394,"_z":199.04419892105386},"tag":551}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-99.51816659905046,"_y":-206.30140737461008,"_z":206.201264067711,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":552},{"pos":{"_x":-101.33906616609596,"_y":-194.77074009778977,"_z":201.60022075649456,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":554},{"pos":{"_x":-155.18349623756214,"_y":-200.18515843403927,"_z":186.03493146665028},"tag":555},{"pos":{"_x":-145.20569211346054,"_y":-210.89559428595373,"_z":192.9939638766781},"tag":553}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-101.33906616609596,"_y":-194.77074009778977,"_z":201.60022075649456,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":554},{"pos":{"_x":-101.17811224628832,"_y":-181.2756954790067,"_z":196.95809971446477,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":556},{"pos":{"_x":-166.6648050243523,"_y":-187.86082136272898,"_z":178.02727778222763},"tag":557},{"pos":{"_x":-155.18349623756214,"_y":-200.18515843403927,"_z":186.03493146665028},"tag":555}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-101.17811224628832,"_y":-181.2756954790067,"_z":196.95809971446477,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":556},{"pos":{"_x":-98.75758889671056,"_y":-165.46923870300824,"_z":192.24418016697518,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":558},{"pos":{"_x":-179.92143557534422,"_y":-173.63080748763574,"_z":168.78142363389077},"tag":559},{"pos":{"_x":-166.6648050243523,"_y":-187.86082136272898,"_z":178.02727778222763},"tag":557}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-98.75758889671056,"_y":-165.46923870300824,"_z":192.24418016697518,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":558},{"pos":{"_x":-93.65820084551937,"_y":-146.88324001506635,"_z":187.4314980939492,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":560},{"pos":{"_x":-195.3162269255655,"_y":-157.10563590084647,"_z":158.04430646669525},"tag":561},{"pos":{"_x":-179.92143557534422,"_y":-173.63080748763574,"_z":168.78142363389077},"tag":559}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-93.65820084551937,"_y":-146.88324001506635,"_z":187.4314980939492,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":560},{"pos":{"_x":-85.26982797616907,"_y":-124.89039282462304,"_z":182.499557754907,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":562},{"pos":{"_x":-213.33126015737423,"_y":-137.76782816283696,"_z":145.47969820533865},"tag":563},{"pos":{"_x":-195.3162269255655,"_y":-157.10563590084647,"_z":158.04430646669525},"tag":561}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-85.26982797616907,"_y":-124.89039282462304,"_z":182.499557754907,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":562},{"pos":{"_x":-72.71693880241358,"_y":-98.65008331419722,"_z":177.43967266259995,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":564},{"pos":{"_x":-234.60757807442712,"_y":-114.92927216582272,"_z":130.6405027161049},"tag":565},{"pos":{"_x":-213.33126015737423,"_y":-137.76782816283696,"_z":145.47969820533865},"tag":563}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-72.71693880241358,"_y":-98.65008331419722,"_z":177.43967266259995,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":564},{"pos":{"_x":-54.74629213257765,"_y":-67.03265356611891,"_z":172.26501150209978,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":566},{"pos":{"_x":-228.62618902804553,"_y":-84.51744262984232,"_z":122.00000000000004,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":567},{"pos":{"_x":-246.99626066064857,"_y":-101.63093633169436,"_z":122.00000000000003},"tag":526},{"pos":{"_x":-234.60757807442712,"_y":-114.92927216582272,"_z":130.6405027161049},"tag":565}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-54.74629213257765,"_y":-67.03265356611891,"_z":172.26501150209978,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":566},{"pos":{"_x":-29.558807403816747,"_y":-28.516185435013973,"_z":167.02917791036108,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":568},{"pos":{"_x":-185.32657863001418,"_y":-44.17967886607878,"_z":122.00000000000004,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":569},{"pos":{"_x":-228.62618902804553,"_y":-84.51744262984232,"_z":122.00000000000004,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":567}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":-29.558807403816747,"_y":-28.516185435013973,"_z":167.02917791036108,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":1}},"tag":568},{"pos":{"_x":-4.762425750311214,"_y":5.112112330914562,"_z":163.36696458211253,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":1}},"tag":430},{"pos":{"_x":-147.86163773628067,"_y":-9.277472557462694,"_z":122.00000000000004,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":570},{"pos":{"_x":-185.32657863001418,"_y":-44.17967886607878,"_z":122.00000000000004,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":569}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":253.4128758293174,"_y":31.07336932600507,"_z":238,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":0}},"tag":571},{"pos":{"_x":-4.762425750311214,"_y":5.112112330914562,"_z":163.36696458211253,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":1}},"tag":430},{"pos":{"_x":102.24581400350128,"_y":-109.75333033107214,"_z":238.00000000000006,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":0}},"tag":427}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}},{"vertices":[{"pos":{"_x":253.4128758293174,"_y":31.07336932600507,"_z":238,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":0}},"tag":571},{"pos":{"_x":285.16803122195523,"_y":60.65635967476035,"_z":238.00000000000006},"tag":536},{"pos":{"_x":118.8481737762617,"_y":239.18844367997264,"_z":122.00000000000003,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":572},{"pos":{"_x":-147.86163773628067,"_y":-9.277472557462694,"_z":122.00000000000004,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":2}},"tag":570}],"shared":{"color":[66,66,66,66],"__tcad":{"csgInfo":{"derivedFrom":{"_class":"TCAD.TWO.Segment","id":1}},"faceId":"2:2"},"tag":382},"plane":{"normal":{"_x":-0.292667592585567,"_y":0.31415704671434347,"_z":0.9031340045917275},"w":150.5420747326014,"tag":381}}],"basis":[{"x":0.9031340045917278,"y":1.3877787807814457e-17,"z":0.29266759258556707},{"x":0.09194358655567841,"y":0.901305349999722,"z":-0.28372591166983546},{"x":-0.292667592585567,"y":0.31415704671434347,"z":0.9031340045917275}]} face3 = {"polygons":[{"vertices":[{"pos":{"_x":-131.46538081090722,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}}},{"pos":{"_x":-131.4653808107654,"_y":450,"_z":214.18049221656702,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":21}}},{"pos":{"_x":168.53461918922966,"_y":450,"_z":214.18049221656838,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":20}}}],"shared":{"color":[10,10,10,10],"__tcad":{"faceId":"1:1"},"tag":3},"plane":{"normal":{"_x":0,"_y":1,"_z":0},"w":450}},{"vertices":[{"pos":{"_x":-131.46538081090722,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}}},{"pos":{"_x":168.53461918922966,"_y":450,"_z":214.18049221656838,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":20}}},{"pos":{"_x":168.53461918909238,"_y":450,"_z":14.18049221493088}}],"shared":{"color":[10,10,10,10],"__tcad":{"faceId":"1:1"},"tag":3},"plane":{"normal":{"_x":0,"_y":1,"_z":0},"w":450}},{"vertices":[{"pos":{"_x":-131.46538081090722,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}}},{"pos":{"_x":168.53461918909238,"_y":450,"_z":14.18049221493088}},{"pos":{"_x":368.53461918909284,"_y":450,"_z":14.180492214929334,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":18}}}],"shared":{"color":[10,10,10,10],"__tcad":{"faceId":"1:1"},"tag":3},"plane":{"normal":{"_x":0,"_y":1,"_z":0},"w":450}},{"vertices":[{"pos":{"_x":-131.46538081090722,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}}},{"pos":{"_x":368.53461918909284,"_y":450,"_z":14.180492214929334,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":18}}},{"pos":{"_x":368.53461918909284,"_y":450,"_z":-185.81950778507067,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":17}}}],"shared":{"color":[10,10,10,10],"__tcad":{"faceId":"1:1"},"tag":3},"plane":{"normal":{"_x":0,"_y":1,"_z":0},"w":450}},{"vertices":[{"pos":{"_x":-131.46538081090722,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}}},{"pos":{"_x":368.53461918909284,"_y":450,"_z":-185.81950778507067,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":17}}},{"pos":{"_x":-331.4653808109072,"_y":450,"_z":-185.81950778507067,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":16}}}],"shared":{"color":[10,10,10,10],"__tcad":{"faceId":"1:1"},"tag":3},"plane":{"normal":{"_x":0,"_y":1,"_z":0},"w":450}},{"vertices":[{"pos":{"_x":-131.46538081090722,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}}},{"pos":{"_x":-331.4653808109072,"_y":450,"_z":-185.81950778507067,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":16}}},{"pos":{"_x":-331.4653808109072,"_y":450,"_z":14.180492213227362,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":23}}}],"shared":{"color":[10,10,10,10],"__tcad":{"faceId":"1:1"},"tag":3},"plane":{"normal":{"_x":0,"_y":1,"_z":0},"w":450}}],"basis":[{"x":-1,"y":0,"z":0},{"x":0,"y":0,"z":1},{"x":0,"y":1,"z":0}]} +face4 = {"polygons":[{"vertices":[{"pos":{"_x":129.28216758720183,"_y":20.173129015088662,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":25}},"tag":68},{"pos":{"_x":133.42143480208364,"_y":19.886308978362543,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":69},{"pos":{"_x":138.07819125254525,"_y":18.854899988538442,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":70},{"pos":{"_x":142.51263187838603,"_y":17.09850553423756,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":71},{"pos":{"_x":146.6126678898366,"_y":14.661521773927552,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":72},{"pos":{"_x":150.27466319988827,"_y":11.605548035106219,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":73},{"pos":{"_x":153.40605402043826,"_y":8.007829775961772,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":74},{"pos":{"_x":155.92768858534833,"_y":3.9593060617843676,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":75},{"pos":{"_x":157.7758278595361,"_y":-0.4376890901814381,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":76},{"pos":{"_x":158.9037566624302,"_y":-5.072013394630569,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":77},{"pos":{"_x":159.28296448162789,"_y":-9.826525627558926,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":28}},"tag":78},{"pos":{"_x":159.28296448171403,"_y":-161.3528241749382,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":24}},"tag":79},{"pos":{"_x":-103.37671065559023,"_y":-161.3528241749382,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":26}},"tag":80},{"pos":{"_x":-103.37671065555278,"_y":-9.826993721830775,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":26}},"tag":81},{"pos":{"_x":-103.08976224456774,"_y":-5.687479045021647,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":82},{"pos":{"_x":-102.05820881524735,"_y":-1.0307545875969684,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":83},{"pos":{"_x":-100.3016768173204,"_y":3.4036315582160572,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":84},{"pos":{"_x":-97.86456588592719,"_y":7.50359197973277,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":85},{"pos":{"_x":-94.80847856305277,"_y":11.165492500621633,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":86},{"pos":{"_x":-91.21066317793499,"_y":14.296771728753408,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":87},{"pos":{"_x":-87.16206125090481,"_y":16.818280718697196,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":88},{"pos":{"_x":-82.76500877618308,"_y":18.666283609512966,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":89},{"pos":{"_x":-78.1306494880149,"_y":19.794068667974486,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":90},{"pos":{"_x":-73.37612549468334,"_y":20.173129015088662,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Arc","id":29}},"tag":67}],"shared":{"color":[29,29,29,29],"__tcad":{"faceId":"1:0"},"tag":8},"plane":{"normal":{"_x":0,"_y":0,"_z":-1},"w":0,"tag":7}},{"vertices":[{"pos":{"_x":304.59198333332165,"_y":-161.3528241749382,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":23}},"tag":91},{"pos":{"_x":304.59198333332165,"_y":-161.35329226921004,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}},"tag":92},{"pos":{"_x":-103.37671065559023,"_y":-161.35329226921004,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":27}},"tag":93},{"pos":{"_x":-103.37671065559023,"_y":-161.3528241749382,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":26}},"tag":80}],"shared":{"color":[29,29,29,29],"__tcad":{"faceId":"1:0"},"tag":8},"plane":{"normal":{"_x":0,"_y":0,"_z":-1},"w":0,"tag":7}},{"vertices":[{"pos":{"_x":304.59198333332165,"_y":-161.35329226921004,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}},"tag":92},{"pos":{"_x":304.59198333332165,"_y":-308.41869990219755,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":22}},"tag":95},{"pos":{"_x":-248.6857295071863,"_y":-308.41869990219755,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":21}},"tag":96},{"pos":{"_x":-248.6857295071863,"_y":-161.35329226921004,"_z":0,"sketchConnectionObject":{"_class":"TCAD.TWO.Segment","id":20}},"tag":94}],"shared":{"color":[29,29,29,29],"__tcad":{"faceId":"1:0"},"tag":8},"plane":{"normal":{"_x":0,"_y":0,"_z":-1},"w":0,"tag":7}}],"basis":[{"x":-1,"y":0,"z":0},{"x":0,"y":1,"z":0},{"x":0,"y":0,"z":-1}]} \ No newline at end of file diff --git a/web/app/test/craft-tests.js b/web/app/test/craft-tests.js index 283b6725..10beb425 100644 --- a/web/app/test/craft-tests.js +++ b/web/app/test/craft-tests.js @@ -5,7 +5,7 @@ function testReconstruct0() { } testReconstruct0(); -var face = face3; +var face = face4; var polygons2D = face.polygons.map(csgPolyToSimple).map(polygonTransform(basisTransformation(face.basis))); var csgPolygons = polygons2D.map(function(p) {return new CSG.Polygon( p.map(function(v) { return new CSG.Vertex(new CSG.Vector3D(v));}) )} ); var outline = TCAD.craft.findOutline(csgPolygons); diff --git a/web/app/workbench.js b/web/app/workbench.js index f315b14d..43b0e154 100644 --- a/web/app/workbench.js +++ b/web/app/workbench.js @@ -171,6 +171,19 @@ TCAD.craft._pointOnLine = function(p, a, b) { }; TCAD.craft.polygonsToSegments = function(polygons) { + function selfIntersecting(a, b, c) { + var f = TCAD.craft._pointOnLine; + return f(c, a, b) || f(a, b, c) || f(b, c, a); + } + //polygons.filter(function(p) { + // + //}); + //magnitude of cross product is the area of parallelogram + //var area = points[b].pos.minus(points[a].pos).cross(points[c].pos.minus(points[a].pos)).length() / 2.0; + //if (selfIntersecting(points[a].pos, points[b].pos, points[c].pos)) { + //continue; + //} + var segmentsByPolygon = []; for (var pi = 0; pi < polygons.length; pi++) { var segments = []; @@ -184,7 +197,7 @@ TCAD.craft.polygonsToSegments = function(polygons) { segmentsByPolygon.push(segments); } return segmentsByPolygon; -}; +}; TCAD.craft.reconstructSketchBounds = function(csg, face, strict) { strict = strict || false; @@ -235,10 +248,30 @@ TCAD.craft.pickUpCraftInfo = function(outline, outerEdges) { } }; -TCAD.craft.findOutline = function(planePolygons) { + +TCAD.craft.getOutlineByCollision = function(segments, outerEdges) { + var eq = TCAD.utils.strictEqual; + var outline = []; + for (var psi1 = 0; psi1 < segments.length; psi1++) { + var s1 = segments[psi1]; + for (var psi2 = 0; psi2 < outerEdges.length; psi2++) { + var s2 = outerEdges[psi2]; + if (TCAD.utils.equal(Math.abs(s1[0].minus(s1[1]).unit().dot(s2[0].minus(s2[1]).unit())), 1) && + (eq(s1[0], s2[0]) || eq(s1[1], s2[1]) || eq(s1[0], s2[1]) || eq(s1[1], s2[0]) || + TCAD.craft._pointOnLine(s1[0], s2[0], s2[1]) || TCAD.craft._pointOnLine(s1[1], s2[0], s2[1]))) { + outline.push(s1); + } + } + } + return outline; +}; + + TCAD.craft.findOutline = function(planePolygons, outer) { var segmentsByPolygon = TCAD.craft.polygonsToSegments(planePolygons); - TCAD.craft.simplifySegments(segmentsByPolygon); + //TCAD.craft.simplifySegments(segmentsByPolygon); var planeSegments = TCAD.utils.arrFlatten1L(segmentsByPolygon); + //planeSegments = TCAD.craft.removeSharedEdges(planeSegments); + TCAD.craft.removeTJoints(planeSegments); planeSegments = TCAD.craft.removeSharedEdges(planeSegments); return planeSegments; }; @@ -282,28 +315,65 @@ TCAD.craft.simplifySegments = function(polygonToSegments) { } }; +TCAD.craft._closeFactorToLine = function(p, seg1, seg2) { + + var a = p.minus(seg1); + var b = seg2.minus(seg1); + var bn = b.unit(); + + var projLength = bn.dot(a); + var bx = bn.times(projLength); + if (!(projLength > 0 && projLength < b.length())) { + return -1; + } + + var c = a.minus(bx); + return c.length(); +}; + +TCAD.craft.removeTJoints = function(segments) { + var pointIndex = TCAD.struct.hashTable.forVector3d(); + + for (var i = 0; i < segments.length; ++i) { + pointIndex.put(segments[i][0], 1); + pointIndex.put(segments[i][1], 1); + } + + var points = pointIndex.getKeys(); + var eq = TCAD.utils.strictEqual; + for (var pi1 = 0; pi1 < points.length; ++pi1) { + var point = points[pi1]; + var best = null, bestFactor; + for (var pi2 = 0; pi2 < segments.length; ++pi2) { + var seg = segments[pi2]; + if (eq(seg[0], point) || eq(seg[1], point)) continue; + var factor = TCAD.craft._closeFactorToLine(point, seg[0], seg[1]); + if (factor != -1 && factor < 1E-6 && (best == null || factor < bestFactor)) { + best = seg; + bestFactor = factor; + } + } + if (best != null) { + segments.push([point, best[1]]); + best[1] = point; + } + } +}; + + TCAD.craft.deleteRedundantPoints = function(path) { var cleanedPath = []; //Delete redundant point var pathLength = path.length; + var skipMode = false; for (var pi = 0; pi < pathLength; pi++) { var bIdx = ((pi + 1) % pathLength); var a = path[pi]; var b = path[bIdx]; var c = path[(pi + 2) % pathLength]; var eq = TCAD.utils.areEqual; - if (!eq(a.minus(b).unit().dot(a.minus(c).unit()), 1, 1E-9)) { - cleanedPath.push(b); - for (var ii = 0; ii < pathLength - pi - 1; ++ii) { - a = path[(ii + bIdx) % pathLength]; - b = path[(ii + bIdx + 1) % pathLength]; - c = path[(ii + bIdx + 2) % pathLength]; - if (!eq(a.minus(b).unit().dot(a.minus(c).unit()), 1, 1E-9)) { - cleanedPath.push(b); - } - } - break; - } + if (!skipMode) cleanedPath.push(a); + skipMode = eq(a.minus(b).unit().dot(b.minus(c).unit()), 1, 1E-9); } return cleanedPath; }; @@ -401,10 +471,6 @@ TCAD.craft._triangulateCSG = function(polygons) { function csgVec(v) { return new CSG.Vector3D(v.x, v.y, v.z); } - function selfIntersecting(a, b, c) { - var f = TCAD.craft._pointOnLine; - return f(c, a, b) || f(a, b, c) || f(b, c, a); - } var triangled = []; for (var ei = 0; ei < polygons.length; ++ei) { var poly = polygons[ei]; @@ -414,11 +480,6 @@ TCAD.craft._triangulateCSG = function(polygons) { var a = refs[i][0]; var b = refs[i][1]; var c = refs[i][2]; - //magnitude of cross product is the area of parallelogram - //var area = points[b].pos.minus(points[a].pos).cross(points[c].pos.minus(points[a].pos)).length() / 2.0; - if (selfIntersecting(points[a].pos, points[b].pos, points[c].pos)) { - continue; - } var csgPoly = new CSG.Polygon([points[a], points[b], points[c]], poly.shared, poly.plane); triangled.push(csgPoly); }