Disabled external gits

This commit is contained in:
sora committed 2022-04-07 18:46:57 +02:00
1 parent 88cb3426ad
commit 15e7120d6d
5316 files changed
+4563444 -6

No files matched your search

+1
View File
@@ -0,0 +1 @@
[[[0.7573293773467382, 0.815047959624175, 0.0], [0.7382918866768229, 0.8077426395800297, 0.0], [0.712807971666606, 0.7957615925851973, 0.0], [0.7025417450220812, 0.7796701569309142, 0.0], [0.6905147333347126, 0.7641698088151446, 0.0], [0.6793643644045892, 0.7483741167757003, 0.0], [0.6673363171733719, 0.7328707847993249, 0.0], [0.6541204865584065, 0.7050700117825089, 0.0], [0.6438513735470383, 0.6889742567787731, 0.0], [0.6335847950959635, 0.6728768029722143, 0.0], [0.624194929186718, 0.6535565129899636, 0.0], [0.6072033550923888, 0.6406773330435204, 0.0], [0.5925570685472923, 0.628965823073566, 0.0], [0.5758661692185844, 0.6198853195169207, 0.0], [0.5732475248887626, 0.6383313847786196, 0.0], [0.5797140498702152, 0.6664329808910836, 0.0], [0.5896863234125586, 0.6845779265571226, 0.0], [0.5929267241510738, 0.7059500788604043, 0.0], [0.5906008050694399, 0.7252773384605989, 0.0], [0.573338669682959, 0.7408109043389407, 0.0], [0.5534242681248813, 0.7367290270551946, 0.0], [0.5340919192657138, 0.728546934259311, 0.0], [0.5229508967995333, 0.7127450201498058, 0.0], [0.5161988164330544, 0.692546786657812, 0.0], [0.5176433286115328, 0.6705846056000913, 0.0], [0.5284610605006752, 0.6532983843659802, 0.0], [0.5337132572810496, 0.633966401827168, 0.0], [0.5146815088164846, 0.6178549030844644, 0.0], [0.4962530023539942, 0.6210860140535831, 0.0], [0.4778298101267601, 0.6243323141529102, 0.0], [0.45910709047789033, 0.6237903203823153, 0.0], [0.4231461376634795, 0.6329988144889741, 0.0], [0.40269389127869387, 0.6389484437451657, 0.0], [0.38487379724532883, 0.6440284986173911, 0.0], [0.36004525200227483, 0.6515085516542231, 0.0], [0.3407301868385678, 0.6522199326934308, 0.0], [0.31820845211132603, 0.6550103118053049, 0.0], [0.29803362107883724, 0.6589626036868257, 0.0], [0.27897167080827456, 0.6547015804149422, 0.0], [0.26078687906728837, 0.6501391554987626, 0.0], [0.2446143127277615, 0.639999408573925, 0.0], [0.24017775026661636, 0.6371835829261571, 0.0], [0.24780161368549525, 0.6350016068799627, 0.0], [0.2671412673271519, 0.6372133837367266, 0.0], [0.2561844113695899, 0.6194277265530355, 0.0], [0.27438988297428896, 0.6269159084119125, 0.0], [0.2882521156256806, 0.6417554628674451, 0.0], [0.3782687416748515, 0.6159581040830083, 0.0], [0.39788265318089827, 0.6131985642091516, 0.0], [0.44143872235135195, 0.5916428110295225, 0.0], [0.4610552680405679, 0.5860101394146493, 0.0], [0.47745021071223154, 0.5765997623363373, 0.0], [0.4844719918212728, 0.5566705801614275, 0.0], [0.48768557091512166, 0.5370357075131162, 0.0], [0.49001771394177024, 0.5176909168459198, 0.0], [0.4894171396308898, 0.49833944935318464, 0.0], [0.47536571766691904, 0.48540927868348427, 0.0], [0.45779673964764533, 0.4765708371340902, 0.0], [0.4231924737353384, 0.4869853805484602, 0.0], [0.40355752827422076, 0.49248552938677986, 0.0], [0.3851022091596394, 0.4956531843672938, 0.0], [0.36664698891732705, 0.4988202960332706, 0.0], [0.3481923124812031, 0.5019840391616612, 0.0], [0.32798802892606443, 0.5028050213701808, 0.0], [0.30954915350146606, 0.5001177396128447, 0.0], [0.3137068905413534, 0.480219431163938, 0.0], [0.30028676208822025, 0.46320015822917926, 0.0], [0.28950152091836373, 0.44531112234637094, 0.0], [0.2962843505940312, 0.42746960228374464, 0.0], [0.3077538171729307, 0.40905572855802474, 0.0], [0.3189225759265874, 0.3926924653459375, 0.0], [0.33183695332492746, 0.37867189881994306, 0.0], [0.3447443528619924, 0.364645323244238, 0.0], [0.3579353951423729, 0.35148054178665555, 0.0], [0.37112584673199467, 0.33831520156477846, 0.0], [0.3811170566467762, 0.3184053615503294, 0.0], [0.39402170622207217, 0.3043516221588848, 0.0], [0.4081041793030111, 0.29086397057182295, 0.0], [0.42418973317575387, 0.2804925367213136, 0.0], [0.4192266424898786, 0.2527379985072552, 0.0], [0.4090802353274594, 0.2323460911169658, 0.0], [0.3992815160520114, 0.21173990338173992, 0.0], [0.38527905825946634, 0.171175680926293, 0.0], [0.38479359771489124, 0.15094202586083685, 0.0], [0.38486308522160545, 0.13160554906355823, 0.0], [0.3854159702047642, 0.11016045290083347, 0.0], [0.38437358036209796, 0.0842756255957775, 0.0], [0.37213982673142726, 0.0683330336449822, 0.0], [0.364480880979052, 0.050603245684088936, 0.0], [0.37963678428673914, 0.035880692802962355, 0.0], [0.37927492077045655, 0.006330563839934674, 0.0], [0.37962962962962965, 0.0, 0.0], [0.3990740740740741, 0.0, 0.0], [0.4043166575303929, 0.017374031935027297, 0.0], [0.4122795069100327, 0.039982855211266814, 0.0], [0.41688964758463526, 0.06124430641791995, 0.0], [0.41483675252111685, 0.08088963268248343, 0.0], [0.42296258914843415, 0.13184066280759787, 0.0], [0.4304547752608189, 0.16500368614579322, 0.0], [0.435619873059154, 0.19020078306067437, 0.0], [0.4371210217143472, 0.20968749943011267, 0.0], [0.4528574464746929, 0.2201640974773047, 0.0], [0.46357062063000454, 0.23605648853564196, 0.0], [0.47501742508185535, 0.2507272326121305, 0.0], [0.48741557480733655, 0.2651260810910351, 0.0], [0.49930646626004144, 0.28062501Line truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

@@ -0,0 +1 @@
[[[0.8102453102453102, 0.6623376623376623, 0.0], [0.8391053391053391, 0.6515151515151515, 0.0], [0.8816738816738817, 0.6479076479076479, 0.0], [0.911976911976912, 0.6457431457431457, 0.0], [0.943001443001443, 0.6219336219336219, 0.0], [0.9581529581529582, 0.5952380952380952, 0.0], [0.9595959595959596, 0.564935064935065, 0.0], [0.93001443001443, 0.5562770562770563, 0.0], [0.8997113997113997, 0.5584415584415584, 0.0], [0.8679653679653679, 0.5569985569985569, 0.0], [0.8917748917748918, 0.5382395382395382, 0.0], [0.9213564213564214, 0.5317460317460317, 0.0], [0.9090909090909091, 0.5043290043290043, 0.0], [0.8773448773448773, 0.5028860028860029, 0.0], [0.8347763347763347, 0.4956709956709957, 0.0], [0.8023088023088023, 0.4956709956709957, 0.0], [0.7784992784992785, 0.47691197691197695, 0.0], [0.7662337662337663, 0.44877344877344877, 0.0], [0.7582972582972582, 0.41919191919191917, 0.0], [0.7481962481962482, 0.38961038961038963, 0.0], [0.7705627705627706, 0.3686868686868687, 0.0], [0.7994227994227994, 0.3578643578643579, 0.0], [0.8145743145743146, 0.32972582972582976, 0.0], [0.79004329004329, 0.3477633477633478, 0.0], [0.7561327561327561, 0.3528138528138528, 0.0], [0.7554112554112554, 0.3217893217893218, 0.0], [0.7777777777777778, 0.297979797979798, 0.0], [0.8001443001443002, 0.2777777777777778, 0.0], [0.8059163059163059, 0.24675324675324678, 0.0], [0.7914862914862915, 0.22005772005772006, 0.0], [0.7655122655122655, 0.23593073593073594, 0.0], [0.784992784992785, 0.25901875901875904, 0.0], [0.7633477633477633, 0.2828282828282828, 0.0], [0.7402597402597403, 0.30303030303030304, 0.0], [0.7215007215007215, 0.3268398268398268, 0.0], [0.6984126984126984, 0.3023088023088023, 0.0], [0.6565656565656566, 0.25613275613275616, 0.0], [0.6327561327561327, 0.2373737373737374, 0.0], [0.6305916305916306, 0.1897546897546898, 0.0], [0.6363636363636364, 0.15800865800865804, 0.0], [0.6522366522366523, 0.1305916305916306, 0.0], [0.6782106782106783, 0.11038961038961037, 0.0], [0.6991341991341992, 0.08874458874458879, 0.0], [0.6695526695526696, 0.08225108225108224, 0.0], [0.6392496392496393, 0.08441558441558439, 0.0], [0.6233766233766234, 0.1219336219336219, 0.0], [0.6103896103896104, 0.14935064935064934, 0.0], [0.5909090909090909, 0.1724386724386724, 0.0], [0.5793650793650794, 0.20057720057720058, 0.0], [0.5483405483405484, 0.20057720057720058, 0.0], [0.5202020202020202, 0.189033189033189, 0.0], [0.5079365079365079, 0.16089466089466087, 0.0], [0.4898989898989899, 0.13347763347763353, 0.0], [0.46176046176046176, 0.10245310245310246, 0.0], [0.44877344877344877, 0.07431457431457433, 0.0], [0.4538239538239538, 0.04401154401154406, 0.0], [0.4588744588744589, 0.01443001443001446, 0.0], [0.46320346320346323, 0.0, 0.0], [0.40404040404040403, 0.0, 0.0], [0.4083694083694084, 0.03679653679653683, 0.0], [0.4033189033189033, 0.07215007215007219, 0.0], [0.4163059163059163, 0.09956709956709953, 0.0], [0.424963924963925, 0.1298701298701299, 0.0], [0.42568542568542567, 0.16594516594516595, 0.0], [0.424963924963925, 0.1976911976911977, 0.0], [0.3708513708513709, 0.20490620490620493, 0.0], [0.33405483405483405, 0.20202020202020204, 0.0], [0.30014430014430016, 0.1976911976911977, 0.0], [0.23809523809523808, 0.19624819624819623, 0.0], [0.20707070707070707, 0.19985569985569984, 0.0], [0.1774891774891775, 0.20634920634920634, 0.0], [0.14862914862914864, 0.21500721500721504, 0.0], [0.12121212121212122, 0.2272727272727273, 0.0], [0.09379509379509379, 0.2453102453102453, 0.0], [0.07142857142857142, 0.2676767676767677, 0.0], [0.056998556998557, 0.2943722943722944, 0.0], [0.049783549783549784, 0.3246753246753247, 0.0], [0.05194805194805195, 0.354978354978355, 0.0], [0.07431457431457432, 0.38961038961038963, 0.0], [0.10101010101010101, 0.40404040404040403, 0.0], [0.13203463203463203, 0.41053391053391053, 0.0], [0.16305916305916307, 0.41053391053391053, 0.0], [0.19336219336219337, 0.40476190476190477, 0.0], [0.2215007215007215, 0.3939393939393939, 0.0], [0.18831168831168832, 0.3924963924963925, 0.0], [0.1471861471861472, 0.39466089466089466, 0.0], [0.11832611832611832, 0.386002886002886, 0.0], [0.09812409812409813, 0.36363636363636365, 0.0], [0.09956709956709957, 0.3333333333333333, 0.0], [0.11976911976911978, 0.31096681096681095, 0.0], [0.15007215007215008, 0.30303030303030304, 0.0], [0.18037518037518038, 0.2987012987012987, 0.0], [0.22727272727272727, 0.29653679653679654, 0.0], [0.2597402597402597, 0.2994227994227994, 0.0], [0.29004329004329005, 0.3037518037518038, 0.0], [0.3203463203463203, 0.31096681096681095, 0.0], [0.3492063492063492, 0.3217893217893218, 0.0], [0.37662337662337664, 0.3354978354978355, 0.0], [0.39826839826839827, 0.3564213564213564, 0.0], [0.4365079365079365, 0.39754689754689754, 0.0], [0.461038961038961, 0.417027417027417, 0.0], [0.48773448773448774, 0.43362193362193363, 0.0], [0.5165945165945166, 0.4444444444444445, 0.0], [0.5512265512265512, 0.45165945165945165, 0.0], [0.5851370851370852, 0.4538239538239538, 0.0], [0.6154401154401155, 0.4603Line truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="full" height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><line x1="0.14814814814814814" x2="0.14351851851851852" y1="0.8814814814814815" y2="0.8787037037037037" /><line x1="0.15555555555555556" x2="0.14814814814814814" y1="0.8814814814814815" y2="0.8814814814814815" /><line x1="0.14351851851851852" x2="0.1388888888888889" y1="0.8787037037037037" y2="0.8759259259259259" /><line x1="0.1388888888888889" x2="0.13425925925925927" y1="0.8759259259259259" y2="0.8787037037037037" /><line x1="0.13425925925925927" x2="0.12962962962962962" y1="0.8787037037037037" y2="0.8777777777777778" /><line x1="0.12962962962962962" x2="0.1259259259259259" y1="0.8777777777777778" y2="0.8740740740740741" /><line x1="0.1259259259259259" x2="0.125" y1="0.8740740740740741" y2="0.8694444444444445" /><line x1="0.125" x2="0.12962962962962962" y1="0.8694444444444445" y2="0.8629629629629629" /><line x1="0.12962962962962962" x2="0.13425925925925927" y1="0.8629629629629629" y2="0.862037037037037" /><line x1="0.13425925925925927" x2="0.1398148148148148" y1="0.862037037037037" y2="0.8583333333333333" /><line x1="0.1398148148148148" x2="0.14351851851851852" y1="0.8583333333333333" y2="0.8546296296296296" /><line x1="0.14351851851851852" x2="0.14814814814814814" y1="0.8546296296296296" y2="0.8518518518518519" /><line x1="0.14814814814814814" x2="0.15555555555555556" y1="0.8518518518518519" y2="0.8518518518518519" /><line x1="0.15555555555555556" x2="0.1574074074074074" y1="0.8518518518518519" y2="0.8416666666666667" /><line x1="0.1574074074074074" x2="0.15925925925925927" y1="0.8416666666666667" y2="0.837037037037037" /><line x1="0.15925925925925927" x2="0.16203703703703703" y1="0.837037037037037" y2="0.8324074074074074" /><line x1="0.16203703703703703" x2="0.16574074074074074" y1="0.8324074074074074" y2="0.8277777777777777" /><line x1="0.16574074074074074" x2="0.17037037037037037" y1="0.8277777777777777" y2="0.825" /><line x1="0.17037037037037037" x2="0.175" y1="0.825" y2="0.8240740740740741" /><line x1="0.175" x2="0.1824074074074074" y1="0.8240740740740741" y2="0.8231481481481482" /><line x1="0.1824074074074074" x2="0.1814814814814815" y1="0.8231481481481482" y2="0.8185185185185185" /><line x1="0.1814814814814815" x2="0.17962962962962964" y1="0.8185185185185185" y2="0.8138888888888889" /><line x1="0.17962962962962964" x2="0.17777777777777778" y1="0.8138888888888889" y2="0.8092592592592592" /><line x1="0.17777777777777778" x2="0.17685185185185184" y1="0.8092592592592592" y2="0.8037037037037037" /><line x1="0.17685185185185184" x2="0.175" y1="0.8037037037037037" y2="0.799074074074074" /><line x1="0.175" x2="0.17407407407407408" y1="0.799074074074074" y2="0.7935185185185185" /><line x1="0.17407407407407408" x2="0.17407407407407408" y1="0.7935185185185185" y2="0.7870370370370371" /><line x1="0.17407407407407408" x2="0.17314814814814813" y1="0.7870370370370371" y2="0.7722222222222223" /><line x1="0.17314814814814813" x2="0.1685185185185185" y1="0.7722222222222223" y2="0.7731481481481481" /><line x1="0.1685185185185185" x2="0.1638888888888889" y1="0.7731481481481481" y2="0.775" /><line x1="0.1638888888888889" x2="0.15833333333333333" y1="0.775" y2="0.7759259259259259" /><line x1="0.15833333333333333" x2="0.1527777777777778" y1="0.7759259259259259" y2="0.7759259259259259" /><line x1="0.1527777777777778" x2="0.14722222222222223" y1="0.7759259259259259" y2="0.775" /><line x1="0.14722222222222223" x2="0.1425925925925926" y1="0.775" y2="0.7731481481481481" /><line x1="0.1425925925925926" x2="0.13796296296296295" y1="0.7731481481481481" y2="0.7712962962962963" /><line x1="0.13796296296296295" x2="0.13148148148148148" y1="0.7712962962962963" y2="0.7666666666666667" /><line x1="0.13148148148148148" x2="0.12685185185185185" y1="0.7666666666666667" y2="0.762962962962963" /><line x1="0.12685185185185185" x2="0.12407407407407407" y1="0.762962962962963" y2="0.7583333333333333" /><line x1="0.12407407407407407" x2="0.12129629629629629" y1="0.7583333333333333" y2="0.7537037037037037" /><line x1="0.12129629629629629" x2="0.11944444444444445" y1="0.7537037037037037" y2="0.7472222222222222" /><line x1="0.11944444444444445" x2="0.11851851851851852" y1="0.7472222222222222" y2="0.7416666666666667" /><line x1="0.11851851851851852" x2="0.1175925925925926" y1="0.7416666666666667" y2="0.7351851851851852" /><line x1="0.1175925925925926" x2="0.11851851851851852" y1="0.7351851851851852" y2="0.7305555555555555" /><line x1="0.11851851851851852" x2="0.11296296296296296" y1="0.7305555555555555" y2="0.7314814814814815" /><line x1="0.11296296296296296" x2="0.10740740740740741" y1="0.7314814814814815" y2="0.7324074074074074" /><line x1="0.10740740740740741" x2="0.09444444444444444" y1="0.7324074074074074" y2="0.7324074074074074" /><line x1="0.09444444444444444" x2="0.08888888888888889" y1="0.7324074074074074" y2="0.7314814814814815" /><line x1="0.0Line truncated

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="full" height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><line x1="0.26296296296296295" x2="0.2537037037037037" y1="0.5833333333333334" y2="0.5824074074074074" /><line x1="0.26944444444444443" x2="0.26296296296296295" y1="0.5833333333333334" y2="0.5833333333333334" /><line x1="0.2537037037037037" x2="0.24537037037037038" y1="0.5824074074074074" y2="0.5814814814814815" /><line x1="0.24537037037037038" x2="0.23981481481481481" y1="0.5814814814814815" y2="0.5805555555555556" /><line x1="0.23981481481481481" x2="0.2351851851851852" y1="0.5805555555555556" y2="0.5787037037037037" /><line x1="0.2351851851851852" x2="0.22962962962962963" y1="0.5787037037037037" y2="0.5777777777777777" /><line x1="0.22962962962962963" x2="0.225" y1="0.5777777777777777" y2="0.5768518518518518" /><line x1="0.225" x2="0.21944444444444444" y1="0.5768518518518518" y2="0.575925925925926" /><line x1="0.21944444444444444" x2="0.21481481481481482" y1="0.575925925925926" y2="0.5740740740740741" /><line x1="0.21481481481481482" x2="0.20925925925925926" y1="0.5740740740740741" y2="0.5731481481481482" /><line x1="0.20925925925925926" x2="0.20462962962962963" y1="0.5731481481481482" y2="0.5712962962962963" /><line x1="0.20462962962962963" x2="0.2" y1="0.5712962962962963" y2="0.5685185185185185" /><line x1="0.2" x2="0.19537037037037036" y1="0.5685185185185185" y2="0.5675925925925925" /><line x1="0.19537037037037036" x2="0.18981481481481483" y1="0.5675925925925925" y2="0.5657407407407408" /><line x1="0.18981481481481483" x2="0.18518518518518517" y1="0.5657407407407408" y2="0.562962962962963" /><line x1="0.18518518518518517" x2="0.17962962962962964" y1="0.562962962962963" y2="0.5611111111111111" /><line x1="0.17962962962962964" x2="0.17407407407407408" y1="0.5611111111111111" y2="0.5574074074074075" /><line x1="0.17407407407407408" x2="0.1685185185185185" y1="0.5574074074074075" y2="0.5546296296296296" /><line x1="0.1685185185185185" x2="0.1638888888888889" y1="0.5546296296296296" y2="0.5518518518518518" /><line x1="0.1638888888888889" x2="0.15925925925925927" y1="0.5518518518518518" y2="0.549074074074074" /><line x1="0.15925925925925927" x2="0.15462962962962962" y1="0.549074074074074" y2="0.5462962962962963" /><line x1="0.15462962962962962" x2="0.14907407407407408" y1="0.5462962962962963" y2="0.5425925925925926" /><line x1="0.14907407407407408" x2="0.14351851851851852" y1="0.5425925925925926" y2="0.5388888888888889" /><line x1="0.14351851851851852" x2="0.1388888888888889" y1="0.5388888888888889" y2="0.5361111111111111" /><line x1="0.1388888888888889" x2="0.13518518518518519" y1="0.5361111111111111" y2="0.5324074074074074" /><line x1="0.13518518518518519" x2="0.13055555555555556" y1="0.5324074074074074" y2="0.5287037037037037" /><line x1="0.13055555555555556" x2="0.12314814814814815" y1="0.5287037037037037" y2="0.5222222222222223" /><line x1="0.12314814814814815" x2="0.11388888888888889" y1="0.5222222222222223" y2="0.5138888888888888" /><line x1="0.11388888888888889" x2="0.11018518518518519" y1="0.5138888888888888" y2="0.5101851851851852" /><line x1="0.11018518518518519" x2="0.10648148148148148" y1="0.5101851851851852" y2="0.5064814814814815" /><line x1="0.10648148148148148" x2="0.10277777777777777" y1="0.5064814814814815" y2="0.5018518518518519" /><line x1="0.10277777777777777" x2="0.09907407407407408" y1="0.5018518518518519" y2="0.4981481481481482" /><line x1="0.09907407407407408" x2="0.0962962962962963" y1="0.4981481481481482" y2="0.4935185185185185" /><line x1="0.0962962962962963" x2="0.09166666666666666" y1="0.4935185185185185" y2="0.487962962962963" /><line x1="0.09166666666666666" x2="0.08888888888888889" y1="0.487962962962963" y2="0.48333333333333334" /><line x1="0.08888888888888889" x2="0.08425925925925926" y1="0.48333333333333334" y2="0.4777777777777778" /><line x1="0.08425925925925926" x2="0.08148148148148149" y1="0.4777777777777778" y2="0.47314814814814815" /><line x1="0.08148148148148149" x2="0.0787037037037037" y1="0.47314814814814815" y2="0.4685185185185185" /><line x1="0.0787037037037037" x2="0.07685185185185185" y1="0.4685185185185185" y2="0.4638888888888889" /><line x1="0.07685185185185185" x2="0.07314814814814814" y1="0.4638888888888889" y2="0.45925925925925926" /><line x1="0.07314814814814814" x2="0.07222222222222222" y1="0.45925925925925926" y2="0.4546296296296296" /><line x1="0.07222222222222222" x2="0.06851851851851852" y1="0.4546296296296296" y2="0.45" /><line x1="0.06851851851851852" x2="0.06666666666666667" y1="0.45" y2="0.44537037037037036" /><line x1="0.06666666666666667" x2="0.06481481481481481" y1="0.44537037037037036" y2="0.4398148148148148" /><line x1="0.06481481481481481" x2="0.06296296296296296" y1="0.4398148148148148" y2="0.4351851851851852" /><line x1="0.06296296296296296" x2="0.06018518518518518" y1="0.4351851851851852" y2="0.4305555555555556" /><line x1="0.06018518518518518Line truncated

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="full" height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><line x1="0.12060185185185185" x2="0.1175925925925926" y1="0.7405092592592593" y2="0.7407407407407407" /><line x1="0.1175925925925926" x2="0.11527777777777778" y1="0.7407407407407407" y2="0.7398148148148148" /><line x1="0.11296296296296296" x2="0.11064814814814815" y1="0.7388888888888889" y2="0.737037037037037" /><line x1="0.11527777777777778" x2="0.11296296296296296" y1="0.7398148148148148" y2="0.7388888888888889" /><line x1="0.11064814814814815" x2="0.10833333333333334" y1="0.737037037037037" y2="0.7351851851851852" /><line x1="0.10833333333333334" x2="0.10694444444444443" y1="0.7351851851851852" y2="0.7328703703703703" /><line x1="0.10555555555555556" x2="0.10554108796296297" y1="0.7305555555555555" y2="0.7286458333333332" /><line x1="0.10694444444444443" x2="0.10555555555555556" y1="0.7328703703703703" y2="0.7305555555555555" /><line x1="0.10462962962962963" x2="0.10092592592592593" y1="0.6083333333333333" y2="0.6027777777777777" /><line x1="0.10486111111111111" x2="0.10462962962962963" y1="0.6388888888888888" y2="0.6083333333333333" /><line x1="0.10092592592592593" x2="0.09537037037037037" y1="0.6027777777777777" y2="0.5962962962962963" /><line x1="0.09537037037037037" x2="0.09259259259259259" y1="0.5962962962962963" y2="0.5916666666666667" /><line x1="0.09259259259259259" x2="0.08981481481481482" y1="0.5916666666666667" y2="0.587037037037037" /><line x1="0.08981481481481482" x2="0.08703703703703704" y1="0.587037037037037" y2="0.5824074074074074" /><line x1="0.08703703703703704" x2="0.08425925925925926" y1="0.5824074074074074" y2="0.5777777777777777" /><line x1="0.08425925925925926" x2="0.0824074074074074" y1="0.5777777777777777" y2="0.5731481481481482" /><line x1="0.0824074074074074" x2="0.08055555555555556" y1="0.5731481481481482" y2="0.5685185185185185" /><line x1="0.08055555555555556" x2="0.0787037037037037" y1="0.5685185185185185" y2="0.5638888888888889" /><line x1="0.0787037037037037" x2="0.07592592592592592" y1="0.5638888888888889" y2="0.5592592592592592" /><line x1="0.07592592592592592" x2="0.075" y1="0.5592592592592592" y2="0.5546296296296296" /><line x1="0.075" x2="0.07314814814814814" y1="0.5546296296296296" y2="0.5481481481481482" /><line x1="0.07314814814814814" x2="0.07222222222222222" y1="0.5481481481481482" y2="0.5407407407407407" /><line x1="0.07222222222222222" x2="0.0712962962962963" y1="0.5407407407407407" y2="0.5342592592592592" /><line x1="0.0712962962962963" x2="0.0712962962962963" y1="0.5342592592592592" y2="0.525" /><line x1="0.0712962962962963" x2="0.0712962962962963" y1="0.525" y2="0.5148148148148148" /><line x1="0.0712962962962963" x2="0.07222222222222222" y1="0.5148148148148148" y2="0.5055555555555555" /><line x1="0.07222222222222222" x2="0.07314814814814814" y1="0.5055555555555555" y2="0.4981481481481482" /><line x1="0.07314814814814814" x2="0.075" y1="0.4981481481481482" y2="0.4935185185185185" /><line x1="0.075" x2="0.07592592592592592" y1="0.4935185185185185" y2="0.487962962962963" /><line x1="0.07592592592592592" x2="0.07685185185185185" y1="0.487962962962963" y2="0.4824074074074074" /><line x1="0.07685185185185185" x2="0.0787037037037037" y1="0.4824074074074074" y2="0.47685185185185186" /><line x1="0.0787037037037037" x2="0.08148148148148149" y1="0.47685185185185186" y2="0.4722222222222222" /><line x1="0.08148148148148149" x2="0.08333333333333333" y1="0.4722222222222222" y2="0.4675925925925926" /><line x1="0.08333333333333333" x2="0.08611111111111111" y1="0.4675925925925926" y2="0.46296296296296297" /><line x1="0.08611111111111111" x2="0.08888888888888889" y1="0.46296296296296297" y2="0.4583333333333333" /><line x1="0.08888888888888889" x2="0.09166666666666666" y1="0.4583333333333333" y2="0.4537037037037037" /><line x1="0.09166666666666666" x2="0.09444444444444444" y1="0.4537037037037037" y2="0.44907407407407407" /><line x1="0.09444444444444444" x2="0.09722222222222222" y1="0.44907407407407407" y2="0.4444444444444444" /><line x1="0.09722222222222222" x2="0.10092592592592593" y1="0.4444444444444444" y2="0.4388888888888889" /><line x1="0.10092592592592593" x2="0.1037037037037037" y1="0.4388888888888889" y2="0.43425925925925923" /><line x1="0.1037037037037037" x2="0.10648148148148148" y1="0.43425925925925923" y2="0.42962962962962964" /><line x1="0.10648148148148148" x2="0.10925925925925926" y1="0.42962962962962964" y2="0.425" /><line x1="0.10925925925925926" x2="0.11481481481481481" y1="0.425" y2="0.41944444444444445" /><line x1="0.11481481481481481" x2="0.12314814814814815" y1="0.41944444444444445" y2="0.4101851851851852" /><line x1="0.12314814814814815" x2="0.12777777777777777" y1="0.4101851851851852" y2="0.4074074074074074" /><line x1="0.12777777777777777" x2="0.13240740740740742" y1="0.4074074074074074" y2="0.4046296296296296" /><line x1="0.13240740740740742" x2="0.13703703Line truncated

After

Width:  |  Height:  |  Size: 67 KiB

+1
View File
@@ -0,0 +1 @@
[[[0.3359440158378602, 0.9210224383966962, 0.0], [0.32330958658996634, 0.9062254765507053, 0.0], [0.3076839760844945, 0.8837254786449036, 0.0], [0.31354971286607275, 0.8607661751481109, 0.0], [0.321406620993005, 0.8429419861529877, 0.0], [0.32331842290331164, 0.8224977474697632, 0.0], [0.32383955805200093, 0.803573760300344, 0.0], [0.3214512431473188, 0.7847919066507826, 0.0], [0.3219624012166767, 0.7658660359772153, 0.0], [0.32247311506444515, 0.7469383179895955, 0.0], [0.32060640677825175, 0.7269665663626877, 0.0], [0.3211139611840756, 0.7080391290491052, 0.0], [0.32486052958534073, 0.6898226088089582, 0.0], [0.3325492432956687, 0.6690834054447675, 0.0], [0.33425509333256087, 0.6506726147545958, 0.0], [0.3380118435267127, 0.6324533310164088, 0.0], [0.3385403892661957, 0.6135149670964838, 0.0], [0.3370399633761822, 0.5943831813106111, 0.0], [0.3367280766910994, 0.5757814214734019, 0.0], [0.3381381640182549, 0.5565156996462688, 0.0], [0.3398736149960969, 0.5381080515959777, 0.0], [0.3445211856902299, 0.5195630711069649, 0.0], [0.3507443476854958, 0.4974556659594086, 0.0], [0.35657710993872394, 0.4794221759084357, 0.0], [0.36122999915700127, 0.4608587949567714, 0.0], [0.36798728755375926, 0.4375350736268683, 0.0], [0.375892094751611, 0.41968675895754504, 0.0], [0.3778798855765219, 0.3991953801466888, 0.0], [0.3784851610461282, 0.3802175523095769, 0.0], [0.3725103941819698, 0.35687375214274614, 0.0], [0.3702425192906588, 0.3380143889285765, 0.0], [0.36477820959132895, 0.3184019397736501, 0.0], [0.3630146222022237, 0.2983540190402495, 0.0], [0.35579264071058164, 0.2693744713203477, 0.0], [0.35005184811024936, 0.2506824310015569, 0.0], [0.34194213463440887, 0.23087115438175282, 0.0], [0.33940358765735706, 0.21202646827870036, 0.0], [0.3382782037371713, 0.1908394605862153, 0.0], [0.33579137320381025, 0.1717331870672063, 0.0], [0.3341910832675664, 0.1525202643609999, 0.0], [0.32651436498426833, 0.1291014630469347, 0.0], [0.32182488405793674, 0.10776361590173708, 0.0], [0.3129514206239005, 0.05987638600351459, 0.0], [0.3128480315922206, 0.02758337985395738, 0.0], [0.2978109446137065, 0.015794175098239823, 0.0], [0.3076216712580349, 0.0, 0.0], [0.37281910009182734, 0.0, 0.0], [0.37475623585072704, 0.02019234841347489, 0.0], [0.35066797301342756, 0.024678023994566034, 0.0], [0.345503650810237, 0.04614821977306916, 0.0], [0.3459196788540045, 0.07113476140514413, 0.0], [0.3543711225143529, 0.09127687362371499, 0.0], [0.3625732051273669, 0.13016953623313438, 0.0], [0.37069202250719313, 0.14652134200159217, 0.0], [0.38712828249988385, 0.1952866147446364, 0.0], [0.3883408498121473, 0.2138145248443017, 0.0], [0.4011145654549177, 0.22752144114485207, 0.0], [0.41736490553430144, 0.23684426614683915, 0.0], [0.4147449445228406, 0.21718839719446598, 0.0], [0.42064694931514013, 0.19919365405993028, 0.0], [0.4325598346081077, 0.17891464100737828, 0.0], [0.4508766243858671, 0.18566975979818517, 0.0], [0.4693976261899756, 0.19039734599308575, 0.0], [0.48195109029697036, 0.20527222074124524, 0.0], [0.4927776740744, 0.22080135943523474, 0.0], [0.4962073424380454, 0.2401296404154867, 0.0], [0.5018890917537571, 0.25761120173958213, 0.0], [0.5276700289072956, 0.2478309341026045, 0.0], [0.5478001437894935, 0.24904900974237523, 0.0], [0.5642048892866172, 0.25855934852810986, 0.0], [0.5823949582874507, 0.2546774961509056, 0.0], [0.600913028844294, 0.2516873534469379, 0.0], [0.62060417124299, 0.24922447379722482, 0.0], [0.6401837997697901, 0.2517281441772848, 0.0], [0.6583771291356296, 0.2479149142108905, 0.0], [0.6780741636202686, 0.245529608561992, 0.0], [0.6969982802662241, 0.24635383173496667, 0.0], [0.7153781363733951, 0.24837067319900116, 0.0], [0.7342028676965743, 0.2463117471416321, 0.0], [0.7536641098782242, 0.2459773744957077, 0.0], [0.7748463943641791, 0.24500667594427183, 0.0], [0.7959351401063506, 0.241133154118492, 0.0], [0.8149446624769359, 0.24487819394520238, 0.0], [0.8342682083976085, 0.24949167328598584, 0.0], [0.830835117088705, 0.26935876055504526, 0.0], [0.8124255474954948, 0.27517914891994294, 0.0], [0.7924241980110471, 0.2766944255608475, 0.0], [0.7735096921470452, 0.2758509593649, 0.0], [0.7361895332162711, 0.28082421296436144, 0.0], [0.7151095056149884, 0.28469905867614653, 0.0], [0.6966167727100511, 0.2876307132273694, 0.0], [0.6777081728377085, 0.28679779784180326, 0.0], [0.6517003784003726, 0.290565257755461, 0.0], [0.6308646566752287, 0.29243734853444037, 0.0], [0.6021825394273206, 0.30219582459934985, 0.0], [0.5832918281440399, 0.30928177331154166, 0.0], [0.5645110317792913, 0.31144767936965084, 0.0], [0.5467056007819816, 0.3162027747867516, 0.0], [0.5358267545999726, 0.33405792062102874, 0.0], [0.5236482872497418, 0.34847937563462994, 0.0], [0.5136374618145731, 0.36600017123770795, 0.0], [0.5097627094224002, 0.3841465416234051, 0.0], [0.5041823054386294, 0.4029479318603322, 0.0], [0.49858792982459504, 0.4267085592646809, 0.0], [0.49272067112878676, 0.4446458121389922, 0.0], [0.4953849708947529, 0.4642659940Line truncated
@@ -0,0 +1,937 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import sys\n",
"import json\n",
"from matplotlib import pyplot as plt\n",
"import meshplot as mp\n",
"import cv2\n",
"import svgwrite\n",
"import igl\n",
"sys.path.append(\"../src\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. BFGS Approximated Hessian Matirx and its Inverse Matrix"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def f(x):\n",
" return np.linalg.norm(x) ** 2\n",
"\n",
"def grad_f(x):\n",
" return 2 * x"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from bfgs import compute_approximate_hessian_matrix\n",
"x = np.array([1, 1])\n",
"p = -grad_f(x)\n",
"alpha = 1.0\n",
"y = x + alpha * p\n",
"sk = (y - x).reshape(2, 1)\n",
"yk = (grad_f(y) - grad_f(x)).reshape(2, 1)\n",
"Bk = np.identity(2)\n",
"Bnew = compute_approximate_hessian_matrix(sk, yk, Bk)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from bfgs import compute_inverse_approximate_hessian_matrix\n",
"x = np.array([1, 1])\n",
"p = -grad_f(x)\n",
"alpha = 1.0\n",
"y = x + alpha * p\n",
"sk = (y - x).reshape(2, 1)\n",
"yk = (grad_f(y) - grad_f(x)).reshape(2, 1)\n",
"invBk = np.identity(2)\n",
"invBnew = compute_inverse_approximate_hessian_matrix(sk, yk, invBk)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The matrix multiplation of the two matrix should be indentity matrix."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1. 0.]\n",
" [0. 1.]]\n"
]
}
],
"source": [
"print(Bnew @ invBnew)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. Gradient Descent with Backtracking Line Search "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"with open('../data/dinosaur.json', 'r') as infile:\n",
" [V, F] = json.load(infile)\n",
" V = np.array(V)\n",
" F = np.array(F)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from geometry import compute_mesh_centroid\n",
"\n",
"shader = {\"flat\":True, # Flat or smooth shading of triangles\n",
" \"wireframe\": True, \"wire_width\": 0.03, \"wire_color\": \"black\", # Wireframe rendering\n",
" \"width\": 600, \"height\": 600, # Size of the viewer canvas\n",
" \"antialias\": True, # Antialising, might not work on all GPUs\n",
" \"scale\": 2.0, # Scaling of the model\n",
" \"side\": \"DoubleSide\", # FrontSide, BackSide or DoubleSide rendering of the triangles\n",
" \"colormap\": \"viridis\", \"normalize\": [None, None], # Colormap and normalization for colors\n",
" \"background\": \"#ffffff\", # Background color of the canvas\n",
" \"line_width\": 1.0, \"line_color\": \"black\", # Line properties of overlay lines\n",
" \"bbox\": False, # Enable plotting of bounding box\n",
" \"point_color\": \"red\", \"point_size\": 0.01 # Point properties of overlay points\n",
" }\n",
"\n",
"def draw_meshes_comparison(V1, F1, V2, F2, color1, color2):\n",
" mesh_plot = mp.plot(V1, F1, c = color1, return_plot=True)\n",
" mesh_plot.add_mesh(V2, F2, c = color2, shading=shader)\n",
" \n",
" center0 = np.array(compute_mesh_centroid(V2, F2))\n",
" center1 = center0.copy()\n",
" center1[1] = 0\n",
" vertices = np.vstack([center0, center1])\n",
" mesh_plot.add_points(vertices, shading={\"point_color\": \"black\", \"point_size\": 0.1})\n",
" mesh_plot.add_edges(vertices, np.array([[0, 1]]), shading={\"line_color\": \"black\", \"line_width\" : 0.5});"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4360d9c4eb7044e193bea27ba4cdcb2f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.5046897…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3092501163482666\n"
]
}
],
"source": [
"from geometry import compute_center_support_line\n",
"from linesearch import gradient_descent_with_line_search\n",
"x_csl = compute_center_support_line(V)\n",
"[V1, F, objective, running_time] = gradient_descent_with_line_search(V, F, x_csl, w = 10, obj_tol = 1E-8, theta = 1.0, beta = 0.5, c = 0.02, iter = 10000)\n",
"\n",
"mesh_plot = draw_meshes_comparison(V, F, V1, F, np.array([0.3, 0.3, 0.3]), np.array([1.0, 1.0, 0]))\n",
"print(running_time)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"plt.plot(objective)\n",
"plt.xlabel(\"number of iteration\")\n",
"plt.ylabel(\"objective energy\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. BGFS with Backtracking Line Search "
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_629/1214273749.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbfgs\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mbfgs_with_line_search\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mx_csl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_center_support_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mV1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobjective\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrunning_time\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbfgs_with_line_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj_tol\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1E-8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtheta\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.02\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mmesh_plot\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdraw_meshes_comparison\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mV1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/bfgs.py\u001b[0m in \u001b[0;36mbfgs_with_line_search\u001b[0;34m(V, F, x_csl, w, obj_tol, theta, beta, c, iter)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcompute_optimization_objective\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 166\u001b[0;31m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbacktracking_line_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 167\u001b[0m \u001b[0mx_cm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_mesh_centroid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/linesearch.py\u001b[0m in \u001b[0;36mbacktracking_line_search\u001b[0;34m(p, grad, x, theta, beta, c, f, *arg)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtheta\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0mx1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mwhile\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mevaluate_armijo_rule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 74\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0malpha\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[0mx1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0malpha\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/bfgs.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0munflatten\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 165\u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcompute_optimization_objective\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 166\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbacktracking_line_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0mx_cm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_mesh_centroid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/optimization.py\u001b[0m in \u001b[0;36mcompute_optimization_objective\u001b[0;34m(V, F, E, x_csl, L0, w)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0mE_eq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_equilibrium_energy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 34\u001b[0;31m \u001b[0mE_sh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_shape_energy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 35\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mE_eq\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mE_sh\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 36\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/energies.py\u001b[0m in \u001b[0;36mcompute_shape_energy\u001b[0;34m(V, E, L)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0mThe\u001b[0m \u001b[0menergy\u001b[0m \u001b[0mE_sh\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mcurrent\u001b[0m \u001b[0mconfiguration\u001b[0m \u001b[0mV\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m \"\"\"\n\u001b[0;32m--> 112\u001b[0;31m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_edges_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 113\u001b[0m \u001b[0mLf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0me_vec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/energies.py\u001b[0m in \u001b[0;36mcompute_edges_length\u001b[0;34m(V, E)\u001b[0m\n\u001b[1;32m 61\u001b[0m \"\"\"\n\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 63\u001b[0;31m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnorm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mV\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 64\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mnorm\u001b[0;34m(*args, **kwargs)\u001b[0m\n",
"\u001b[0;32m/opt/conda/envs/gc_course_env/lib/python3.9/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36mnorm\u001b[0;34m(x, ord, axis, keepdims)\u001b[0m\n\u001b[1;32m 2559\u001b[0m \u001b[0;31m# special case for speedup\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2560\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2561\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreduce\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkeepdims\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2562\u001b[0m \u001b[0;31m# None of the str-type keywords for ord ('fro', 'nuc')\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2563\u001b[0m \u001b[0;31m# are valid for vectors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"from geometry import compute_center_support_line\n",
"from bfgs import bfgs_with_line_search\n",
"x_csl = compute_center_support_line(V)\n",
"[V1, F, objective, running_time] = bfgs_with_line_search(V, F, x_csl, w = 10, obj_tol = 1E-8, theta = 1.0, beta = 0.5, c = 0.02, iter = 10)\n",
"\n",
"mesh_plot = draw_meshes_comparison(V, F, V1, F, np.array([0.3, 0.3, 0.3]), np.array([1.0, 1.0, 0]))\n",
"print(running_time)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"plt.plot(objective)\n",
"plt.xlabel(\"number of iteration\")\n",
"plt.ylabel(\"objective energy\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4. Create your own Mesh"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.1 Load the image"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#read the image\n",
"image_path = \"../data/dance.png\"\n",
"img = cv2.imread(image_path, 1) \n",
"\n",
"# convert the image to grey scale\n",
"imgrey = 255 - cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n",
"\n",
"# show image\n",
"plt.figure(figsize = (10, 10))\n",
"plt.imshow(imgrey)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.2 Make Flat Bottom Line"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#cut from Y = maxX\n",
"maxX = 940\n",
"imcut = imgrey.copy()\n",
"imcut[maxX : imcut.shape[0] + 1, :] = 0\n",
"\n",
"# show image\n",
"plt.figure(figsize = (10, 10))\n",
"plt.imshow(imcut)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.3 Extract and Simplify the Boundary Curves"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To simplfy the boundary curves of the final mesh, we collapse the edge if its edge length is smaller than edge_length_tot."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"edge_length_tot = 10.0"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fdbafdb8f40>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Extrac Boundary\n",
"ret, thresh = cv2.threshold(imcut, 127, 255, 0)\n",
"contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
"plt.figure(figsize = (10, 10))\n",
"imContour = np.zeros(imcut.shape)\n",
"\n",
"# Compute Point With Highest Y coordinate\n",
"maxY = 0\n",
"for k, _ in enumerate(contours):\n",
" current_points = contours[k][:, 0]\n",
" for pt in current_points:\n",
" maxY = max(pt[1], maxY)\n",
" \n",
"boundary_points = []\n",
"\n",
"# draw countour\n",
"for k, _ in enumerate(contours):\n",
" trimmed_points = []\n",
" current_points = contours[k][:, 0]\n",
" prev_pt = np.array(current_points[-1])\n",
" for pt in current_points:\n",
" curr_pt = np.array(pt)\n",
" if np.linalg.norm(prev_pt - curr_pt) > edge_length_tot or pt[1] == maxY:\n",
" prev_pt = curr_pt\n",
" trimmed_points.append([pt[0], pt[1]])\n",
" \n",
" contours[k] = np.array([trimmed_points])\n",
" if contours[k].shape[1] > 0:\n",
" imContour = cv2.drawContours(imContour, contours, k, (255, 255, 255), 6)\n",
" boundary_points.append(trimmed_points)\n",
"\n",
" \n",
"# scale boundary points\n",
"scale = max(imcut.shape[0], imcut.shape[1])\n",
"for pts in boundary_points:\n",
" for pt in pts:\n",
" pt[0] /= scale\n",
" pt[1] = (maxY - pt[1]) / scale\n",
" \n",
"plt.imshow(imContour)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.4 Find Holes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some curves stored in boundary_points refers to holes in the mesh, we put their indices in to holes_indices array to compute the centroid of the holes for late remeshing. If the image has no hole, just set holes_indices to be empty list."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"holes_indices = [1]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"Holes = []\n",
"for k in holes_indices:\n",
" ct = np.array([0, 0], dtype = float)\n",
" for pt in boundary_points[k]:\n",
" ct += np.array(pt, dtype = float)\n",
" ct /= len(boundary_points[k])\n",
" Holes.append([ct[0], ct[1]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.5 Draw Mesh"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"from geometry import compute_mesh_centroid, compute_center_support_line\n",
"def draw_mesh(V, F):\n",
" shading = {\"flat\":True, # Flat or smooth shading of triangles\n",
" \"wireframe\":True, \"wire_width\": 0.03, \"wire_color\": \"black\", # Wireframe rendering\n",
" \"width\": 600, \"height\": 600, # Size of the viewer canvas\n",
" \"antialias\": True, # Antialising, might not work on all GPUs\n",
" \"scale\": 2.0, # Scaling of the model\n",
" \"side\": \"DoubleSide\", # FrontSide, BackSide or DoubleSide rendering of the triangles\n",
" \"colormap\": \"viridis\", \"normalize\": [None, None], # Colormap and normalization for colors\n",
" \"background\": \"#ffffff\", # Background color of the canvas\n",
" \"line_width\": 1.0, \"line_color\": \"black\", # Line properties of overlay lines\n",
" \"bbox\": False, # Enable plotting of bounding box\n",
" \"point_color\": \"red\", \"point_size\": 0.01 # Point properties of overlay points\n",
" }\n",
" p = mp.plot(V, F, shading=shading, return_plot=True)\n",
" center0 = np.array(compute_mesh_centroid(V, F))\n",
" center1 = center0.copy()\n",
" center1[1] = 0\n",
" vertices = np.vstack([center0, center1])\n",
" p.add_points(vertices, shading={\"point_color\": \"black\", \"point_size\": 0.1})\n",
" p.add_edges(vertices, np.array([[0, 1]]), shading={\"line_color\": \"black\", \"line_width\" : 0.5});"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2d78d5509cd3442db7397fb4bd8b570f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.3245370…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from utility import triangulate_mesh\n",
"[V, F] = triangulate_mesh(boundary_points, Holes, 0.001)\n",
"draw_mesh(V, F)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.6 Save as SVG"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following code is for outputing the svg files.\n",
"\n",
"The unit in the following svg file is mm. A point (100, 100) refers to a point (10 cm, 10 cm).\n",
"\n",
"You have to write code to generate slits by yourself to provide off-plane stability for your laser cutting model."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"dwg = svgwrite.Drawing('dance.svg')\n",
"for Es in igl.boundary_facets(F):\n",
" p0 = V[Es[0]]\n",
" p1 = V[Es[1]]\n",
" dwg.add(dwg.line((p0[0], p0[1]), (p1[0], p1[1])))\n",
"dwg.save()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 5. Design your own Mesh"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Please design 3 different meshes that are original not equilibrium.\n",
"\n",
"Try to optimize them to be equilibrium and report it in your pdf handin."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"def handle_img(name,holes_count=0): \n",
" #read the image\n",
" image_path = \"../data/\"+name+\".png\"\n",
" img = cv2.imread(image_path, 1) \n",
"\n",
" # convert the image to grey scale\n",
" imgrey = 255 - cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n",
"\n",
" # show image\n",
" plt.figure(figsize = (10, 10))\n",
" plt.imshow(imgrey)\n",
" plt.show()\n",
" #cut from Y = maxX\n",
" maxX = 995\n",
" imcut = imgrey.copy()\n",
" imcut[maxX : imcut.shape[0] + 1, :] = 0\n",
"\n",
" # show image\n",
" plt.figure(figsize = (10, 10))\n",
" plt.imshow(imcut)\n",
" plt.show()\n",
" edge_length_tot = 5.0\n",
" # Extrac Boundary\n",
" ret, thresh = cv2.threshold(imcut, 127, 255, 0)\n",
" contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
" plt.figure(figsize = (10, 10))\n",
" imContour = np.zeros(imcut.shape)\n",
"\n",
" # Compute Point With Highest Y coordinate\n",
" maxY = 0\n",
" for k, _ in enumerate(contours):\n",
" current_points = contours[k][:, 0]\n",
" for pt in current_points:\n",
" maxY = max(pt[1], maxY)\n",
" \n",
" boundary_points = []\n",
"\n",
" # draw countour\n",
" for k, _ in enumerate(contours):\n",
" trimmed_points = []\n",
" current_points = contours[k][:, 0]\n",
" prev_pt = np.array(current_points[-1])\n",
" for pt in current_points:\n",
" curr_pt = np.array(pt)\n",
" if np.linalg.norm(prev_pt - curr_pt) > edge_length_tot or pt[1] == maxY:\n",
" prev_pt = curr_pt\n",
" trimmed_points.append([pt[0], pt[1]])\n",
" \n",
" contours[k] = np.array([trimmed_points])\n",
" if contours[k].shape[1] > 0:\n",
" imContour = cv2.drawContours(imContour, contours, k, (255, 255, 255), 6)\n",
" boundary_points.append(trimmed_points)\n",
"\n",
" \n",
" # scale boundary points\n",
" scale = max(imcut.shape[0], imcut.shape[1])\n",
" for pts in boundary_points:\n",
" for pt in pts:\n",
" pt[0] /= scale\n",
" pt[1] = (maxY - pt[1]) / scale\n",
" \n",
" plt.imshow(imContour)\n",
" \n",
" holes_indices = np.arange(holes_count)\n",
" Holes = []\n",
" for k in holes_indices:\n",
" ct = np.array([0, 0], dtype = float)\n",
" for pt in boundary_points[k]:\n",
" ct += np.array(pt, dtype = float)\n",
" ct /= len(boundary_points[k])\n",
" Holes.append([ct[0], ct[1]])\n",
" \n",
" \n",
" [V, F] = triangulate_mesh(boundary_points, Holes, 0.001)\n",
" draw_mesh(V, F)\n",
" \n",
" dwg = svgwrite.Drawing('../data/'+name+'.svg')\n",
" for Es in igl.boundary_facets(F):\n",
" p0 = V[Es[0]]\n",
" p1 = V[Es[1]]\n",
" dwg.add(dwg.line((p0[0], p0[1]), (p1[0], p1[1])))\n",
" dwg.save()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0d379ea2132843419b9678842b7dc320",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.2763888…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"handle_img(\"drawA\",15)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABAKklEQVR4nO3deXhcZf3+8fdnlkz2tOmaNt0obenCUlrZQaDsIiCIAiIoYL8qfkUFEZSv/lBUBEUU3BAUcGNRkLLIYkFB9gIFWrrvadMlTbMnk5k5z++PjBqxtD2ZJCczc7+uq1cmJ5PM/fRKcuec85znmHMOERERP0JBBxARkeyj8hAREd9UHiIi4pvKQ0REfFN5iIiIbyoPERHxrd/Lw8xOMrNlZrbSzK7q79cXEZHMWX9e52FmYWA5cDxQA7wKnOuce6ffQoiISMb6e8/jIGClc261c64TuAc4vZ8ziIhIhiL9/HqjgQ3d3q8BDn73k8xsLjAXIEx4VjHl/ZNORET+pYNWOl3cdvax/i6PnYX4r+NmzrnbgNsAyq3SHWxz+jqXiIi8y8tu/nt+rL8PW9UAY7q9Xw1s6ucMIiKSof4uj1eBSWY2wcwKgHOAef2cQUREMtSvh62cc0kz+xzwBBAGfuWcW9yfGUREJHP9fc4D59xjwGP9/boiItJ7dIW5iIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHzrcXmY2Rgze8bMlpjZYjO7LL290syeMrMV6beDu33O1Wa20syWmdmJvTEAERHpf5nseSSBy51zU4FDgEvNbBpwFTDfOTcJmJ9+n/THzgGmAycBPzWzcCbhRUQkGD0uD+dcrXPu9fTjZmAJMBo4Hbgr/bS7gDPSj08H7nHOxZ1za4CVwEE9fX0REQlOr5zzMLPxwEzgZWCEc64WugoGGJ5+2mhgQ7dPq0lv29nXm2tmC8xsQYJ4b0QUEZFelHF5mFkp8CfgC865pl09dSfb3M6e6Jy7zTk32zk3O0os04giItLLMioPM4vSVRy/c849kN68xcyq0h+vAramt9cAY7p9ejWwKZPXFxGRYGQy28qAO4Alzrmbun1oHnBh+vGFwEPdtp9jZjEzmwBMAl7p6euLiEhwIhl87uHAx4G3zWxhettXgeuB+8zsYmA9cDaAc26xmd0HvEPXTK1LnXOpDF5fREQCYs7t9LTDgFFule5gmxN0DBGRvPOym0+Tq9/Z+WpdYS4iIv6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pD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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "42e80256f1384245ac4c2971fb58067b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.2819444…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABM10lEQVR4nO3dd3xUVf7/8deZSSMNAkhH6V2kSVFXWbEgsthXFBVdFXvvrr913e/ay6pYULH37rKWVRdFRKkK0pu0UEMJpLeZ8/sjw00Cody0m5l5Px8PHrnnzJ3M51Ly5pxzi7HWIiIi4obP6wJERCT8KDxERMQ1hYeIiLim8BAREdcUHiIi4prCQ0REXKvz8DDGDDfGLDPGrDTG3FnXny8iItVn6vI6D2OMH1gOnAisB2YD51lrF9dZESIiUm11PfIYCKy01q6y1hYB7wGn1XENIiJSTTF1/HmtgfRy7fXAoD13MsaMA8YB+PH3TyS1bqoTERFHAbkU2UJT2Wt1HR6VFbHXvJm19kXgRYBU09gOMsNquy4REdnDTDt5n6/V9bTVeqBtuXYbYGMd1yAiItVU1+ExG+hsjGlvjIkDRgOT6rgGERGppjqdtrLWlhhjrgW+BvzAK9baRXVZg4iIVF9dr3lgrf0S+LKuP1dERGqOrjAXERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"handle_img(\"drawB\",0)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABdbElEQVR4nO3dd3iUVeL28e+Zkk4glBA6AUIVpEnRta8VRbAiKuqiiH2tq7uuvv5217X3gopdEREblrWLhSpNEGmh9xpIbzPn/SMDBgxlUuaZcn+uK1eSJxPmfki5c855irHWIiIiEgyX0wFERCTyqDxERCRoKg8REQmaykNERIKm8hARkaCpPEREJGghLw9jzKnGmCXGmGxjzB2hfn4REak5E8rzPIwxbmApcBKwDvgZuNBa+1vIQoiISI2FeuTRD8i21q6w1pYC44GzQpxBRERqyBPi52sBrK30/jqg/74PMsaMAkYBmLi4PimlyaFJJyJSFQPE4MU4iimg1JaYqj4W6vKoKsQfviTW2heAFwDiW7Wy/dcPqOtcIiL753KD3+d0ipCbYb/Z78dCPW21DmhV6f2WwIYQZxARCU4MFsfBhLo8fgayjDGZxpg4YBgwKcQZRESkhkI6bWWtLTfGXAd8AbiBl621C0OZQUREai7Uax5Yaz8DPgv184qISO3RGeYiIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIiISNJWHiIgETeUhIiJBU3mIiEjQVB4iIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIiISNJWHiIgETeUhIiJBU3mIiEjQVB4iIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIiISNJWHiIgETeUhIiJBU3mIiEjQVB4iIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIiISNJWHiIgETeUhIiJBU3mIiEjQVB4iIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIiISNJWHiIgETeUhIiJBU3mIiEjQVB4iIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIlI3jHE6gdQhlYeI1A1rnU4gdUjlISIiQVN5iIhI0FQeIiISNJWHiNQNLZhHNZWHiIgETeUhInVDR1tFNZWHiIgETeUhIiJBU3mIiEjQVB4iIhI0lYeIiARN5SEiIkFTeYiISNBUHiIiEjSVh4iIBE3lISIiQVN5iIhI0FQeIiISNJWHiIgETeUhIiJBU3mIiEjQPE4HkP0zHg8FZ/bBF7/3HdnqrSqE6fMdSiUiUoPyMMa0Al4HMgA/8IK19gljTEPgHaAtsAo431qbE/icO4GRgA+4wVr7RY3SRynXYZ1ZcmUDzjl6Bt2SPmDSlsP3fMzj8nN64wVMy23PrLE9aTp+Ib7cXMey2iMPZ1uPJI74yzziXeV7feyz7/vQ/Ec/SZ/MwZaX7+dfEJFIZGw17/ZljGkGNLPWzjHG1ANmA0OAy4Ad1tr7jTF3AGnW2r8ZY7oCbwP9gObA10BHa63vQM8T36qVPWb9gGpljDTGG0fuOb0ZetdXzMjJZMPTHWjwaw6+hUsqPcjgP+pwNh2ZxNkXfc/bi/rQ9gmDmfZLSLO6U1NZ8kx77jniY6bkZvHN9z1ptABcZRbrhpxOhj+dtIAr07/n0Q0nk3tjBnb2wpBmFJGamWG/IdfuqPJm9NUujz/8Q8Z8BDwdeDnOWrsxUDCTrbWdAqMOrLX/DTz+C+D/WWunHejfjZXyMPHxLH2wFzPPfoT+791C1t/mYktKDvg5njat2Pm8l3s6fMy/b7mcxI9mhiRr4dD+9LlrNot3NSVvTCvqf7kI385df3icKymJwhMOo/y6bVyf+R3//GAY7f85G1tWGpKcIlIzByqPWlkwN8a0BXoBM4Cm1tqNAIHX6YGHtQDWVvq0dYFtVf17o4wxs4wxs3wFBbURMez5+nXlw7Mep//EW8i6bc5BiwOgfPVaGlxeyJ2LhtLg5jW4U1PrPKe7Wyf+8dCr/C+7K+6RHlImTK+yOAD8hYUkfDKTBpcV8PcZQ5l20cNsuL5vnWcUkbpX4/IwxqQA7wF/tdYeaPK9qvaqcthjrX3BWtvXWtvXnZxc04hhz92kCcc+M42hH/yVrNvnBPWXefnGTWSMymV7URKL7+tShynB3aA+2XclcNPc8+lw8zbKV64+tIybNtP5xpUM+OE6LvnLF5gjutdpThGpezUqD2OMl4rieMta+35g8+bAdNXudZEtge3rgFaVPr0lsKEmzx8tVl+RRZl10+nfS/cqDuPxUHRWP8q/bk2TqQ1oMrUBS8f0w/Tqttfnl2/cRMKDaVx69I+4u3ass5w7zujC0ZnLaXtvGeXr9/7SuZKTKT6jH0VnVby4O2Tu9XFfTg6d7tjK3F2tWX6TG+ONq7OcIlL3anK0lQFeAhZZax+t9KFJwKXA/YHXH1XaPs4Y8ygVC+ZZQGgm6cOYiY/H3zuPt746mvbbp/++3eNh5b1HMPPSR6nvSvz9E9pOZtKJSTx+9YV4v569Z7P3h1+Yu7MVOYc3JPW3usmaNzSPme/3oPnCvZepSk/pS4f/W8SYlmNwm4q/R17alcHDb59N63/PAH/FMRHla9ex9OWBPHPnWJ5ofCLlGzfVTVARqXM1GXkcBVwCnGCMmRd4OZ2K0jjJGLMMOCnwPtbahcAE4Dfgc+Dagx1pFQvc6U14oOd7tPugeO8PHN6Jdy96bO/iCBicXIj92zZclaf0jIuTmvxG+UU76iSnq0dnjm+dTYuvdkGlgyzcWe246elxvNhqyp7iABhZfxNTr3yYbVf22+vfafrlWnb4UlhzUbs6ySkioVHtkYe19ieqXscAOHE/n/Mf4D/Vfc5otdOXhCd7A5WbdMW5qfSIS9jv53zc5R2OG34TKesqzp+wbkOGZ3GdZSyvn0gDbyGulev2yrnk6nQGJeVT1d8hae4kjrpyFsvG1cOflweAb9MW7p57Jr4W/jrLKiJ1T2eYR6hEE8eQ679jW1kKAG78HJ24sWKYV0cuT5vGb5OG4rdN92x7oeWLe4049nV22mwe9By7531bVkr51sT9/tUhIpFB5RGh8m0JUy7phf+XRWAMm68fyE23/nBonzygB2Wpey9Ye3NLD3rJk9aeROb+lknG97+XxYvXHcuJmd8GF752Ti0SEQepPMJAgqsMGjWAzVv2bGv7cSGLLiykS1xSlZ9zUfbZmJXrATAeL6NHf0RLT8pej3E3Tae4eyt2dImn+dmr9mx/KPN5usXtvZYyv7SYO1aevef9jRPbkrakhIQFa/FVypW43kPq21P3vD/j6H742n6939HH9/mdwbfP0pYbiPnVLpHIpvIIA93iNrHigsa0uWfpnm2unxcx6KObmX/O46S49l77+KEYch9rRWJuxcFqrsSEigICUuJL8GS2Yf2ZLTj98p+4r+mXVTzjHxfhe8Ql8Fmnz37f8I+KV3/b3JMvXj6SghYWF4auJy8l/7+ePdeq6vJUDlNOdXFMFcsz+f5iPnjpOJrm/l42rqQk0lrnsDO74aH814hImFJ5hAGv8dPh2JX46v2+sGzLSul46xxOnHUTXa/9ldaJFUdRTVjam5ZPe0j8/vejnIsGdqRn/FdAPGM7vsXnn3bh2gYfVfVUQXug6TweuHNe4D0Xlzf7iWc6Dsb3W0XR+RYt4++3XcWZ/+9bbm24ZM8I5PPCeK77cDQdnpu11yyVaZHBY90mcHn26FrJJyLOUHmEiZfbT+S0C2+l8YvT9xwKa8tKafDGNDa8adhAxRpFa7tgr89zJSSw9mQPzT3lQDztvSlc22Dtvv98rRmUVMzNFzWi7V1mT87k92bw/TfNeX/wn7GB2atGc3JoP3/63ssbxrB2aAa944r/8O+KSGTRzaDCRLo7mf/c/jL55/YDs8+xSNb+/lKZMeQO7snDg98k3R26y7jcfvYH2AE99trm27mLBq9PI+3Vihf//D8eNuw6vAtnX/T9H6bhRCTyqDzCyKlJJdx231vkn9cf4znIoNAY7JGHM+TurxiSnB+agAEj62+iw5NLcB3W+ZA/x90hk4IHirirsW5iJRINVB5hZkhyPg/e/yxLnumFu0sWrqQ/Hm3laZbB1qsGcNLzP3Jbw+UOpIRnW0yn/SsrKTntCEx8fNUPMgbfcb3Z8lFnuk1YxTeHTcRr3KENKiJ1QmseYeioBBdLzxjD68e04PHFJ8CUBnjzLX6vIb+tnzOOm8W4ph9UeemSUHq6xQymPzOVETP+QsNPEqm/vBB3TiH+pHiKmyex4WgP/z57HOen7L5ku4pDJFqoPMKU17gZWX8TI/uPw9fPj5+KQ2WBwBFNzhbHbgMS3Cw99jXKjvGx2VfEnJJ0srzbaOf14sF9wLPPRSRy6Sc7AriNC6+p+EW8v1/GK8vyeTU3nV3+ojrJkOMr5KVdGawsq3p9xWvctPSkMDi54sTGeONVcYhEMY08ItzC0iLOfeUWmswrJ+W7xdx7/xAWDn6aJFft3S9jl7+I/m/cQvv/zOe1kwazpZeHSZc9REdv9N+oK5q5O2Tib7D317A4PZGtIwtxuysuXOn5ogENlpexaVQxHk/FZQFc36aRMfX3+76512/T5fVjkMojgi0sLeLye26m9WsVZ3D7gGbfu8g/s4wkaq88/r3lSNr/+xf8hYUkfjiTNh/C8DW3Mu7uh1UgEcCd1Q5/SiLZF9cjITNvz/a7D/uEM5K2/uHxlf/wKDvCR5n1Vbltt39v7cukld1xTalPi69z8C9YuuceLhK9VB4RqtBfyoj7bqbxa3vfmCkhp5ytPhfptbg2Xd9ThL947ymoRi9Line truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "37ed4fb9119744e0801ffac1c894695c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.2930555…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"handle_img(\"drawC\",4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Notes & Remarks"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This week results are impacted from the same issue as last week that still couldnt be resolved unfortunately... Hence, this weeks implementations passes the provided tests but the renders have similarly, excessivly large energy values."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
+188
View File
@@ -0,0 +1,188 @@
from energies import *
from optimization import compute_optimization_objective, compute_optimization_objective_gradient
from linesearch import *
import numpy as np
import time
import igl
def compute_approximate_hessian_matrix(sk, yk, B_prev):
"""
Compute the approximated hessian matrix
Input:
- s_k : np.array(#V * 2, 1)
s_k = x_{k+1} - x_{k}, the difference in variables at two consecutive iterations.
Note that x_{k} is the vertices' coordinate V at the k-th iteration.
The vertices' cooridnate V however is a np.array(#V, 3)
We use x_{k} = V[:, 0 : 2].flatten() to flatten the vertices coordinartes.
- y_k : np.array(#V * 2, 1)
y_k = grad(f(x_{k+1})) - grad(f(x_{k})),
the difference in function gradient at two consecutive iterations.
The grad(f(x_{k})) is the gradient of our objective energy,
which is a np.array(#V, 2)
To be used for BFGS, we flatten the gradient.
The flatten process asks the all x coordinates to be first
then all y cooridnates to be the second.
- B_prev: np.array(#V * 2, #V * 2)
The approximated hessian matrix from last iteration
Output
-B_new: np.array(#V * 2, #V * 2)
The approximated hessian matrix of current iteration
"""
a = (yk @ yk.T)/(yk.T @ sk)
bt = B_prev @ sk @ sk.T @ B_prev.T
bb = sk.T @ B_prev @ sk
B_new = B_prev + a - bt/bb
return B_new
def compute_inverse_approximate_hessian_matrix(sk, yk, invB_prev):
"""
Compute the inverse approximated hessian matrix
Input:
- s_k : np.array(#V * 2, 1)
s_k = x_{k+1} - x_{k}, the difference in variables at two consecutive iterations.
Note that x_{k} is the vertices' coordinate V at the k-th iteration.
The vertices' cooridnate V however is a np.array(#V, 3)
We use x_{k} = V[:, 0 : 2].flatten() to flatten the vertices coordinartes.
- y_k : np.array(#V * 2, 1)
y_k = grad(f(x_{k+1})) - grad(f(x_{k})),
the difference in function gradient at two consecutive iterations.
The grad(f(x_{k})) is the gradient of our objective energy,
which is a np.array(#V, 2)
To be used for BFGS, we flatten the gradient.
The flatten process asks the all x coordinates to be first
then all y cooridnates to be the second.
- invB_prev: np.array(#V * 2, #V * 2)
The inversed matrix of the approximated hessian from last iteration
Output
- invB_new: np.array(#V * 2, #V * 2)
The inversed matrix of the approximated hessian at current iteration
"""
d = sk.T @ yk
e = invB_prev @ yk
a = (d + (yk.T @ e)) * (sk @ sk.T)/(d * d)
b = ((e @ sk.T) + ((sk @ yk.T) @ invB_prev))/d
invB_new = invB_prev + a - b
return invB_new
def bfgs_with_line_search(V, F, x_csl, w, obj_tol, theta, beta, c, iter):
"""
Find equilibrium shape by using BFGS method
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
- x_csl : float
The x coordinate of the center of the support line.
- w : float
The weight for shape preservation energy.
- obj_tol: float
The termination condition for optimization.
The program stop running if
the absolute different between the objectives of two consecutive iterations is smaller than obj_tol
- theta : float
The initial gradient descent step size.
- beta : float
The backtracking ratio, alpha = beta * alpha
- c: float
The coefficient for armijo condition
- iter : int
The number of iteration for gradient descent.
Output:
- V1 : np.array (#V, 3)
The optimized mesh's vertices
- F : np.array (#F, 3)
The array of triangle faces.
- energy: np.array(iters, 1)
The objective function energy curve with respect to the number of iterations.
- running_time: float
The tot running time of the optimization
"""
V1 = V.copy()
# this function of libigl returns an array (#edges, 2) where i-th row
# contains the indices of the two vertices of i-th edge.
E = igl.edges(F)
fix = np.where(V1[:, 1] < 1e-3)[0]
L0 = compute_edges_length(V1, E)
t0 = time.time()
energy = []
obj_prev = 0
it_time = 0
gradprev= None
vprev = V1
Hprev = np.identity(V.shape[0]*2)/theta
while (True):
# energy
obj = compute_optimization_objective(V1, F, E, x_csl, L0, w)
if abs(obj_prev - obj) < obj_tol:
break
if it_time > iter:
break
obj_prev = obj
energy.append(obj)
grad = compute_optimization_objective_gradient(V1, F, E, x_csl, L0, w)
grad[fix] = 0
if gradprev is None:
gradprev = grad
### start of your code.
gradf = grad.flatten()
ff = F.flatten()
vf = V[:, 0 : 2].flatten()
unflatten = lambda x: np.concatenate((np.reshape(x,(V.shape[0],2)),np.zeros((V.shape[0],1))),axis=-1)
f = lambda x: compute_optimization_objective(unflatten(x), F, E, x_csl, L0, w)
alpha = backtracking_line_search(-gradf, gradf, vf, theta, beta, c, f)
x_cm = compute_mesh_centroid(V, F)[0]
HV = (V1 - vprev)[:,:2].flatten()[:,None]
HG = (grad-gradprev).flatten()[:,None]
Hcur = compute_inverse_approximate_hessian_matrix(HV, HG, Hprev)
d = np.concatenate((np.reshape(Hcur @ gradf,(V.shape[0],2)),np.zeros((V.shape[0],1))),axis=-1)
vprev = V1
gradprev = grad
Hprev = Hcur
V1 = V1 - (alpha * d)
### end of your code.
it_time = it_time + 1
running_time = time.time() - t0
return [V1, F, energy, running_time]
+244
View File
@@ -0,0 +1,244 @@
import numpy as np
from scipy import sparse
# -----------------------------------------------------------------------------
# Functions from assignment_1_1
# -----------------------------------------------------------------------------
from geometry import compute_mesh_centroid
from geometry import compute_faces_centroid
from geometry import compute_faces_area
# -----------------------------------------------------------------------------
# Provided functions
# -----------------------------------------------------------------------------
def vertex_cells_sum(values, cells):
"""
Sums values at vertices from each incident n-cell.
Input:
- values : np.array (#cells,) or (#cells, n)
The cell values to be summed at vertices.
If shape (#cells,): The value is per-cell,
If shape (#cells, n): The value refers to the corresponding cell vertex.
- cells : np.array (#cells, n)
The array of cells.
Output:
- v_sum : np.array (#vertices,)
A vector with the sum at each i-th vertex in i-th position.
Note:
If n = 2 the cell is an edge, if n = 3 the cell is a triangle,
if n = 4 the cell can be a tetrahedron or a quadrilateral, depending on
the data structure.
"""
i = cells.flatten('F')
j = np.arange(len(cells))
j = np.tile(j, cells.shape[1])
v = values.flatten('F')
if len(v) == len(cells):
v = v[j]
v_sum = sparse.coo_matrix((v, (i, j)), (np.max(cells) + 1, len(cells)))
return np.array(v_sum.sum(axis=1)).flatten()
def compute_edges_length(V, E):
"""
Computes the edge length of each mesh edge.
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- E : np.array (#edges, 2)
The array of mesh edges.
generated from the function E = igl.edges(F)
returns an array (#edges, 2) where i-th row contains the indices of the two vertices of i-th edge.
Output:
- l : np.array (#edges,)
The edge lengths.
"""
l = np.linalg.norm(V[E[:, 0]] - V[E[:, 1]], axis=1)
return l
# -----------------------------------------------------------------------------
# 2.5.1 Target energies
# -----------------------------------------------------------------------------
def compute_equilibrium_energy(V, F, x_csl):
"""
Computes the equilibrium energy E_eq = 1/2*(x_cm - x_csl)^2.
Input:
-- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
- x_csl : float
The x coordinate of the center of the support line.
Output:
- E_eq : float
the equilibrium energy of the mesh with respect to the target centroid
x_csl.
"""
x_cm = compute_mesh_centroid(V,F)[0]
E_eq = 0.5 * (x_cm - x_csl)**2
return E_eq
def compute_shape_energy(V, E, L):
"""
Computes the energy E_sh = 1/2 sum_e (l_e - L_e)^2 in the current
configuration V, where l_e is the length of mesh edges, and L_e the
corresponding length in the undeformed configuration.
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- E : np.array (#edges, 2)
The array of mesh edges.
- L : np.array (#edges,)
The rest lengths of mesh edges.
Output:
- E_sh : float
The energy E_sh in the current configuration V.
"""
l = compute_edges_length(V,E)
Lf = np.array(L)
e_vec = np.arange(len(E))
ldiff = (l[e_vec]-Lf[e_vec])**2
E_sh = 0.5 * np.sum(ldiff)
return E_sh
# -----------------------------------------------------------------------------
# 2.5.2 Faces area gradient
# -----------------------------------------------------------------------------
def compute_faces_area_gradient(V, F):
"""
Computes the gradient of faces area.
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
Output:
- dA_x : np.array (#F, 3)
The gradient of faces areas A_i with respect to the x coordinate of each
face vertex x_1, x_2, and x_3, with (i,0) = dA_i/dx_1, (i,1) = dA_i/dx_2,
and (i,2) = dA_i/dx_3.
- dA_y : np.array (#F, 3)
The gradient of faces areas A_i with respect to the y coordinate of each
face vertex y_1, y_2, and y_3, with (i,0) = dA_i/dy_1, (i,1) = dA_i/dy_2,
and (i,2) = dA_i/dy_3.
"""
grad = lambda a,b: (V[a]-V[b])
gradABC = lambda fi: [grad(fi[2],fi[1]),grad(fi[0],fi[2]),grad(fi[1],fi[0])]
dA = np.apply_along_axis(gradABC,1,F)/2
dA_x = -dA[:,:,1]
dA_y = dA[:,:,0]
return dA_x, dA_y
# -----------------------------------------------------------------------------
# 2.5.3 Equilibrium energy gradient
# -----------------------------------------------------------------------------
def compute_equilibrium_energy_gradient(V, F, x_csl):
"""
Computes the gradient of the energy E_eq = 1/2*(x_cm - x_csl)^2 with respect
to the x and y coordinates of each vertex, where x_cm is the x coordinate
of the area centroid and x_csl x coordinate of the center of the support
line.
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
- x_csl : float
The x coordinate of the center of the support line.
Output:
- grad_E_eq : np.array (#V, 2)
The gradient of the energy E_eq with respect to vertices v_i,
with (i, 0) = dE_eq/dx_i and (i, 1) = dE_eq/dy_i
"""
cm = compute_mesh_centroid(V,F)
x_cm = cm[0]
x_f = compute_faces_centroid(V,F)
A_f = compute_faces_area(V,F)
A_f_V_nonp = compute_faces_area_gradient(V, F)
A_f_V = np.stack(A_f_V_nonp,axis=-1)
A_omega = np.sum(A_f)
xfact = (x_cm - x_csl)/A_omega
xfV = lambda v: np.apply_along_axis(lambda x: np.array([1/3,0.0]) if np.any(x[:]==v) else np.zeros((2)),1,F)
AfV = lambda v: (np.where(F[:,0][:,None]==v,A_f_V[:,0,:2],
np.where(F[:,1][:,None]==v,A_f_V[:,1,:2],
np.where(F[:,2][:,None]==v,A_f_V[:,2,:2],np.zeros((F.shape[0],2))) )) )
cf = lambda v : AfV(v)*(x_f[:,0] - x_cm)[:, None] + (A_f[:, None]*xfV(v))
#v_vec = np.arange(len(V))
#veq = np.sum(cf(v_vec),axis=0)*xfact
veq = np.array([np.sum(cf(v),axis=0) for v in range(0,len(V))])*xfact
return veq
# -----------------------------------------------------------------------------
# 2.5.4 Shape energy gradient
# -----------------------------------------------------------------------------
def compute_shape_energy_gradient(V, E, L):
"""
Computes the gradient of the energy E_sh = 1/2 sum_e (l_e - L_e)^2 with
respect to the x and y coordinates of each vertex, where l_e is the length
of mesh edges, and L_e the corresponding length in the undeformed
configuration.
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- E : np.array (#edges, 2)
The array of mesh edges.
- L : np.array (#edges,)
The rest lengths of mesh edges.
Output:
- grad_E_sh : np.array (#V, 2)
The gradient of the energy E_sh with respect to vertices v_i,
with (i, 0) = dE_sh/dx_i, (i, 1) = dE_sh/dy_i
"""
vdif = lambda ee0, ee1: (V[ee0]-V[ee1])[:,:2]
len_e_d = vdif(E[:,0],E[:,1])
len_e = np.linalg.norm(len_e_d, axis=1)
len_e_t = lambda v: (np.where(E[:,0][:,None]==v,len_e_d[:],
np.where(E[:,1][:,None]==v,-len_e_d[:],np.zeros(E.shape))))
veq = np.sum(np.array([len_e_t(v) for v in range(0,len(V))]),axis=1) - np.sum(L/len_e,axis=0)
return veq
+100
View File
@@ -0,0 +1,100 @@
import numpy as np
def compute_faces_area(V, F):
"""
Computes the area of the faces of a given triangle mesh (V, F).
Input:
- V : np.array (|V|, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (|F|, 3)
The array of triangle faces.
Output:
- area : np.array (|F|,)
The area of the faces. The i-th position contains the area of the i-th
face.
"""
# HW.1.3.3
return np.linalg.norm(np.cross(V[F[:,1]] - V[F[:,0]],V[F[:,2]] - V[F[:,0]], axis=1), axis=1)/2.0
def compute_mesh_area(V, F):
"""
Computes the area of a given triangle mesh (V, F).
Input:
- V : np.array (|V|, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (|F|, 3)
The array of triangle faces.
Output:
- area : float
The area of the mesh.
"""
# HW.1.3.3
return np.sum(compute_faces_area(V,F))
def compute_faces_centroid(V, F):
"""
Computes the area centroid of each face of a given triangle mesh (V, F).
Input:
- V : np.array (|V|, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (|F|, 3)
The array of triangle faces.
Output:
- cf : np.array (|F|, 3)
The area centroid of the faces.
"""
# HW.1.3.4
return (V[F[:,0]]+ V[F[:,1]] + V[F[:,2]])/3.0
def compute_mesh_centroid(V, F):
"""
Computes the area centroid of a given triangle mesh (V, F).
Input:
- V : np.array (|V|, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (|F|, 3)
The array of triangle faces.
Output:
- centroid : np.array (3,)
The area centroid of the mesh.
"""
# HW.1.3.4
face_centroid = compute_faces_centroid(V,F)
face_area = compute_faces_area(V,F)
return 1.0/np.sum(face_area) * np.sum(np.einsum('i,ij->ij', face_area, face_centroid), axis=0)
def compute_center_support_line(V):
"""
Computes the x coordinate of the center of the support line
Input:
- V : np.array (|V|, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
Output:
- x_csl : float
the x coordinate of the center of the support line
"""
# HW.1.3.5
support_v = np.fromiter((v[0] for v in V if v[1]<10**-5), dtype=V.dtype)
x_csl = np.amin(support_v)+(np.amax(support_v)-np.amin(support_v))/2
return x_csl
+173
View File
@@ -0,0 +1,173 @@
from energies import *
from optimization import compute_optimization_objective, compute_optimization_objective_gradient
import numpy as np
import time
import igl
def evaluate_armijo_rule(f_x, f_x1, p, grad, c, alpha):
"""
Check the armijo rule, return true if the armijo condition is satisfied
Input:
- f_x : float
The function value at x
- f_x1 : float
The function value at x_(k+1) = x_k + alpha * p_k
- p: np.array(2 * #V, 1)
The flatten search direction
Here, we use the flatten the search direction.
The flatten process asks the all x coordinates to be first
then all y cooridnates to be the second.
- grad: np.array(2 * #V, 1)
The gradient of the function at x
Here, we use the flatten the gradient
The flatten process asks the all x coordinates to be first
then all y cooridnates to be the second.
- c: float
The coefficient for armijo condition
- alpha: float
The current step size
Output:
- condition: bool
True if the armijio condition is satisfied
"""
return f_x1 <= f_x + c*alpha*np.dot(p.T,grad)
def backtracking_line_search(p, grad, x, theta, beta, c, f, *arg):
"""
Computes the step size for p that satisfies the armijio condition.
Input:
- p: np.array(2 * #V, 1)
The flatten search direction
Here, we use the flatten the search direction.
The flatten process asks the all x coordinates to be first
then all y cooridnates to be the second.
- grad: np.array(2 * #V, 1)
The gradient of the function at x
Here, we use the flatten the gradient
The flatten process asks the all x coordinates to be first
then all y cooridnates to be the second.
- x : np.array(#V * 2, 1)
The array of optimization variables
x = V[:, 0 : 2].flatten()
- theta: float
The initial step size
- beta : float
The backtracking ratio, alpha = beta * alpha
- c: float
The coefficient for armijo condition
- f: function
The objective function (i.e., optimization.compute_optimization_objective)
- *arg: parameters
The rest parameters for the function f except the its first variables Vx
Output:
- alpha: float
The step size for p that satisfies the armijio condition
"""
alpha = theta
x1 = x + alpha*p
while not evaluate_armijo_rule(f(x,*arg),f(x1, *arg), p, grad, c, alpha):
alpha = beta*alpha
x1 = x+alpha*p
return alpha
def gradient_descent_with_line_search(V, F, x_csl, w, obj_tol, theta, beta, c, iter):
"""
Find equilibrium shape by using gradient descent with backtracking line search
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row.
- F : np.array (#F, 3)
The array of triangle faces.
- x_csl : float
The x coordinate of the center of the support line.
- w : float
The weight for shape preservation energy.
- obj_tol: float
The termination condition for optimization.
The program stop running if
the absolute difference between the objectives of two consecutive iterations is smaller than obj_tol
- theta : float
The initial gradient descent step size.
- beta : float
The backtracking ratio, alpha = beta * alpha
- c: float
The coefficient for armijo condition.
- iter : int
The maximum number of iteration for gradient descent.
Output:
- V1 : np.array (#V, 3)
The optimized mesh's vertices
- F : np.array (#F, 3)
The array of triangle faces.
- energy: np.array(iters, 1)
The objective function energy curve with respect to the number of iterations.
- running_time: float
The tot running time of the optimization
"""
V1 = V.copy()
# this function of libigl returns an array (#edges, 2) where i-th row
# contains the indices of the two vertices of i-th edge.
E = igl.edges(F)
fix = np.where(V1[:, 1] < 1e-3)[0]
L0 = compute_edges_length(V1, E)
t0 = time.time()
energy = []
obj_prev = 0
it_time = 0
while(True):
# energy
obj = compute_optimization_objective(V1, F, E, x_csl, L0, w)
if abs(obj_prev - obj) < obj_tol:
break
if it_time > iter:
break
obj_prev = obj
energy.append(obj)
grad = compute_optimization_objective_gradient(V1, F, E, x_csl, L0, w)
grad[fix] = 0
### start of your code.
gradf = grad.flatten()
ff = F.flatten()
vf = V[:, 0 : 2].flatten()
unflatten = lambda x: np.concatenate((np.reshape(x,(V.shape[0],2)),np.zeros((V.shape[0],1))),axis=-1)
f = lambda x: compute_optimization_objective(unflatten(x), F, E, x_csl, L0, w)
alpha = backtracking_line_search(-gradf, gradf, vf, theta, beta, c, f)
x_cm = compute_mesh_centroid(V, F)[0]
grad_f = np.zeros((np.shape(grad)[0],3))
grad_f[:,:-1] = grad
V1 = V1 -(alpha * grad_f)
### end of your code.
it_time = it_time + 1
running_time = time.time() - t0
return [V1, F, energy, running_time]
+137
View File
@@ -0,0 +1,137 @@
from energies import compute_edges_length
from energies import compute_equilibrium_energy_gradient, compute_equilibrium_energy
from energies import compute_shape_energy_gradient, compute_shape_energy
from geometry import compute_mesh_centroid
import numpy as np
import time
import igl
def compute_optimization_objective(V, F, E, x_csl, L0, w):
"""
Compute the objective function of make-it-stand problem.
E = E_equilibrium + w * E_shape
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
- E : np.array (#edges, 2)
The array of mesh edges.
- x_csl : float
The x coordinate of the center of the support line.
- L0 : np.array (#edges,)
The rest lengths of mesh edges.
- w : float
The weight for shape preservation energy.
Output:
- obj : float
The value of the objective function.
"""
E_eq = compute_equilibrium_energy(V, F, x_csl)
E_sh = compute_shape_energy(V, E, L0)
obj = E_eq + w*E_sh
return obj
def compute_optimization_objective_gradient(V, F, E, x_csl, L0, w):
"""
Compute the gradient of the objective function of make-it-stand problem.
D_E = D_E_equilibrium + w * D_E_shape
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
- E : np.array (#edges, 2)
The array of mesh edges.
- x_csl : float
The x coordinate of the center of the support line.
- l0 : np.array (#edges,)
The rest lengths of mesh edges.
- w : float
The weight for shape preservation energy.
Output:
- grad_obj : np.array (#V, 2)
The gradient of objective function.
"""
grad_E_eq = compute_equilibrium_energy_gradient(V, F, x_csl)
grad_E_sh = compute_shape_energy_gradient(V, E, L0)
grad_obj = grad_E_eq + w * grad_E_sh
return grad_obj
def fixed_step_gradient_descent(V, F, x_csl, w, theta, iters):
"""
Find equilibrium shape by using fixed step gradient descent method
Input:
- V : np.array (#V, 3)
The array of vertices positions.
Contains the coordinates of the i-th vertex in i-th row
- F : np.array (#F, 3)
The array of triangle faces.
- x_csl : float
The x coordinate of the center of the support line.
- w : float
The weight for shape preservation energy.
- theta : float
The optimization step.
- iters : int
The number of iteration for gradient descent.
Output:
- V1 : np.array (#V, 3)
The optimized mesh's vertices
- F : np.array (#F, 3)
The array of triangle faces.
- energy: np.array(iters, 1)
The objective function energy curve with respect to the number of iterations.
- running_time: float
The tot running time of the optimization
"""
V1 = V.copy()
# this function of libigl returns an array (#edges, 2) where i-th row
# contains the indices of the two vertices of i-th edge.
E = igl.edges(F)
fix = np.where(V1[:, 1] < 1e-3)[0]
L0 = compute_edges_length(V1, E)
t0 = time.time()
energy = []
for i in range(iters):
grad = compute_optimization_objective_gradient(V1, F, E, x_csl, L0, w)
obj = compute_optimization_objective(V1, F, E, x_csl, L0, w)
energy.append(obj)
grad[fix] = 0
### start of your code.
x_cm = compute_mesh_centroid(V, F)[0]
if abs(x_csl - x_cm)<=10**-3:
break
if (np.linalg.norm(grad)<=10**-3):
break
grad_f = np.zeros((np.shape(grad)[0],3))
grad_f[:,:-1] = grad
V1 = V1 -(theta * grad_f)
### end of your code.
running_time = time.time() - t0
return [V1, F, energy, running_time]
+45
View File
@@ -0,0 +1,45 @@
import numpy as np
import cv2 as cv
import triangle as tr
def triangulate_mesh(Ps, Holes, area_density):
'''
Triangulates a set of points given by P using Delaunay scheme
Input:
- P : list of N lists of 2 elements giving the vertices positions
- Holes: list of M lists of 2 elements giving the holes positions
- area_density: the maximum triangle area
Output:
- V : array of shape (nNodes, 3) containing the vertices position
- F : array of vertices ids (list of length nTri of lists of length 3). The ids are such that the algebraic area of
each triangle is positively oriented
'''
num_points = 0
points = []
segments = []
for k, _ in enumerate(Ps):
P = np.array(Ps[k])
N = P.shape[0]
points.append(P)
index = np.arange(N)
seg = np.stack([index, index + 1], axis=1) % N + num_points
segments.append(seg)
num_points += N
points = np.vstack(points)
segments = np.vstack(segments)
data = []
if Holes == [] or Holes == [[]] or Holes == None:
data = dict(vertices=points, segments=segments)
else:
data = dict(vertices=points, segments=segments, holes = Holes)
tri = tr.triangulate(data, 'qpa{}'.format(area_density))
V = np.array([[v[0], v[1], 0] for v in tri["vertices"]])
F = np.array([[f[0], f[1], f[2]] for f in tri["triangles"]])
return [V, F]
+67
View File
@@ -0,0 +1,67 @@
# import pytest
import time
import pytest
import json
import sys
import igl
import numpy as np
sys.path.append('../')
sys.path.append('../src')
from src.energies import *
from src.linesearch import *
from src.bfgs import *
eps = 1E-6
with open('test_data3.json', 'r') as infile:
homework_datas = json.load(infile)
@pytest.mark.timeout(1)
@pytest.mark.parametrize("data", homework_datas[0])
def test_armijo_rule(data):
Fx = data[0]
Fy = data[1]
p = np.array(data[2], dtype=float)
grad = np.array(data[3], dtype=float)
c = data[4]
alpha = data[5]
armijo_rule_ground_truth = data[6]
armijo_rule_student = int(evaluate_armijo_rule(Fx, Fy, p, grad, c, alpha))
assert armijo_rule_ground_truth == armijo_rule_student
def func(x):
return np.linalg.norm(x) ** 2
@pytest.mark.timeout(1)
@pytest.mark.parametrize("data", homework_datas[1])
def test_backtracking_line_search(data):
p = np.array(data[0], dtype=float)
grad = np.array(data[1], dtype=float)
x = np.array(data[2], dtype=float)
theta = data[3]
beta = data[4]
c = data[5]
backtracking_line_search_ground_truth = data[6]
backtracking_line_search_student = backtracking_line_search(p, grad, x, theta, beta, c, func)
assert np.linalg.norm(backtracking_line_search_ground_truth - backtracking_line_search_student) < eps
@pytest.mark.timeout(1)
@pytest.mark.parametrize("data", homework_datas[2])
def test_compute_approximate_hessian_matrix(data):
sk = np.array(data[0], dtype=float)
yk = np.array(data[1], dtype=float)
Bk = np.array(data[2], dtype=float)
newBk_student = compute_approximate_hessian_matrix(sk, yk, Bk)
newBk_ground_truth = np.array(data[3], dtype=float)
assert np.linalg.norm(newBk_student - newBk_ground_truth) < eps
@pytest.mark.timeout(1)
@pytest.mark.parametrize("data", homework_datas[3])
def test_compute_inverse_approximate_hessian_matrix(data):
sk = np.array(data[0], dtype=float)
yk = np.array(data[1], dtype=float)
invBk = np.array(data[2], dtype=float)
inv_newBk_student = compute_inverse_approximate_hessian_matrix(sk, yk, invBk)
inv_newBk_ground_truth = np.array(data[3], dtype=float)
assert np.linalg.norm(inv_newBk_student - inv_newBk_ground_truth) < eps
@@ -0,0 +1 @@
[[[2.0000000000000004, 2.0000000000000004, [-2, -2], [2, 2], 0.5, 1.0, 0], [2.0000000000000004, 0.0, [-2, -2], [2, 2], 0.5, 0.5, 1]], [[[-2, -2], [2, 2], [1, 1], 2.1, 0.5, 0.5, 0.2625]], [[[[-2.0], [-2.0]], [[-4.0], [-4.0]], [[1.0, 0.0], [0.0, 1.0]], [[1.5, 0.5], [0.5, 1.5]]]], [[[[-2.0], [-2.0]], [[-4.0], [-4.0]], [[1.0, 0.0], [0.0, 1.0]], [[0.75, -0.25], [-0.25, 0.75]]]]]