From eff41a4f9597f49e81c16c59bd0968c803e27344 Mon Sep 17 00:00:00 2001 From: Selinux24 Date: Thu, 1 Aug 2024 16:01:08 +0200 Subject: [PATCH] Added buildings, trees and persistence to the Virtual World Scene --- Samples/05 AISamples/05 AISamples.csproj | 8 + Samples/05 AISamples/Common/Constants.cs | 2 + .../Common/Resources/Tree/Tree1.dae | 130 ++++++++++ .../Common/Resources/Tree/tree1.json | 3 + .../Content/BuildingFile.cs | 9 + .../Content/CrossingFile.cs | 29 +++ .../Content/EnvelopeFile.cs | 11 + .../SceneCWRVirtualWorld/Content/GraphFile.cs | 23 +- .../Content/IMarkingFile.cs | 16 ++ .../SceneCWRVirtualWorld/Content/LightFile.cs | 35 +++ .../Content/ParkingFile.cs | 29 +++ .../Content/PolygonFile.cs | 9 + .../Content/Segment2File.cs | 16 -- .../SceneCWRVirtualWorld/Content/StartFile.cs | 29 +++ .../SceneCWRVirtualWorld/Content/StopFile.cs | 29 +++ .../Content/TargetFile.cs | 29 +++ .../SceneCWRVirtualWorld/Content/TreeFile.cs | 10 + .../Content/Vector3File.cs | 26 ++ .../SceneCWRVirtualWorld/Content/WorldFile.cs | 18 ++ .../SceneCWRVirtualWorld/Content/YieldFile.cs | 29 +++ .../Editors/GraphEditor.cs | 29 ++- .../SceneCWRVirtualWorld/Graph.cs | 38 +-- .../SceneCWRVirtualWorld/Items/Building.cs | 65 +++++ .../SceneCWRVirtualWorld/Items/Tree.cs | 36 +++ .../SceneCWRVirtualWorld/Markings/Crossing.cs | 14 + .../SceneCWRVirtualWorld/Markings/Light.cs | 18 ++ .../SceneCWRVirtualWorld/Markings/Marking.cs | 5 +- .../SceneCWRVirtualWorld/Markings/Parking.cs | 14 + .../SceneCWRVirtualWorld/Markings/Start.cs | 14 + .../SceneCWRVirtualWorld/Markings/Stop.cs | 14 + .../SceneCWRVirtualWorld/Markings/Target.cs | 14 + .../SceneCWRVirtualWorld/Markings/Yield.cs | 14 + .../Primitives/Envelope.cs | 32 ++- .../Primitives/Polygon.cs | 51 +++- .../Primitives/Segment2.cs | 16 +- .../SceneCWRVirtualWorld/VirtualWorldScene.cs | 29 ++- .../SceneCWRVirtualWorld/World.cs | 240 +++++++++++++----- 37 files changed, 974 insertions(+), 159 deletions(-) create mode 100644 Samples/05 AISamples/Common/Resources/Tree/Tree1.dae create mode 100644 Samples/05 AISamples/Common/Resources/Tree/tree1.json create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/BuildingFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/CrossingFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/EnvelopeFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/IMarkingFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/LightFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/ParkingFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/PolygonFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/StartFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/StopFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/TargetFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/TreeFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/Vector3File.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/WorldFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Content/YieldFile.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Items/Building.cs create mode 100644 Samples/05 AISamples/SceneCWRVirtualWorld/Items/Tree.cs diff --git a/Samples/05 AISamples/05 AISamples.csproj b/Samples/05 AISamples/05 AISamples.csproj index c657c19c0..402004da4 100644 --- a/Samples/05 AISamples/05 AISamples.csproj +++ b/Samples/05 AISamples/05 AISamples.csproj @@ -12,6 +12,8 @@ + + @@ -29,6 +31,12 @@ Always + + Always + + + Always + Always diff --git a/Samples/05 AISamples/Common/Constants.cs b/Samples/05 AISamples/Common/Constants.cs index f00d157d9..61ae0c0e1 100644 --- a/Samples/05 AISamples/Common/Constants.cs +++ b/Samples/05 AISamples/Common/Constants.cs @@ -6,6 +6,8 @@ static class Constants { public const string CommonResourcesFolder = "Common/Resources/"; public const string MarkingsTexture = CommonResourcesFolder + "markings.png"; + public const string TreesResourcesFolder = CommonResourcesFolder + "Tree/"; + public const string TreesModel = "Tree1.json"; const float Width = 2000f; const float Height = 1600f; diff --git a/Samples/05 AISamples/Common/Resources/Tree/Tree1.dae b/Samples/05 AISamples/Common/Resources/Tree/Tree1.dae new file mode 100644 index 000000000..5cc355e03 --- /dev/null +++ b/Samples/05 AISamples/Common/Resources/Tree/Tree1.dae @@ -0,0 +1,130 @@ + + + + + Blender User + Blender 3.0.0 commit date:2021-12-02, commit time:18:35, hash:f1cca3055776 + + 2022-02-15T18:36:01 + 2022-02-15T18:36:01 + + Z_UP + + + + + + + + 0 0 0 1 + + + 0.2594937 0.1731412 0.06897625 1 + + + 0.5 + + + + + + + + + + + 0 0 0 1 + + + 0.3210762 0.5506325 0.1384612 1 + + + 0.5 + + + + + + + + + + + + + + + + + + + + -0.5247531 -0.7078114 -1.37533 -1.53072 -0.6666918 -0.2460432 -0.9062615 -0.6615076 1.11465 0.5458341 -0.6918745 1.43058 1.42838 -0.731081 0.2295928 1.00376 -0.7426329 -1.23456 0.7868819 2.82926 -1.29208 0.6343198 3.39803 -0.7880728 0.9815121 3.47944 -0.07891273 1.52378 2.91226 0.09195089 1.67634 2.34349 -0.4120512 1.32915 2.26209 -1.12121 2.59035 4.58157 -2.36406 2.284989 4.93522 -1.78959 2.61892 4.92501 -1.15015 3.30715 4.689199 -1.05697 3.57986 4.27748 -1.60876 3.19057 4.18931 -2.20974 3.54873 7.47469 -3.08566 3.17914 7.78206 -2.58487 3.45759 7.91591 -1.98529 4.12953 7.82592 -1.85391 4.46704 7.4315 -2.31475 4.16741 7.24017 -2.88795 4.433166 9.752751 -4.80753 4.115898 10.06763 -4.428026 4.387808 10.38799 -3.946014 5.05774 10.13318 -3.823813 5.275248 9.746715 -4.232141 5.046337 9.639197 -4.804223 5.102323 12.28832 -4.516829 4.750237 12.43715 -4.184595 4.978867 12.70651 -3.561303 5.53191 12.68442 -3.675228 5.883175 12.51288 -4.076625 5.654658 12.22823 -4.316641 4.394825 14.52574 -4.302494 4.101166 14.59805 -3.918437 4.246004 14.8633 -3.494956 4.765548 14.86995 -3.469566 5.05659 14.81052 -3.857815 4.876853 14.71824 -4.337204 4.113121 17.44163 -4.119294 3.863548 17.50041 -3.783626 4.014803 17.5772 -3.398561 4.434655 17.53632 -3.330817 4.674899 17.4104 -3.654645 4.531507 17.39022 -4.049699 -1.329989 3.068749 -0.363729 -1.55759 2.54365 0.1579985 -1.27446 2.487969 0.8966374 -0.7136331 3.03217 1.07856 -0.486032 3.55727 0.5568347 -0.769166 3.61295 -0.1818017 -3.13891 4.92041 0.6089521 -3.54369 4.65459 1.16326 -3.18725 4.57937 1.79795 -2.5597 4.89534 1.93327 -2.205709 5.25073 1.3996 -2.334768 5.16848 0.7286172 -3.809271 8.536771 0.8283382 -4.068208 8.221346 1.40745 -3.823636 8.305764 2.02716 -3.273211 8.743967 2.1732 -2.823752 8.853155 1.58035 -3.142904 8.743277 0.9596133 -4.882094 11.28321 1.06462 -5.127624 11.02078 1.53576 -5.095288 11.24641 2.13284 -4.513732 11.49533 2.195569 -4.180423 11.61981 1.72171 -4.409139 11.70282 1.13072 -6.781579 13.47545 1.06409 -7.071626 13.16286 1.44793 -6.892698 13.23585 1.993289 -6.516075 13.63358 2.10893 -6.373925 14.05482 1.74622 -6.492103 13.93719 1.19218 -3.887265 8.900772 2.173171 -3.764633 8.345238 1.406459 -4.047653 8.326751 2.638415 -3.933948 7.693693 1.892847 -3.316294 8.276681 2.823592 -3.131672 7.640515 2.10089 -3.155896 8.850711 2.358344 -2.962356 8.29206 1.614501 -4.279983 10.06345 3.353245 -4.514678 9.778429 3.928565 -3.8685 9.761133 4.150956 -3.696755 10.21957 3.673836 -4.374828 12.01273 4.339196 -4.596639 11.64529 4.77783 -4.024456 11.50305 4.94786 -3.802652 11.87114 4.509893 -4.505865 12.70796 5.17583 -4.707176 12.41654 5.644028 -4.170555 12.18348 5.69313 -3.952058 12.59189 5.332347 -3.676147 13.72358 5.762544 -3.816207 13.61546 6.286659 -3.424224 13.22535 6.296613 -3.237462 13.38895 5.802342 2.208919 5.84553 -1.507716 2.882353 5.105139 -1.337435 2.23504 5.761848 -2.316666 2.924288 4.992409 -2.23037 1.588697 5.268739 -2.2828 2.22748 4.422568 -2.191158 1.562572 5.352409 -1.47386 2.185545 4.535299 -1.298221 0.521862 6.838949 -1.443911 0.5988083 6.868029 -2.028738 0.4052658 6.313869 -2.093872 0.3283196 6.284789 -1.509045 -0.6105805 7.163609 -1.858729 -0.4827991 7.210878 -2.407249 -0.6030417 6.659948 -2.44549 -0.9125667 6.700039 -1.974288 -1.430208 7.646139 -2.278378 -1.224615 7.686969 -2.764997 -1.61719 7.389779 -2.960712 -1.758503 7.273688 -2.463424 -1.85664 8.488069 -2.146281 -1.786649 8.654759 -2.614098 -2.257202 8.520949 -2.724626 -2.340797 8.40175 -2.244681 -1.96682 9.845561 -1.755031 -1.933799 9.790219 -2.259799 -2.419495 9.93458 -2.3067 -2.45189 9.721419 -1.845771 -1.867655 11.2027 -1.747831 -1.85347 11.0172 -2.185724 -2.297414 11.1741 -2.253849 -2.30023 11.0134 -1.806074 1.769226 7.185499 -2.520787 1.863052 6.720388 -2.87489 1.281644 6.613218 -2.906457 1.187818 7.078329 -2.552355 1.539418 7.842258 -3.640299 1.647259 7.371228 -3.921319 1.10661 7.237638 -3.873182 0.9906693 7.758168 -3.705634 1.547505 8.10859 -4.710106 1.655427 7.629278 -4.900853 1.167648 7.592617 -5.097052 1.041436 8.032919 -4.836333 1.931435 8.66965 -5.380421 2.118497 8.45936 -5.793921 1.667315 8.479609 -6.008925 1.479334 8.685939 -5.593838 1.947388 9.939489 -5.413055 2.137379 9.779419 -5.837518 1.723856 9.895888 -6.076921 1.509018 9.929849 -5.635817 2.436405 11.1812 -5.733478 2.504297 10.8456 -6.100183 2.206004 11.1441 -6.371506 1.994044 11.0456 -5.927545 5.772064 11.12791 -3.555328 4.732781 10.9575 -3.967098 5.8662 10.49463 -3.529581 4.86381 10.24566 -3.927084 6.1413 10.51465 -4.107973 5.153851 10.26164 -4.591332 6.047174 11.14793 -4.133718 5.022793 10.97358 -4.631345 6.765134 11.23715 -3.06714 6.822683 10.64376 -3.053512 7.012137 10.66598 -3.618487 7.091715 11.25461 -3.565753 7.831493 11.00442 -2.589704 7.693614 10.47573 -2.758729 8.144478 10.49802 -3.109875 8.013361 11.05433 -3.129627 8.610638 10.95273 -1.801658 8.71921 10.44058 -1.84505 9.158102 10.55142 -2.111679 8.998143 11.05089 -2.14255 9.083043 11.18245 -0.9431228 9.285855 10.78765 -0.6378068 9.692675 10.95208 -0.9503831 9.533898 11.44972 -0.8184452 8.879282 11.42437 0.4061281 8.989924 11.05864 0.7064397 9.430462 11.22621 0.5882022 9.251046 11.67786 0.5895087 -2.310091 12.673 -2.138262 2.686767 12.4851 -6.196251 11.16031 18.20944 -0.6673365 5.82213 23.46288 1.470985 4.52741 15.87889 2.685417 7.416634 11.94208 -3.382565 -0.2352118 13.32211 -2.92234 -1.220673 20.44232 0.07731777 9.511534 24.21309 -5.347549 10.49703 17.09287 -8.347167 4.748911 21.65629 -10.95528 3.454192 14.07231 -9.740902 -1.883953 19.32575 -7.602606 1.859688 25.59312 -4.887325 -11.47488 20.839 5.79498 -4.236196 20.3657 6.86486 -6.887121 24.733 1.60499 -8.378851 14.3197 7.09148 -1.877651 14.1846 3.70278 -0.9557114 20.6204 0.3119451 -12.66815 21.3862 -1.41917 -10.3096 15.2051 -4.58125 -13.59008 14.9504 1.97166 -7.65867 10.8378 0.6786161 -3.070914 14.7319 -3.51137 -6.166941 21.2511 -4.80787 -5.645736 16.7223 8.245051 -4.466335 19.2722 4.497081 -7.663335 15.8715 4.10431 -6.328936 12.3079 6.83568 -5.571735 12.1295 2.216668 -4.420535 16.4337 0.7713306 -1.155995 17.8104 7.4712 -2.307145 13.5062 8.916531 0.9356247 14.0684 5.58356 -2.261405 10.6677 5.19079 -1.081985 13.2176 1.442813 -0.3987955 17.632 2.85218 -3.756587 13.3493 -4.438346 -2.020675 15.2723 -3.433027 -1.055385 13.2562 -5.083992 -2.417755 10.9144 -4.466166 0.145595 11.3325 -3.478046 0.391005 14.0259 -2.839536 -3.979632 14.1765 -1.794847 -4.22504 11.4831 -2.433357 -2.778655 12.2528 -0.1889066 -1.813355 10.2367 -1.839866 -0.0774548 12.1597 -0.8345466 -1.416285 14.5946 -0.8067265 13.9192 11.3979 0.3004074 11.569 9.366172 -1.326893 11.6449 12.8144 -1.962592 12.2513 8.876612 2.078197 8.94605 8.734772 0.9140072 8.57131 11.1684 -1.583392 12.3741 14.4559 1.049607 9.75122 13.8245 3.290507 12.7489 12.0222 3.546967 9.675271 10.3763 3.926198 7.40095 11.7927 1.663227 9.06893 14.3141 -0.1145925 3.636354 12.07548 -9.888342 6.182144 13.33248 -7.515882 4.674674 9.991175 -7.012992 1.102719 10.19468 -7.956182 2.082637 10.28938 -4.389576 5.221894 12.22868 -4.117452 3.541844 15.60107 -8.769872 0.4025941 13.66178 -9.041993 0.949804 15.89917 -6.146457 -0.5576561 12.55787 -5.643568 1.988131 13.81497 -3.271102 4.521764 15.69577 -5.203266 -0.36303 2.39901 -1.143419 -1.26129 2.20093 -0.1944041 -0.7141771 2.18956 0.836823 1.057087 5.880399 -1.514347 0.4832602 2.3491 1.08727 1.31858 2.03719 0.1039319 0.8542018 2.07139 -0.9690783 -0.04827833 3.49454 -0.5240212 0.3244271 3.47256 0.4583736 1.808047 6.392759 -1.572148 1.885612 6.351119 -2.470978 1.167093 5.911159 -2.318858 1.163083 6.784368 -2.070596 2.804162 12.4928 -5.948252 2.89197 12.2734 -6.293505 2.568038 12.4726 -6.443718 -2.07424 12.5037 -2.305178 -2.454145 12.411 -2.32254 2.453561 12.5966 -6.087737 -2.124779 12.659 -1.928994 -2.506891 12.581 -1.947689 + + + + + + + + + + -0.7110432 0.3636389 -0.6018175 -0.576447 0.7944955 0.1910129 0.1848869 0.4412974 0.8781079 0.7241904 -0.3382599 0.6009398 0.5949307 -0.7554369 -0.2745409 -0.1248802 -0.3937586 -0.9106916 -0.8344414 0.1437208 -0.5320261 -0.8266993 0.3539389 0.4373735 -0.04282712 0.2565516 0.9655813 0.7853065 -0.0490905 0.6171581 0.8782176 -0.32547 -0.3504327 0.08931541 -0.2433025 -0.9658295 -0.8294478 -0.1028093 -0.5490418 -0.8152329 0.5157319 0.2634689 0.08302426 0.5999063 0.7957509 0.844065 0.1087523 0.5250975 0.8229402 -0.5041652 -0.2618913 0.01148223 -0.626634 -0.7792292 -0.6302735 0.2505809 -0.7348228 -0.9044377 0.2036129 0.374879 -0.1876131 -0.02232182 0.9819894 0.7711553 -0.2033954 0.6032827 0.7954135 -0.1416803 -0.5892744 0.3482538 0.09382432 -0.932693 -0.7123794 -0.1597988 -0.6833594 -0.8426446 -0.3075465 0.4420014 0.2008804 -0.02172166 0.979375 0.7788562 0.2244216 0.5856773 0.5969419 0.1800104 -0.7818291 0.3487144 0.1012338 -0.9317457 -0.7973257 -0.03919017 -0.6022755 -0.922834 -0.0929166 0.3738233 -0.1637428 -0.04894584 0.9852881 0.8141075 0.07103836 0.5763528 0.9141396 0.158308 -0.3732122 -0.09295195 0.05348575 -0.9942331 -0.6898235 -0.3374254 -0.6405371 -0.6337644 -0.724869 0.2700141 8.52782e-4 -0.3951147 0.9186314 0.6588412 0.3464719 0.6677467 0.6354735 0.7491058 -0.1871204 -0.1111856 0.4162625 -0.9024208 -0.7881252 -0.07406586 -0.6110427 -0.8669825 -0.1767219 0.4659515 -0.1838793 -0.09508156 0.9783394 0.783306 0.1036325 0.6129372 0.950447 0.2284855 -0.2108197 0.1217209 0.08256834 -0.9891241 -0.8089375 -0.2825028 -0.5155701 -0.8572321 -0.3420521 0.3849073 -0.1723737 -0.1097208 0.9789018 0.7313001 0.324849 0.5997278 0.7809712 0.4071592 -0.4736089 0.06376194 0.0847696 -0.9943584 -0.5071827 -0.4396328 -0.7412751 -0.7165425 -0.6387944 0.2801939 -0.08894544 -0.04297119 0.9951092 0.5125491 0.454379 0.728583 0.7285789 0.6582236 -0.1895116 0.1558983 0.1720893 -0.9726669 -0.9715682 0.08856725 -0.2195701 -0.2077 -0.7610571 0.6145347 0.9589601 -0.0405063 0.280633 0.1975473 0.807838 -0.5553134 -0.9313083 0.1948157 -0.3077527 -0.3659345 -0.7177556 0.5923842 0.9298781 -0.1759125 0.3230816 0.3544439 0.734219 -0.5790442 -0.8075122 0.5895209 0.01972866 -0.2251914 -0.3249849 0.9185172 0.836015 -0.5388264 -0.1036589 0.3138007 0.2695775 -0.910416 0.744468 0.6658504 -0.04909884 0.02036422 -0.0933988 -0.9954205 -0.7994734 -0.5996098 0.03619951 -0.06949973 0.1587133 0.9848756 0.2473163 0.9655807 0.08055227 0.328566 -0.006153404 -0.944461 -0.2963747 -0.9511655 -0.08629173 -0.3521974 -0.003871142 0.9359179 0.4306442 0.8850763 0.1765947 0.4192935 -0.02852767 -0.9074025 -0.4403991 -0.8384968 -0.3208921 -0.497004 0.006971359 0.8677203 0.8234896 0.4185094 0.3830339 0.1435586 0.2793713 -0.9493907 -0.8787316 -0.4044358 -0.2535007 -0.1544944 -0.229041 0.9610785 0.9962481 0.06410157 0.05814427 0.1326672 0.3108615 -0.9411507 -0.9908168 -0.08195847 -0.1075402 -0.1058002 -0.2833071 0.9531754 0.9953233 -0.07306271 0.06319338 0.1114655 0.05261385 -0.9923745 -0.9930031 0.1170458 -0.01566165 -0.1816711 -0.008887648 0.9833193 0.9690683 0.2398239 -0.05823355 0.1804463 -0.8180972 -0.5460367 -0.9745202 -0.2218353 0.03315961 -0.1895958 0.8313179 0.5224596 0.9799472 0.1914938 0.05508047 0.2116139 -0.9455409 -0.2473299 -0.9708114 -0.2130263 -0.1102049 -0.1983365 0.9544255 0.2230129 0.8683959 -0.001808822 0.4958681 0.290674 -0.7605764 -0.5805448 -0.8982304 0.05810976 -0.4356667 -0.2550054 0.8003741 0.5425621 0.9112149 5.70709e-4 0.4119312 0.4871082 -0.06127256 -0.8711897 -0.8988153 0.006658017 -0.4382769 -0.4258669 0.02859151 0.904334 0.8862609 -0.2480996 0.391137 0.3953154 -0.3457008 -0.8510093 -0.892917 0.2577972 -0.3691069 -0.4227515 0.3968033 0.8147568 -0.3659489 -0.01656669 0.9304875 0.2141999 -0.9742724 0.07008439 0.4334292 0.02916574 -0.9007155 -0.1500822 0.9879739 -0.03719049 -0.4384468 -0.02865296 0.8983004 0.1487036 -0.988821 0.01097446 0.4848267 0.03653609 -0.8738468 -0.08898258 0.9957585 -0.02339553 -0.4120202 -0.01903766 0.9109759 -0.1585795 -0.9830657 -0.09183895 0.4169782 0.06609195 -0.9065104 0.1533293 0.9789484 0.1347224 -0.6650415 -0.06442958 0.744022 0.01039075 -0.9986912 -0.05007886 0.6859784 0.1760551 -0.7060016 -0.1026119 0.9808093 0.1657824 -0.8288232 -0.2193124 0.5147371 0.4165709 -0.9067652 0.06515854 0.8469704 0.2419919 -0.4733719 -0.4967371 0.8658382 -0.0598039 -0.8739432 -0.4839208 -0.04521232 0.5137912 -0.8252189 0.2345898 0.9548334 0.2744764 0.1138249 -0.4672217 0.853131 -0.2321019 -0.7325683 0.08851271 -0.6749143 -0.8805919 0.07430905 0.468013 -0.2091597 0.1087915 0.971811 0.7726851 0.0868892 0.6288148 0.960062 0.02543163 -0.278629 0.09348595 0.09843766 -0.9907425 -0.3017491 0.5334495 -0.7901767 0.005970776 0.9997801 0.02010381 0.4543707 0.4831764 0.7483903 0.7263597 -0.16118 0.6681486 0.4357935 -0.8736329 -0.2164481 0.02689075 -0.389909 -0.9204608 -0.69279 -0.1905483 -0.6955094 -0.4394873 -0.8699797 0.2235758 -0.1621455 -0.2720207 0.9485324 0.2786987 0.4988076 0.8206814 0.1019662 0.9946523 -0.01643031 -0.2768029 0.5319727 -0.8002408 0.8533343 0.5189999 0.04959583 -0.006368458 -0.06020486 -0.9981657 -0.7120185 -0.6911631 -0.1237868 0.01484906 0.09057319 0.9957791 0.1513115 0.9860794 0.06893801 -0.1385218 0.2702467 -0.9527741 -0.4878903 -0.867173 -0.0998702 0.09163087 -0.02199065 0.9955502 0.9818981 0.1805039 0.05739706 0.1306099 -0.06012684 -0.989609 -0.9892783 -0.1353704 -0.05480313 -0.1621155 0.0675624 0.9844561 0.9866984 0.1423224 0.07855427 0.2420153 -0.6456649 -0.7242551 -0.9882969 0.0374996 -0.1478616 -0.03058248 0.7663674 0.6416741 0.9140371 -0.2004283 0.3526538 0.3422071 -0.1437296 -0.9285668 -0.8975124 0.2268487 -0.3781682 -0.2984011 0.2351397 0.9250222 0.4058226 0.862739 -0.3016446 -0.1608493 0.8901532 -0.4263273 -0.7493695 -0.05225068 0.6600874 0.6074178 0.731296 -0.3102417 0.3519385 0.9133072 -0.2049618 -0.8694562 0.286119 0.4027181 0.9234324 -0.124543 0.3629901 -0.3510642 -0.4004535 0.8463988 0.3403766 0.4375345 -0.8322905 -0.938097 0.1084608 -0.3289533 0.9337454 0.02828735 0.3568186 -0.2209219 -0.694478 0.6847583 0.2141806 0.730502 -0.6484547 -0.9473087 0.00510025 -0.3202815 0.4300923 0.07069563 0.9000127 0.5203885 -0.5816868 0.6251692 -0.124901 -0.8584408 0.497473 -0.6139988 -0.3770996 0.6933985 -0.2709921 0.1971353 0.9421789 0.613997 0.3770994 -0.6934002 0.2709968 -0.1971296 -0.9421788 -0.4300875 -0.07069081 -0.9000154 -0.5203852 0.5816878 -0.625171 0.1249006 0.8584396 -0.497475 0.7123253 0.5426334 0.4451311 0.8584191 -0.5129487 4.39199e-4 -0.1856718 -0.9607398 -0.2061676 -0.9770475 -0.1819187 0.1108318 -0.4220564 0.7472134 0.513362 0.9770462 0.1819244 -0.1108341 0.4220587 -0.7472132 -0.5133605 -0.712327 -0.542632 -0.4451302 -0.8584216 0.5129446 -4.38251e-4 0.1856717 0.9607395 0.2061693 -0.04688209 0.75678 0.6519863 -0.1366133 0.1304139 0.9820026 0.4406579 -0.2698431 0.8561573 0.8871606 0.1091445 0.4483678 0.5858404 0.7436323 0.3221834 -0.8871606 -0.1091448 -0.4483677 -0.5858402 -0.7436323 -0.3221836 0.04689329 -0.7567763 -0.6519899 0.136615 -0.1304152 -0.9820022 -0.4406575 0.269843 -0.8561575 -0.5540626 0.8181625 0.1537041 -0.6992518 -0.1953177 0.6876758 0.2347913 -0.8429508 0.4840527 0.9572513 -0.2297326 -0.1757636 0.4697066 0.7968889 -0.3799263 -0.9572524 0.2297304 0.1757611 -0.4697068 -0.7968889 0.3799261 0.5540667 -0.8181575 -0.1537154 0.6992513 0.1953199 -0.6876757 -0.2347912 0.8429508 -0.4840529 -0.7235123 0.6550015 0.217952 -0.8989005 -7.67928e-4 0.4381523 -0.8919335 -0.4332308 -0.1294832 -0.712237 -0.04473489 -0.7005122 -0.608146 0.6278258 -0.4857914 0.7122385 0.04474115 0.7005102 0.6081455 -0.6278303 0.4857861 0.7235092 -0.6550051 -0.2179515 0.8988997 7.70385e-4 -0.4381539 0.8919316 0.4332352 0.1294819 -0.1107798 0.8375732 0.5349758 -0.3945525 -0.2234922 0.8912798 -0.3832754 -0.9232343 -0.02717268 -0.09252989 -0.294635 -0.9511197 0.07588654 0.7936046 -0.603683 0.09252887 0.2946348 0.9511198 -0.07588702 -0.7936034 0.6036844 0.1107792 -0.8375738 -0.5349749 0.3945572 0.2234917 -0.8912779 0.3832747 0.9232347 0.02717179 -0.1716611 0.5736619 -0.8009023 -0.2346943 -0.1180225 -0.9648779 0.3846485 -0.4381218 -0.8124623 0.8304597 0.05573368 -0.5542838 0.4866248 0.681046 -0.5471497 -0.8304591 -0.05573421 0.5542846 -0.4866244 -0.6810472 0.5471486 0.1716596 -0.57366 0.800904 0.2346931 0.1180217 0.9648783 -0.3846488 0.43812 0.812463 -0.6357952 0.7197232 -0.2788601 -0.7377761 -0.3994497 -0.5441751 0.264333 -0.9173813 -0.2975563 0.9856773 -0.1183024 0.1201871 0.4293436 0.8934795 0.131752 -0.9856777 0.1183012 -0.120185 -0.4293432 -0.8934798 -0.131751 0.635797 -0.7197215 0.2788603 0.7377752 0.3994482 0.5441773 -0.2643333 0.9173815 0.2975555 0.6480336 -0.1518517 -0.74632 0.7242854 -0.6470631 -0.2381598 0.0988456 -0.9819937 -0.1609905 -0.3639327 -0.6937857 -0.6214615 -0.02452152 -0.1807235 -0.9832283 0.3639497 0.6937721 0.6214668 0.02453768 0.1807218 0.9832282 -0.6480249 0.151862 0.7463255 -0.724284 0.6470627 0.2381649 -0.09883975 0.9819928 0.1609997 0.7492941 0.4882139 -0.4474434 0.8726701 -0.3130391 0.3747712 -0.1392969 -0.8549585 0.4996423 -0.8881144 -0.388612 -0.2454257 -0.3389434 0.4415224 -0.8307679 0.8881186 0.3886086 0.2454156 0.3389354 -0.4415268 0.8307688 -0.7492797 -0.4882242 0.4474564 -0.8726662 0.3130403 -0.3747793 0.1393097 0.8549602 -0.4996356 0.7219508 -0.4096477 -0.5576522 0.1164619 -0.7836877 -0.6101396 -0.06875348 -0.9966024 0.04535114 0.4222772 -0.7541384 0.5029485 0.9109595 -0.3913829 0.1302777 -0.4222854 0.7541472 -0.5029287 -0.910961 0.391383 -0.1302669 -0.721959 0.4096478 0.5576415 -0.1164793 0.7836965 0.6101249 0.06872314 0.9966049 -0.04534345 0.5869228 0.2590813 -0.7670714 -0.3927864 -0.3461424 -0.8520003 -0.6924597 -0.6906446 0.20859 0.1020314 -0.2983276 0.9489943 0.8927362 0.2886331 0.345996 -0.102032 0.2983263 -0.9489947 -0.8927329 -0.2886331 -0.3460044 -0.5869176 -0.2590825 0.767075 0.3927865 0.3461439 0.8519997 0.6924732 0.69063 -0.2085931 -0.7041261 0.3557093 -0.6145547 -0.5472651 0.7820034 0.2982811 0.05531275 0.5023939 0.862868 0.7213245 -0.3347926 0.6063044 0.6340078 -0.739722 -0.2254895 -0.07535153 -0.4627863 -0.8832617 -0.7809159 0.0719397 -0.6204798 -0.8729453 0.3646878 0.32399 -0.1435679 0.3032949 0.9420195 0.8495947 -0.1242404 0.5125946 0.8056735 -0.3621682 -0.4687476 0.1872727 -0.2956802 -0.9367508 -0.8087095 -0.1210979 -0.5756077 -0.8596916 0.4840176 0.163271 -0.05759495 0.6615396 0.7476953 0.8992034 0.04640692 0.4350628 0.8337062 -0.4972597 -0.2401394 -0.1019818 -0.5743381 -0.8122411 -0.6102802 0.2409082 -0.7546665 -0.9448541 0.1975278 0.2612155 0.1894085 -0.2075316 0.9597162 0.7040811 -0.1710005 0.6892232 0.927052 -0.153391 -0.3421199 0.02523106 0.1072922 -0.9939074 -0.7980847 -0.1684653 -0.5785157 -0.8311269 -0.2968762 0.4702048 -0.04815459 -0.04705512 0.997731 0.7957133 0.2261462 0.5618704 0.8552882 0.3445486 -0.3869991 -0.0972324 0.0643956 -0.9931764 -0.8051103 -0.03842312 -0.5918794 -0.9204561 -0.09190791 0.3798862 -0.04798817 -0.05784487 0.9971716 0.8033216 0.07173568 0.5912092 0.9247842 0.1626491 -0.343976 0.178023 0.1279907 -0.9756671 -0.6807007 -0.3286698 -0.654693 -0.676288 -0.7072722 0.2059143 0.05711287 -0.3689761 0.9276825 0.6700967 0.3564525 0.6510853 0.6306589 0.7463181 -0.2127878 -0.009042799 0.4580866 -0.8888616 -0.8753895 -0.1340945 -0.4644479 -0.9105613 -0.1599997 0.3811541 -0.1669709 -0.08891421 0.9819445 0.7931075 0.1096867 0.5991238 0.8633882 0.1719256 -0.4743441 0.1623529 0.1001338 -0.9816389 -0.789135 -0.2603952 -0.5562916 -0.8970968 -0.3950517 0.1978675 -0.08706867 -0.04734724 0.9950765 0.7242031 0.3240219 0.6087198 0.8755085 0.3909994 -0.2839092 0.1486939 0.142274 -0.9785951 -0.5766308 -0.5481501 -0.6058288 -0.7145165 -0.6232513 0.317843 -0.1904011 -0.1035444 0.9762305 0.5900662 0.5755046 0.5662301 0.6964749 0.6572054 -0.2881043 0.07870829 0.0679571 -0.9945787 -0.9704536 0.08956396 -0.2240496 -0.2099123 -0.7598665 0.615256 0.9591912 -0.04033845 0.2798663 0.1957856 0.8087189 -0.5546547 -0.9393424 0.1877423 -0.2870342 -0.3556296 -0.7238899 0.5911946 0.9191455 -0.1840883 0.3482574 0.3203169 0.7526426 -0.575262 -0.7535588 0.6540127 -0.0664581 -0.3167197 -0.2952393 0.9014003 0.728989 -0.6827359 0.04946553 0.2937428 0.2762471 -0.9150971 0.746594 0.6637862 -0.04455715 0.01909387 -0.09339416 -0.9954462 -0.7986087 -0.6006292 0.0383231 -0.07441228 0.1587429 0.9845119 0.2537606 0.9568507 0.1415713 0.3281738 -0.003589272 -0.9446105 -0.2806502 -0.9542497 -0.1031652 -0.3416954 0.008881509 0.9397688 0.4320978 0.8649845 0.2551341 0.4496396 -0.005741536 -0.8931917 -0.4543295 -0.8619232 -0.225107 -0.4292535 0.05490183 0.9015139 0.8747127 0.4001343 0.2734419 0.2448124 0.2865938 -0.9262456 -0.8479492 -0.4095229 -0.3365612 -0.2029519 -0.2863371 0.9363875 0.9821811 0.07328563 0.1730592 0.1790537 0.2977761 -0.9376936 -0.9835222 -0.02884745 -0.1784709 -0.1389918 -0.2972441 0.9446308 0.9949269 -0.06952619 0.07270908 0.1606811 0.0262435 -0.9866575 -0.994899 0.09677469 0.0284751 -0.1354303 0.004639446 0.9907761 0.9676091 0.248403 -0.04504191 0.1524996 -0.8173707 -0.5555619 -0.9733012 -0.2272286 0.03243392 -0.1817641 0.8314255 0.5250654 0.9786692 0.1965072 0.05992919 0.1781574 -0.9473943 -0.2659025 -0.9778808 -0.1889018 -0.08980715 -0.1746361 0.9557782 0.2366226 0.9022287 -0.04148966 0.4292575 0.2458476 -0.7702498 -0.5884508 -0.8771194 0.03231722 -0.479184 -0.2280949 0.8069576 0.5447863 0.9126028 -9.57803e-4 0.4088462 0.4285948 -0.03594583 -0.9027815 -0.9077873 0.01611894 -0.4191211 -0.4533575 0.04086709 0.8903915 0.8687787 -0.1859103 0.4589782 0.4082459 -0.3560712 -0.8405644 -0.8603036 0.259209 -0.4389631 -0.467489 0.3889564 0.7938306 -0.3653798 -0.0149374 0.9307388 0.2158144 -0.9739977 0.06894034 0.4329661 0.02772361 -0.9009838 -0.146253 0.9884414 -0.03992205 -0.4426816 -0.02234512 0.8964005 0.1506172 -0.9878825 0.03745192 0.4765165 0.01433014 -0.8790488 -0.102391 0.9946418 -0.0142762 -0.3487039 -0.2016775 0.915277 -0.07480335 -0.9845112 -0.158563 0.4316056 0.0224384 -0.9017833 0.1465993 0.9792525 0.1399047 -0.702507 -0.2066248 0.6810215 0.172304 -0.9773743 -0.1226829 0.7011599 0.1404367 -0.6990367 -0.06635159 0.9953616 0.06966191 -0.8873395 -0.1094168 0.447947 0.3349754 -0.9275228 0.1658099 0.8135704 0.3769591 -0.4427247 -0.3117278 0.9466471 -0.0817632 -0.9164742 -0.3800167 -0.1251498 0.4041839 -0.875316 0.2654383 0.922081 0.3659284 0.1259488 -0.4507151 0.8643531 -0.2230466 -0.7427213 0.08175075 -0.6645915 -0.9043287 0.1013319 0.4146344 -0.2169858 0.1050993 0.9705005 0.8053449 0.05871999 0.5898913 0.9153526 0.08576428 -0.3934136 0.1586736 0.06527906 -0.9851707 -0.2063767 0.6173443 -0.7591407 0.08031785 0.9850495 -0.1524029 0.4819348 0.6407941 0.5975967 0.8563605 -0.1942619 0.4784444 0.3535221 -0.933097 -0.06597304 -0.1307672 -0.3985139 -0.9077923 -0.8293284 -0.1695362 -0.5324208 -0.6386485 -0.7460375 0.188564 -0.04419863 -0.2754709 0.9602928 0.1582042 0.6605954 0.7338837 0.1668623 0.9859258 0.01035988 -0.2816538 0.5525088 -0.7844777 0.8081658 0.5879307 -0.03472274 -0.03622454 -0.2732091 -0.9612724 -0.8364337 -0.5472687 0.02959281 -0.02389651 0.09961712 0.9947389 0.3394976 0.9013606 0.2688686 -0.0533899 0.1349396 -0.9894145 -0.4830229 -0.8690742 -0.1067664 -0.04823815 -0.09996217 0.9938213 0.9890673 0.1445471 -0.02919417 0.05731225 -0.04811686 -0.9971961 -0.9883021 -0.129687 -0.08025109 -0.07111078 0.1107617 0.9912998 0.987014 0.1421435 0.07482433 0.1695839 -0.7226226 -0.6701179 -0.9869988 -0.1096084 -0.1175558 -0.1828911 0.8433836 0.5052277 0.9127863 -0.1973807 0.3575781 0.5036069 -0.2487597 -0.8273443 -0.9017649 0.2257067 -0.3686142 -0.4480169 0.2221757 0.8659787 -0.1137465 0.6126471 -0.7821287 0.6001394 0.7309606 -0.324853 0.9540244 -0.04980129 0.2955625 -0.3055423 -0.4186099 0.8552249 0.3549883 0.4402512 -0.8247194 -0.9251012 0.1345828 -0.3550708 0.933105 0.02386289 0.3588115 -0.2528808 -0.6868896 0.6813473 0.1780905 0.7175112 -0.6733956 -0.9300993 0.02636927 -0.3663605 + + + + + + + + + + 0.175435 0.1635659 0.202202 0.288261 0.150245 0.289632 0.25416 0.285937 0.227393 0.1635659 0.279351 0.1635659 0.331308 0.1635659 0.25416 0.285937 0.279351 0.1635659 0.383266 0.1635659 0.306118 0.289632 0.331308 0.1635659 0.383266 0.1635659 0.410033 0.285937 0.358075 0.288261 0.487181 0.1635659 0.410033 0.285937 0.435223 0.1635659 0.202202 0.288261 0.1208299 0.437733 0.150245 0.289632 0.224745 0.434466 0.202202 0.288261 0.25416 0.285937 0.276703 0.437733 0.25416 0.285937 0.306118 0.289632 0.306118 0.289632 0.32866 0.435765 0.276703 0.437733 0.358075 0.288261 0.380618 0.434466 0.32866 0.435765 0.46199 0.289632 0.380618 0.434466 0.410033 0.285937 0.144204 0.574706 0.1208299 0.437733 0.172788 0.435765 0.196162 0.579905 0.172788 0.435765 0.224745 0.434466 0.224745 0.434466 0.24812 0.576682 0.196162 0.579905 0.32866 0.435765 0.24812 0.576682 0.276703 0.437733 0.380618 0.434466 0.300077 0.574706 0.32866 0.435765 0.432576 0.437733 0.352035 0.579905 0.380618 0.434466 0.144204 0.574706 0.06456285 0.714772 0.09224677 0.576682 0.196162 0.579905 0.11652 0.717314 0.144204 0.574706 0.220436 0.714772 0.196162 0.579905 0.24812 0.576682 0.272393 0.717314 0.24812 0.576682 0.300077 0.574706 0.300077 0.574706 0.324351 0.716962 0.272393 0.717314 0.352035 0.579905 0.376309 0.714772 0.324351 0.716962 0.11652 0.717314 0.03553456 0.86116 0.06456285 0.714772 0.168478 0.716962 0.08749216 0.86143 0.11652 0.717314 0.191408 0.86116 0.168478 0.716962 0.220436 0.714772 0.243365 0.86143 0.220436 0.714772 0.272393 0.717314 0.295323 0.865035 0.272393 0.717314 0.324351 0.716962 0.376309 0.714772 0.295323 0.865035 0.324351 0.716962 0.08749216 0.86143 0.00999999 0.99 0.03553456 0.86116 0.13945 0.865035 0.06195759 0.988661 0.08749216 0.86143 0.13945 0.865035 0.165873 0.99 0.113915 0.98979 0.191408 0.86116 0.217831 0.988661 0.165873 0.99 0.269788 0.98979 0.243365 0.86143 0.295323 0.865035 0.321746 0.99 0.295323 0.865035 0.34728 0.86116 0.227375 0.163655 0.149675 0.290455 0.175418 0.163655 0.227375 0.163655 0.25359 0.288954 0.201632 0.292434 0.279333 0.163655 0.305548 0.290455 0.25359 0.288954 0.33129 0.163655 0.357505 0.292434 0.305548 0.290455 0.409463 0.288954 0.383248 0.163655 0.435206 0.163655 0.487163 0.163655 0.409463 0.288954 0.435206 0.163655 0.173259 0.433 0.149675 0.290455 0.201632 0.292434 0.225217 0.432648 0.201632 0.292434 0.25359 0.288954 0.225217 0.432648 0.305548 0.290455 0.277175 0.437702 0.277175 0.437702 0.357505 0.292434 0.329132 0.433 0.38109 0.432648 0.357505 0.292434 0.409463 0.288954 0.433048 0.437702 0.409463 0.288954 0.461421 0.290455 0.1443679 0.572834 0.121302 0.437702 0.173259 0.433 0.225217 0.432648 0.1443679 0.572834 0.173259 0.433 0.277175 0.437702 0.196326 0.579962 0.225217 0.432648 0.277175 0.437702 0.300241 0.572834 0.248283 0.57602 0.38109 0.432648 0.300241 0.572834 0.329132 0.433 0.38109 0.432648 0.404156 0.57602 0.352199 0.579962 0.0924105 0.57602 0.117582 0.713252 0.06562465 0.709654 0.196326 0.579962 0.117582 0.713252 0.1443679 0.572834 0.221498 0.709654 0.196326 0.579962 0.248283 0.57602 0.221498 0.709654 0.300241 0.572834 0.273455 0.713252 0.352199 0.579962 0.273455 0.713252 0.300241 0.572834 0.352199 0.579962 0.37737 0.709654 0.325413 0.711774 0.52166 0.295987 0.472124 0.333762 0.464568 0.295987 0.52166 0.295987 0.586307 0.333762 0.529215 0.333762 0.578752 0.295987 0.643398 0.333762 0.586307 0.333762 0.692935 0.295987 0.643398 0.333762 0.635843 0.295987 0.560793 0.489959 0.512411 0.531188 0.503702 0.48994 0.560793 0.489959 0.626594 0.531188 0.569502 0.534311 0.683685 0.534311 0.617885 0.48994 0.674977 0.489959 0.732068 0.48994 0.683685 0.534311 0.674977 0.489959 0.578416 0.577857 0.512411 0.531188 0.569502 0.534311 0.626594 0.531188 0.578416 0.577857 0.569502 0.534311 0.683685 0.534311 0.635508 0.576322 0.626594 0.531188 0.749691 0.576322 0.683685 0.534311 0.740777 0.531188 0.452228 0.586489 0.412457 0.619443 0.405866 0.586489 0.498591 0.586489 0.458819 0.619443 0.452228 0.586489 0.498591 0.586489 0.551544 0.619443 0.505182 0.619443 0.544953 0.586489 0.597907 0.619443 0.551544 0.619443 0.472169 0.68619 0.435897 0.733184 0.425806 0.68619 0.472169 0.68619 0.528622 0.733184 0.48226 0.736613 0.564894 0.68619 0.528622 0.733184 0.518531 0.68619 0.564894 0.68619 0.621347 0.733184 0.574985 0.736613 0.48226 0.736613 0.444596 0.779163 0.435897 0.733184 0.528622 0.733184 0.490959 0.777583 0.48226 0.736613 0.528622 0.733184 0.583684 0.777583 0.537321 0.779163 0.574985 0.736613 0.630046 0.779163 0.583684 0.777583 0.500113 0.824583 0.444596 0.779163 0.490959 0.777583 0.500113 0.824583 0.537321 0.779163 0.546476 0.823776 0.546476 0.823776 0.583684 0.777583 0.592838 0.824583 0.592838 0.824583 0.630046 0.779163 0.639201 0.823776 0.453751 0.823776 0.510271 0.875009 0.463908 0.879329 0.546476 0.823776 0.510271 0.875009 0.500113 0.824583 0.546476 0.823776 0.602996 0.875009 0.556633 0.879329 0.602996 0.875009 0.639201 0.823776 0.649358 0.879329 0.463908 0.879329 0.520698 0.924894 0.474336 0.930396 0.556633 0.879329 0.520698 0.924894 0.510271 0.875009 0.613423 0.924894 0.556633 0.879329 0.602996 0.875009 0.649358 0.879329 0.613423 0.924894 0.602996 0.875009 0.471845 0.684572 0.435777 0.733512 0.425483 0.684572 0.518207 0.684572 0.482139 0.735481 0.471845 0.684572 0.56457 0.684572 0.528502 0.733512 0.518207 0.684572 0.56457 0.684572 0.621227 0.733512 0.574864 0.735481 0.482139 0.735481 0.444741 0.779574 0.435777 0.733512 0.528502 0.733512 0.491103 0.778269 0.482139 0.735481 0.528502 0.733512 0.583828 0.778269 0.537466 0.779574 0.574864 0.735481 0.630191 0.779574 0.583828 0.778269 0.491103 0.778269 0.453852 0.824765 0.444741 0.779574 0.546577 0.824765 0.491103 0.778269 0.537466 0.779574 0.537466 0.779574 0.59294 0.824696 0.546577 0.824765 0.630191 0.779574 0.59294 0.824696 0.583828 0.778269 0.510036 0.874687 0.453852 0.824765 0.500215 0.824696 0.510036 0.874687 0.546577 0.824765 0.556398 0.876745 0.556398 0.876745 0.59294 0.824696 0.602761 0.874687 0.649123 0.876745 0.59294 0.824696 0.639302 0.824765 0.463673 0.876745 0.520388 0.922535 0.474026 0.929901 0.556398 0.876745 0.520388 0.922535 0.510036 0.874687 0.556398 0.876745 0.613113 0.922535 0.566751 0.929901 0.649123 0.876745 0.613113 0.922535 0.602761 0.874687 0.521713 0.02354669 0.565551 0.06359946 0.513703 0.06359946 0.62541 0.02354669 0.565551 0.06359946 0.573561 0.02354669 0.677258 0.02354669 0.617399 0.06359946 0.62541 0.02354669 0.677258 0.02354669 0.721096 0.06359946 0.669248 0.06359946 0.565551 0.06359946 0.505604 0.101224 0.513703 0.06359946 0.565551 0.06359946 0.609301 0.101224 0.557452 0.103931 0.669248 0.06359946 0.609301 0.101224 0.617399 0.06359946 0.669248 0.06359946 0.712997 0.101224 0.661149 0.103931 0.557452 0.103931 0.497455 0.144623 0.505604 0.101224 0.609301 0.101224 0.549303 0.138767 0.557452 0.103931 0.609301 0.101224 0.6530001 0.138767 0.601152 0.144623 0.704849 0.144623 0.661149 0.103931 0.712997 0.101224 0.540382 0.187948 0.497455 0.144623 0.549303 0.138767 0.601152 0.144623 0.540382 0.187948 0.549303 0.138767 0.601152 0.144623 0.644079 0.187948 0.59223 0.189567 0.644079 0.187948 0.704849 0.144623 0.695927 0.189567 0.540382 0.187948 0.479241 0.2308959 0.488534 0.189567 0.540382 0.187948 0.582938 0.2308959 0.53109 0.23891 0.644079 0.187948 0.582938 0.2308959 0.59223 0.189567 0.644079 0.187948 0.686635 0.2308959 0.634786 0.23891 0.53109 0.23891 0.469084 0.283809 0.479241 0.2308959 0.572781 0.283809 0.53109 0.23891 0.582938 0.2308959 0.634786 0.23891 0.572781 0.283809 0.582938 0.2308959 0.634786 0.23891 0.676477 0.283809 0.624629 0.28951 0.206149 0.00999999 0.241328 0.102556 0.187637 0.102556 0.258644 0.00999999 0.289964 0.102556 0.241328 0.102556 0.361159 0.00999999 0.289964 0.102556 0.310384 0.00999999 0.361159 0.00999999 0.396386 0.102556 0.342201 0.102556 0.465546 0.00999999 0.396386 0.102556 0.41297 0.00999999 0.517894 0.00999999 0.445489 0.102556 0.465546 0.00999999 0.234079 0.1301349 0.175435 0.1635659 0.187637 0.102556 0.279351 0.1635659 0.234079 0.1301349 0.287171 0.124463 0.331308 0.1635659 0.287171 0.124463 0.342201 0.102556 0.396386 0.102556 0.331308 0.1635659 0.342201 0.102556 0.445489 0.102556 0.383266 0.1635659 0.396386 0.102556 0.487181 0.1635659 0.445489 0.102556 0.499383 0.102556 0.241328 0.102556 0.175418 0.163655 0.187637 0.102556 0.279333 0.163655 0.241328 0.102556 0.289964 0.102556 0.33129 0.163655 0.289964 0.102556 0.342201 0.102556 0.3907 0.126395 0.33129 0.163655 0.342201 0.102556 0.442621 0.126578 0.383248 0.163655 0.3907 0.126395 0.487163 0.163655 0.442621 0.126578 0.499383 0.102556 0.417192 0.642528 0.458819 0.619443 0.465536 0.643919 0.511448 0.642381 0.458819 0.619443 0.505182 0.619443 0.511448 0.642381 0.551544 0.619443 0.554412 0.643808 0.551544 0.619443 0.602642 0.642528 0.554412 0.643808 0.425806 0.68619 0.467727 0.663983 0.472169 0.68619 0.518531 0.68619 0.467727 0.663983 0.511448 0.642381 0.554412 0.643808 0.518531 0.68619 0.511448 0.642381 0.611256 0.68619 0.554412 0.643808 0.602642 0.642528 0.474336 0.930396 0.531276 0.982187 0.484913 0.986216 0.567061 0.930396 0.531276 0.982187 0.520698 0.924894 0.624001 0.985614 0.567061 0.930396 0.613423 0.924894 0.659786 0.930396 0.624001 0.985614 0.613423 0.924894 0.465536 0.643919 0.425483 0.684572 0.417192 0.642528 0.518207 0.684572 0.465536 0.643919 0.511448 0.642381 0.560168 0.662561 0.518207 0.684572 0.511448 0.642381 0.610932 0.684572 0.560168 0.662561 0.602642 0.642528 0.530881 0.979097 0.474026 0.929901 0.520388 0.922535 0.530881 0.979097 0.566751 0.929901 0.577243 0.982917 0.623606 0.984496 0.566751 0.929901 0.613113 0.922535 0.623606 0.984496 0.659476 0.929901 0.669968 0.983842 0.170651 0.08143889 0.170651 0.0622766 0.189813 0.0622766 0.151488 0.0622766 0.170651 0.0431143 0.189813 0.0622766 0.151488 0.0622766 0.189813 0.0622766 0.170651 0.0622766 0.16654 0.01740676 0.181276 0.02473568 0.173947 0.03947144 0.188605 0.00999999 0.196012 0.03206467 0.173947 0.03947144 0.188605 0.00999999 0.173947 0.03947144 0.181276 0.02473568 0.617885 0.48994 0.65883 0.412179 0.674977 0.489959 0.544646 0.412179 0.617885 0.48994 0.560793 0.489959 0.732068 0.48994 0.65883 0.412179 0.715921 0.408093 0.560793 0.489959 0.487555 0.408093 0.544646 0.412179 0.643398 0.333762 0.601738 0.408093 0.586307 0.333762 0.601738 0.408093 0.529215 0.333762 0.586307 0.333762 0.715921 0.408093 0.643398 0.333762 0.70049 0.333762 0.529215 0.333762 0.487555 0.408093 0.472124 0.333762 0.08842259 0.846225 0.00999999 0.846225 0.04921138 0.99 0.166845 0.846225 0.08842259 0.846225 0.127634 0.99 0.245268 0.846225 0.166845 0.846225 0.206057 0.99 0.323691 0.846225 0.245268 0.846225 0.28448 0.99 0.402114 0.846225 0.323691 0.846225 0.362902 0.99 0.04921138 0.70245 0.127634 0.70245 0.08842259 0.558675 0.127634 0.70245 0.206057 0.70245 0.166845 0.558675 0.206057 0.70245 0.28448 0.70245 0.245268 0.558675 0.28448 0.70245 0.362902 0.70245 0.323691 0.558675 0.362902 0.70245 0.441325 0.70245 0.402114 0.558675 0.08842259 0.846225 0.04921138 0.70245 0.00999999 0.846225 0.166845 0.846225 0.127634 0.70245 0.08842259 0.846225 0.245268 0.846225 0.206057 0.70245 0.166845 0.846225 0.323691 0.846225 0.28448 0.70245 0.245268 0.846225 0.402114 0.846225 0.362902 0.70245 0.323691 0.846225 0.04921138 0.70245 0.08842259 0.846225 0.127634 0.70245 0.127634 0.70245 0.166845 0.846225 0.206057 0.70245 0.206057 0.70245 0.245268 0.846225 0.28448 0.70245 0.28448 0.70245 0.323691 0.846225 0.362902 0.70245 0.362902 0.70245 0.402114 0.846225 0.441325 0.70245 0.109188 0.373689 0.05959385 0.555533 0.00999999 0.373689 0.208375 0.373689 0.158782 0.555533 0.109188 0.373689 0.307564 0.373689 0.257969 0.555533 0.208375 0.373689 0.406751 0.373689 0.357157 0.555533 0.307564 0.373689 0.505939 0.373689 0.456345 0.555533 0.406751 0.373689 0.05959385 0.191844 0.109188 0.00999999 0.158782 0.191844 0.158782 0.191844 0.208375 0.00999999 0.257969 0.191844 0.257969 0.191844 0.307564 0.00999999 0.357157 0.191844 0.357157 0.191844 0.406751 0.00999999 0.456345 0.191844 0.456345 0.191844 0.505939 0.00999999 0.555533 0.191844 0.109188 0.373689 0.00999999 0.373689 0.05959385 0.191844 0.208375 0.373689 0.109188 0.373689 0.158782 0.191844 0.307564 0.373689 0.208375 0.373689 0.257969 0.191844 0.406751 0.373689 0.307564 0.373689 0.357157 0.191844 0.505939 0.373689 0.406751 0.373689 0.456345 0.191844 0.05959385 0.191844 0.158782 0.191844 0.109188 0.373689 0.158782 0.191844 0.257969 0.191844 0.208375 0.373689 0.257969 0.191844 0.357157 0.191844 0.307564 0.373689 0.357157 0.191844 0.456345 0.191844 0.406751 0.373689 0.456345 0.191844 0.555533 0.191844 0.505939 0.373689 0.464198 0.872173 0.400837 0.872173 0.432518 0.988334 0.527559 0.872173 0.464198 0.872173 0.495878 0.988334 0.59092 0.872173 0.527559 0.872173 0.559239 0.988334 0.654281 0.872173 0.59092 0.872173 0.622601 0.988334 0.717642 0.872173 0.654281 0.872173 0.685962 0.988334 0.432518 0.756011 0.495878 0.756011 0.464198 0.639849 0.495878 0.756011 0.559239 0.756011 0.527559 0.639849 0.559239 0.756011 0.622601 0.756011 0.59092 0.639849 0.622601 0.756011 0.685962 0.756011 0.654281 0.639849 0.685962 0.756011 0.749323 0.756011 0.717642 0.639849 0.464198 0.872173 0.432518 0.756011 0.400837 0.872173 0.527559 0.872173 0.495878 0.756011 0.464198 0.872173 0.59092 0.872173 0.559239 0.756011 0.527559 0.872173 0.654281 0.872173 0.622601 0.756011 0.59092 0.872173 0.717642 0.872173 0.685962 0.756011 0.654281 0.872173 0.432518 0.756011 0.464198 0.872173 0.495878 0.756011 0.495878 0.756011 0.527559 0.872173 0.559239 0.756011 0.559239 0.756011 0.59092 0.872173 0.622601 0.756011 0.622601 0.756011 0.654281 0.872173 0.685962 0.756011 0.685962 0.756011 0.717642 0.872173 0.749323 0.756011 0.74809 0.583761 0.7105 0.583761 0.729295 0.652675 0.785679 0.583761 0.74809 0.583761 0.766884 0.652675 0.823268 0.583761 0.785679 0.583761 0.804473 0.652675 0.860858 0.583761 0.823268 0.583761 0.842063 0.652675 0.898447 0.583761 0.860858 0.583761 0.879652 0.652675 0.729295 0.514847 0.766884 0.514847 0.74809 0.445934 0.766884 0.514847 0.804473 0.514847 0.785679 0.445934 0.804473 0.514847 0.842063 0.514847 0.823268 0.445934 0.842063 0.514847 0.879652 0.514847 0.860858 0.445934 0.879652 0.514847 0.917241 0.514847 0.898447 0.445934 0.74809 0.583761 0.729295 0.514847 0.7105 0.583761 0.785679 0.583761 0.766884 0.514847 0.74809 0.583761 0.823268 0.583761 0.804473 0.514847 0.785679 0.583761 0.860858 0.583761 0.842063 0.514847 0.823268 0.583761 0.898447 0.583761 0.879652 0.514847 0.860858 0.583761 0.729295 0.514847 0.74809 0.583761 0.766884 0.514847 0.766884 0.514847 0.785679 0.583761 0.804473 0.514847 0.804473 0.514847 0.823268 0.583761 0.842063 0.514847 0.842063 0.514847 0.860858 0.583761 0.879652 0.514847 0.879652 0.514847 0.898447 0.583761 0.917241 0.514847 0.588077 0.268129 0.564357 0.355103 0.540636 0.268129 0.635517 0.268129 0.611797 0.355103 0.588077 0.268129 0.682958 0.268129 0.659238 0.355103 0.635517 0.268129 0.730399 0.268129 0.706678 0.355103 0.682958 0.268129 0.777839 0.268129 0.754119 0.355103 0.730399 0.268129 0.564357 0.181155 0.588077 0.09418028 0.611797 0.181155 0.611797 0.181155 0.635517 0.09418028 0.659238 0.181155 0.659238 0.181155 0.682958 0.09418028 0.706678 0.181155 0.706678 0.181155 0.730399 0.09418028 0.754119 0.181155 0.754119 0.181155 0.777839 0.09418028 0.801559 0.181155 0.588077 0.268129 0.540636 0.268129 0.564357 0.181155 0.635517 0.268129 0.588077 0.268129 0.611797 0.181155 0.682958 0.268129 0.635517 0.268129 0.659238 0.181155 0.730399 0.268129 0.682958 0.268129 0.706678 0.181155 0.777839 0.268129 0.730399 0.268129 0.754119 0.181155 0.564357 0.181155 0.611797 0.181155 0.588077 0.268129 0.611797 0.181155 0.659238 0.181155 0.635517 0.268129 0.659238 0.181155 0.706678 0.181155 0.682958 0.268129 0.706678 0.181155 0.754119 0.181155 0.730399 0.268129 0.754119 0.181155 0.801559 0.181155 0.777839 0.268129 0.515525 0.543765 0.465475 0.543765 0.4905 0.635522 0.565574 0.543765 0.515525 0.543765 0.54055 0.635522 0.615624 0.543765 0.565574 0.543765 0.590599 0.635522 0.665673 0.543765 0.615624 0.543765 0.640649 0.635522 0.715723 0.543765 0.665673 0.543765 0.690698 0.635522 0.4905 0.452007 0.54055 0.452007 0.515525 0.36025 0.54055 0.452007 0.590599 0.452007 0.565574 0.36025 0.590599 0.452007 0.640649 0.452007 0.615624 0.36025 0.640649 0.452007 0.690698 0.452007 0.665673 0.36025 0.690698 0.452007 0.740748 0.452007 0.715723 0.36025 0.515525 0.543765 0.4905 0.452007 0.465475 0.543765 0.565574 0.543765 0.54055 0.452007 0.515525 0.543765 0.615624 0.543765 0.590599 0.452007 0.565574 0.543765 0.665673 0.543765 0.640649 0.452007 0.615624 0.543765 0.715723 0.543765 0.690698 0.452007 0.665673 0.543765 0.4905 0.452007 0.515525 0.543765 0.54055 0.452007 0.54055 0.452007 0.565574 0.543765 0.590599 0.452007 0.590599 0.452007 0.615624 0.543765 0.640649 0.452007 0.640649 0.452007 0.665673 0.543765 0.690698 0.452007 0.690698 0.452007 0.715723 0.543765 0.740748 0.452007 0.175435 0.1635659 0.227393 0.1635659 0.202202 0.288261 0.25416 0.285937 0.202202 0.288261 0.227393 0.1635659 0.331308 0.1635659 0.306118 0.289632 0.25416 0.285937 0.383266 0.1635659 0.358075 0.288261 0.306118 0.289632 0.383266 0.1635659 0.435223 0.1635659 0.410033 0.285937 0.487181 0.1635659 0.46199 0.289632 0.410033 0.285937 0.202202 0.288261 0.172788 0.435765 0.1208299 0.437733 0.224745 0.434466 0.172788 0.435765 0.202202 0.288261 0.276703 0.437733 0.224745 0.434466 0.25416 0.285937 0.306118 0.289632 0.358075 0.288261 0.32866 0.435765 0.358075 0.288261 0.410033 0.285937 0.380618 0.434466 0.46199 0.289632 0.432576 0.437733 0.380618 0.434466 0.144204 0.574706 0.09224677 0.576682 0.1208299 0.437733 0.196162 0.579905 0.144204 0.574706 0.172788 0.435765 0.224745 0.434466 0.276703 0.437733 0.24812 0.576682 0.32866 0.435765 0.300077 0.574706 0.24812 0.576682 0.380618 0.434466 0.352035 0.579905 0.300077 0.574706 0.432576 0.437733 0.403993 0.576682 0.352035 0.579905 0.144204 0.574706 0.11652 0.717314 0.06456285 0.714772 0.196162 0.579905 0.168478 0.716962 0.11652 0.717314 0.220436 0.714772 0.168478 0.716962 0.196162 0.579905 0.272393 0.717314 0.220436 0.714772 0.24812 0.576682 0.300077 0.574706 0.352035 0.579905 0.324351 0.716962 0.352035 0.579905 0.403993 0.576682 0.376309 0.714772 0.11652 0.717314 0.08749216 0.86143 0.03553456 0.86116 0.168478 0.716962 0.13945 0.865035 0.08749216 0.86143 0.191408 0.86116 0.13945 0.865035 0.168478 0.716962 0.243365 0.86143 0.191408 0.86116 0.220436 0.714772 0.295323 0.865035 0.243365 0.86143 0.272393 0.717314 0.376309 0.714772 0.34728 0.86116 0.295323 0.865035 0.08749216 0.86143 0.06195759 0.988661 0.00999999 0.99 0.13945 0.865035 0.113915 0.98979 0.06195759 0.988661 0.13945 0.865035 0.191408 0.86116 0.165873 0.99 0.191408 0.86116 0.243365 0.86143 0.217831 0.988661 0.269788 0.98979 0.217831 0.988661 0.243365 0.86143 0.321746 0.99 0.269788 0.98979 0.295323 0.865035 0.227375 0.163655 0.201632 0.292434 0.149675 0.290455 0.227375 0.163655 0.279333 0.163655 0.25359 0.288954 0.279333 0.163655 0.33129 0.163655 0.305548 0.290455 0.33129 0.163655 0.383248 0.163655 0.357505 0.292434 0.409463 0.288954 0.357505 0.292434 0.383248 0.163655 0.487163 0.163655 0.461421 0.290455 0.409463 0.288954 0.173259 0.433 0.121302 0.437702 0.149675 0.290455 0.225217 0.432648 0.173259 0.433 0.201632 0.292434 0.225217 0.432648 0.25359 0.288954 0.305548 0.290455 0.277175 0.437702 0.305548 0.290455 0.357505 0.292434 0.38109 0.432648 0.329132 0.433 0.357505 0.292434 0.433048 0.437702 0.38109 0.432648 0.409463 0.288954 0.1443679 0.572834 0.0924105 0.57602 0.121302 0.437702 0.225217 0.432648 0.196326 0.579962 0.1443679 0.572834 0.277175 0.437702 0.248283 0.57602 0.196326 0.579962 0.277175 0.437702 0.329132 0.433 0.300241 0.572834 0.38109 0.432648 0.352199 0.579962 0.300241 0.572834 0.38109 0.432648 0.433048 0.437702 0.404156 0.57602 0.0924105 0.57602 0.1443679 0.572834 0.117582 0.713252 0.196326 0.579962 0.16954 0.711774 0.117582 0.713252 0.221498 0.709654 0.16954 0.711774 0.196326 0.579962 0.221498 0.709654 0.248283 0.57602 0.300241 0.572834 0.352199 0.579962 0.325413 0.711774 0.273455 0.713252 0.352199 0.579962 0.404156 0.57602 0.37737 0.709654 0.52166 0.295987 0.529215 0.333762 0.472124 0.333762 0.52166 0.295987 0.578752 0.295987 0.586307 0.333762 0.578752 0.295987 0.635843 0.295987 0.643398 0.333762 0.692935 0.295987 0.70049 0.333762 0.643398 0.333762 0.560793 0.489959 0.569502 0.534311 0.512411 0.531188 0.560793 0.489959 0.617885 0.48994 0.626594 0.531188 0.683685 0.534311 0.626594 0.531188 0.617885 0.48994 0.732068 0.48994 0.740777 0.531188 0.683685 0.534311 0.578416 0.577857 0.521325 0.576322 0.512411 0.531188 0.626594 0.531188 0.635508 0.576322 0.578416 0.577857 0.683685 0.534311 0.692599 0.577857 0.635508 0.576322 0.749691 0.576322 0.692599 0.577857 0.683685 0.534311 0.452228 0.586489 0.458819 0.619443 0.412457 0.619443 0.498591 0.586489 0.505182 0.619443 0.458819 0.619443 0.498591 0.586489 0.544953 0.586489 0.551544 0.619443 0.544953 0.586489 0.591316 0.586489 0.597907 0.619443 0.472169 0.68619 0.48226 0.736613 0.435897 0.733184 0.472169 0.68619 0.518531 0.68619 0.528622 0.733184 0.564894 0.68619 0.574985 0.736613 0.528622 0.733184 0.564894 0.68619 0.611256 0.68619 0.621347 0.733184 0.48226 0.736613 0.490959 0.777583 0.444596 0.779163 0.528622 0.733184 0.537321 0.779163 0.490959 0.777583 0.528622 0.733184 0.574985 0.736613 0.583684 0.777583 0.574985 0.736613 0.621347 0.733184 0.630046 0.779163 0.500113 0.824583 0.453751 0.823776 0.444596 0.779163 0.500113 0.824583 0.490959 0.777583 0.537321 0.779163 0.546476 0.823776 0.537321 0.779163 0.583684 0.777583 0.592838 0.824583 0.583684 0.777583 0.630046 0.779163 0.453751 0.823776 0.500113 0.824583 0.510271 0.875009 0.546476 0.823776 0.556633 0.879329 0.510271 0.875009 0.546476 0.823776 0.592838 0.824583 0.602996 0.875009 0.602996 0.875009 0.592838 0.824583 0.639201 0.823776 0.463908 0.879329 0.510271 0.875009 0.520698 0.924894 0.556633 0.879329 0.567061 0.930396 0.520698 0.924894 0.613423 0.924894 0.567061 0.930396 0.556633 0.879329 0.649358 0.879329 0.659786 0.930396 0.613423 0.924894 0.471845 0.684572 0.482139 0.735481 0.435777 0.733512 0.518207 0.684572 0.528502 0.733512 0.482139 0.735481 0.56457 0.684572 0.574864 0.735481 0.528502 0.733512 0.56457 0.684572 0.610932 0.684572 0.621227 0.733512 0.482139 0.735481 0.491103 0.778269 0.444741 0.779574 0.528502 0.733512 0.537466 0.779574 0.491103 0.778269 0.528502 0.733512 0.574864 0.735481 0.583828 0.778269 0.574864 0.735481 0.621227 0.733512 0.630191 0.779574 0.491103 0.778269 0.500215 0.824696 0.453852 0.824765 0.546577 0.824765 0.500215 0.824696 0.491103 0.778269 0.537466 0.779574 0.583828 0.778269 0.59294 0.824696 0.630191 0.779574 0.639302 0.824765 0.59294 0.824696 0.510036 0.874687 0.463673 0.876745 0.453852 0.824765 0.510036 0.874687 0.500215 0.824696 0.546577 0.824765 0.556398 0.876745 0.546577 0.824765 0.59294 0.824696 0.649123 0.876745 0.602761 0.874687 0.59294 0.824696 0.463673 0.876745 0.510036 0.874687 0.520388 0.922535 0.556398 0.876745 0.566751 0.929901 0.520388 0.922535 0.556398 0.876745 0.602761 0.874687 0.613113 0.922535 0.649123 0.876745 0.659476 0.929901 0.613113 0.922535 0.521713 0.02354669 0.573561 0.02354669 0.565551 0.06359946 0.62541 0.02354669 0.617399 0.06359946 0.565551 0.06359946 0.677258 0.02354669 0.669248 0.06359946 0.617399 0.06359946 0.677258 0.02354669 0.729106 0.02354669 0.721096 0.06359946 0.565551 0.06359946 0.557452 0.103931 0.505604 0.101224 0.565551 0.06359946 0.617399 0.06359946 0.609301 0.101224 0.669248 0.06359946 0.661149 0.103931 0.609301 0.101224 0.669248 0.06359946 0.721096 0.06359946 0.712997 0.101224 0.557452 0.103931 0.549303 0.138767 0.497455 0.144623 0.609301 0.101224 0.601152 0.144623 0.549303 0.138767 0.609301 0.101224 0.661149 0.103931 0.6530001 0.138767 0.704849 0.144623 0.6530001 0.138767 0.661149 0.103931 0.540382 0.187948 0.488534 0.189567 0.497455 0.144623 0.601152 0.144623 0.59223 0.189567 0.540382 0.187948 0.601152 0.144623 0.6530001 0.138767 0.644079 0.187948 0.644079 0.187948 0.6530001 0.138767 0.704849 0.144623 0.540382 0.187948 0.53109 0.23891 0.479241 0.2308959 0.540382 0.187948 0.59223 0.189567 0.582938 0.2308959 0.644079 0.187948 0.634786 0.23891 0.582938 0.2308959 0.644079 0.187948 0.695927 0.189567 0.686635 0.2308959 0.53109 0.23891 0.520932 0.28951 0.469084 0.283809 0.572781 0.283809 0.520932 0.28951 0.53109 0.23891 0.634786 0.23891 0.624629 0.28951 0.572781 0.283809 0.634786 0.23891 0.686635 0.2308959 0.676477 0.283809 0.206149 0.00999999 0.258644 0.00999999 0.241328 0.102556 0.258644 0.00999999 0.310384 0.00999999 0.289964 0.102556 0.361159 0.00999999 0.342201 0.102556 0.289964 0.102556 0.361159 0.00999999 0.41297 0.00999999 0.396386 0.102556 0.465546 0.00999999 0.445489 0.102556 0.396386 0.102556 0.517894 0.00999999 0.499383 0.102556 0.445489 0.102556 0.234079 0.1301349 0.227393 0.1635659 0.175435 0.1635659 0.279351 0.1635659 0.227393 0.1635659 0.234079 0.1301349 0.331308 0.1635659 0.279351 0.1635659 0.287171 0.124463 0.396386 0.102556 0.383266 0.1635659 0.331308 0.1635659 0.445489 0.102556 0.435223 0.1635659 0.383266 0.1635659 0.487181 0.1635659 0.435223 0.1635659 0.445489 0.102556 0.241328 0.102556 0.227375 0.163655 0.175418 0.163655 0.279333 0.163655 0.227375 0.163655 0.241328 0.102556 0.33129 0.163655 0.279333 0.163655 0.289964 0.102556 0.3907 0.126395 0.383248 0.163655 0.33129 0.163655 0.442621 0.126578 0.435206 0.163655 0.383248 0.163655 0.487163 0.163655 0.435206 0.163655 0.442621 0.126578 0.417192 0.642528 0.412457 0.619443 0.458819 0.619443 0.511448 0.642381 0.465536 0.643919 0.458819 0.619443 0.511448 0.642381 0.505182 0.619443 0.551544 0.619443 0.551544 0.619443 0.597907 0.619443 0.602642 0.642528 0.425806 0.68619 0.417192 0.642528 0.467727 0.663983 0.518531 0.68619 0.472169 0.68619 0.467727 0.663983 0.554412 0.643808 0.564894 0.68619 0.518531 0.68619 0.611256 0.68619 0.564894 0.68619 0.554412 0.643808 0.474336 0.930396 0.520698 0.924894 0.531276 0.982187 0.567061 0.930396 0.577638 0.98111 0.531276 0.982187 0.624001 0.985614 0.577638 0.98111 0.567061 0.930396 0.659786 0.930396 0.670363 0.986216 0.624001 0.985614 0.465536 0.643919 0.471845 0.684572 0.425483 0.684572 0.518207 0.684572 0.471845 0.684572 0.465536 0.643919 0.560168 0.662561 0.56457 0.684572 0.518207 0.684572 0.610932 0.684572 0.56457 0.684572 0.560168 0.662561 0.530881 0.979097 0.484518 0.983842 0.474026 0.929901 0.530881 0.979097 0.520388 0.922535 0.566751 0.929901 0.623606 0.984496 0.577243 0.982917 0.566751 0.929901 0.623606 0.984496 0.613113 0.922535 0.659476 0.929901 0.170651 0.08143889 0.151488 0.0622766 0.170651 0.0622766 0.16654 0.01740676 0.188605 0.00999999 0.181276 0.02473568 0.617885 0.48994 0.601738 0.408093 0.65883 0.412179 0.544646 0.412179 0.601738 0.408093 0.617885 0.48994 0.732068 0.48994 0.674977 0.489959 0.65883 0.412179 0.560793 0.489959 0.503702 0.48994 0.487555 0.408093 0.643398 0.333762 0.65883 0.412179 0.601738 0.408093 0.601738 0.408093 0.544646 0.412179 0.529215 0.333762 0.715921 0.408093 0.65883 0.412179 0.643398 0.333762 0.529215 0.333762 0.544646 0.412179 0.487555 0.408093 + + + + + + + + + + + + + + +

6 0 0 13 0 1 12 0 2 14 1 3 7 1 4 8 1 5 9 2 6 14 2 7 8 2 8 10 3 9 15 3 10 9 3 11 10 4 12 17 4 13 16 4 14 6 5 15 17 5 16 11 5 17 13 6 18 18 6 19 12 6 20 20 7 21 13 7 22 14 7 23 21 8 24 14 8 25 15 8 26 15 9 27 22 9 28 21 9 29 16 10 30 23 10 31 22 10 32 12 11 33 23 11 34 17 11 35 25 12 36 18 12 37 19 12 38 26 13 39 19 13 40 20 13 41 20 14 42 27 14 43 26 14 44 22 15 45 27 15 46 21 15 47 23 16 48 28 16 49 22 16 50 18 17 51 29 17 52 23 17 53 25 18 54 30 18 55 24 18 56 26 19 57 31 19 58 25 19 59 33 20 60 26 20 61 27 20 62 34 21 63 27 21 64 28 21 65 28 22 66 35 22 67 34 22 68 29 23 69 30 23 70 35 23 71 31 24 72 36 24 73 30 24 74 32 25 75 37 25 76 31 25 77 39 26 78 32 26 79 33 26 80 40 27 81 33 27 82 34 27 83 41 28 84 34 28 85 35 28 86 30 29 87 41 29 88 35 29 89 37 30 90 42 30 91 36 30 92 38 31 93 43 31 94 37 31 95 38 32 96 45 32 97 44 32 98 39 33 99 46 33 100 45 33 101 47 34 102 40 34 103 41 34 104 42 35 105 41 35 106 36 35 107 49 36 108 54 36 109 48 36 110 49 37 111 56 37 112 55 37 113 50 38 114 57 38 115 56 38 116 51 39 117 58 39 118 57 39 119 59 40 120 52 40 121 53 40 122 48 41 123 59 41 124 53 41 125 61 42 126 54 42 127 55 42 128 62 43 129 55 43 130 56 43 131 62 44 132 57 44 133 63 44 134 63 45 135 58 45 136 64 45 137 65 46 138 58 46 139 59 46 140 60 47 141 59 47 142 54 47 143 67 48 144 60 48 145 61 48 146 62 49 147 67 49 148 61 49 149 63 50 150 68 50 151 62 50 152 63 51 153 70 51 154 69 51 155 65 52 156 70 52 157 64 52 158 65 53 159 66 53 160 71 53 161 66 54 162 73 54 163 72 54 164 68 55 165 73 55 166 67 55 167 75 56 168 68 56 169 69 56 170 75 57 171 70 57 172 76 57 173 71 58 174 76 58 175 70 58 176 71 59 177 72 59 178 77 59 179 81 60 180 78 60 181 79 60 182 81 61 183 82 61 184 80 61 185 83 62 186 84 62 187 82 62 188 79 63 189 84 63 190 85 63 191 91 64 192 94 64 193 90 64 194 91 65 195 96 65 196 95 65 197 97 66 198 92 66 199 93 66 200 90 67 201 97 67 202 93 67 203 99 68 204 94 68 205 95 68 206 96 69 207 99 69 208 95 69 209 97 70 210 100 70 211 96 70 212 98 71 213 97 71 214 94 71 215 105 72 216 102 72 217 103 72 218 107 73 219 104 73 220 105 73 221 107 74 222 108 74 223 106 74 224 109 75 225 102 75 226 108 75 227 111 76 228 114 76 229 110 76 230 111 77 231 116 77 232 115 77 233 113 78 234 116 78 235 112 78 236 113 79 237 114 79 238 117 79 239 115 80 240 118 80 241 114 80 242 116 81 243 119 81 244 115 81 245 116 82 246 121 82 247 120 82 248 117 83 249 118 83 250 121 83 251 123 84 252 118 84 253 119 84 254 123 85 255 120 85 256 124 85 257 124 86 258 121 86 259 125 86 260 125 87 261 118 87 262 122 87 263 122 88 264 127 88 265 126 88 266 124 89 267 127 89 268 123 89 269 124 90 270 129 90 271 128 90 272 129 91 273 122 91 274 126 91 275 126 92 276 131 92 277 130 92 278 128 93 279 131 93 280 127 93 281 133 94 282 128 94 283 129 94 284 126 95 285 133 95 286 129 95 287 135 96 288 138 96 289 134 96 290 136 97 291 139 97 292 135 97 293 137 98 294 140 98 295 136 98 296 137 99 297 138 99 298 141 99 299 139 100 300 142 100 301 138 100 302 140 101 303 143 101 304 139 101 305 140 102 306 145 102 307 144 102 308 141 103 309 142 103 310 145 103 311 143 104 312 146 104 313 142 104 314 148 105 315 143 105 316 144 105 317 144 106 318 149 106 319 148 106 320 142 107 321 149 107 322 145 107 323 151 108 324 146 108 325 147 108 326 151 109 327 148 109 328 152 109 329 152 110 330 149 110 331 153 110 332 150 111 333 149 111 334 146 111 335 150 112 336 155 112 337 154 112 338 152 113 339 155 113 340 151 113 341 152 114 342 157 114 343 156 114 344 150 115 345 157 115 346 153 115 347 159 116 348 160 116 349 158 116 350 163 117 351 160 117 352 161 117 353 165 118 354 162 118 355 163 118 356 165 119 357 158 119 358 164 119 359 160 120 360 166 120 361 158 120 362 160 121 363 168 121 364 167 121 365 164 122 366 168 122 367 162 122 368 164 123 369 166 123 370 169 123 371 167 124 372 170 124 373 166 124 374 168 125 375 171 125 376 167 125 377 168 126 378 173 126 379 172 126 380 170 127 381 169 127 382 166 127 383 175 128 384 170 128 385 171 128 386 172 129 387 175 129 388 171 129 389 172 130 390 177 130 391 176 130 392 177 131 393 170 131 394 174 131 395 175 132 396 178 132 397 174 132 398 175 133 399 180 133 400 179 133 401 177 134 402 180 134 403 176 134 404 177 135 405 178 135 406 181 135 407 179 136 408 182 136 409 178 136 410 184 137 411 179 137 412 180 137 413 181 138 414 184 138 415 180 138 416 181 139 417 182 139 418 185 139 419 0 140 420 261 140 421 260 140 422 1 141 423 262 141 424 261 141 425 3 142 426 262 142 427 2 142 428 3 143 429 265 143 430 264 143 431 5 144 432 265 144 433 4 144 434 0 145 435 266 145 436 5 145 437 267 146 438 6 146 439 260 146 440 8 147 441 267 147 442 268 147 443 9 148 444 268 148 445 264 148 446 265 149 447 9 149 448 264 149 449 266 150 450 10 150 451 265 150 452 6 151 453 266 151 454 260 151 455 261 152 456 48 152 457 260 152 458 50 153 459 261 153 460 262 153 461 51 154 462 262 154 463 264 154 464 268 155 465 51 155 466 264 155 467 267 156 468 52 156 469 268 156 470 48 157 471 267 157 472 260 157 473 269 158 474 104 158 475 270 158 476 271 159 477 104 159 478 106 159 479 271 160 480 108 160 481 263 160 482 108 161 483 269 161 484 263 161 485 110 162 486 272 162 487 111 162 488 112 163 489 272 163 490 271 163 491 263 164 492 112 164 493 271 164 494 110 165 495 263 165 496 269 165 497 130 166 498 276 166 499 279 166 500 132 167 501 276 167 502 131 167 503 280 168 504 132 168 505 133 168 506 130 169 507 280 169 508 133 169 509 270 170 510 134 170 511 269 170 512 136 171 513 270 171 514 271 171 515 272 172 516 136 172 517 271 172 518 134 173 519 272 173 520 269 173 521 274 174 522 154 174 523 155 174 524 274 175 525 156 175 526 275 175 527 278 176 528 156 176 529 157 176 530 278 177 531 154 177 532 273 177 533 276 178 534 186 178 535 279 178 536 277 179 537 280 179 538 279 179 539 277 180 540 279 180 541 186 180 542 274 181 543 187 181 544 273 181 545 275 182 546 278 182 547 273 182 548 275 183 549 273 183 550 187 183 551 92 184 552 89 184 553 93 184 554 87 185 555 92 185 556 91 185 557 90 186 558 89 186 559 86 186 560 91 187 561 86 187 562 87 187 563 84 188 564 88 188 565 82 188 566 88 189 567 80 189 568 82 189 569 86 190 570 84 190 571 78 190 572 80 191 573 86 191 574 78 191 575 6 312 936 7 312 937 13 312 938 14 313 939 13 313 940 7 313 941 9 314 942 15 314 943 14 314 944 10 315 945 16 315 946 15 315 947 10 316 948 11 316 949 17 316 950 6 317 951 12 317 952 17 317 953 13 318 954 19 318 955 18 318 956 20 319 957 19 319 958 13 319 959 21 320 960 20 320 961 14 320 962 15 321 963 16 321 964 22 321 965 16 322 966 17 322 967 23 322 968 12 323 969 18 323 970 23 323 971 25 324 972 24 324 973 18 324 974 26 325 975 25 325 976 19 325 977 20 326 978 21 326 979 27 326 980 22 327 981 28 327 982 27 327 983 23 328 984 29 328 985 28 328 986 18 329 987 24 329 988 29 329 989 25 330 990 31 330 991 30 330 992 26 331 993 32 331 994 31 331 995 33 332 996 32 332 997 26 332 998 34 333 999 33 333 1000 27 333 1001 28 334 1002 29 334 1003 35 334 1004 29 335 1005 24 335 1006 30 335 1007 31 336 1008 37 336 1009 36 336 1010 32 337 1011 38 337 1012 37 337 1013 39 338 1014 38 338 1015 32 338 1016 40 339 1017 39 339 1018 33 339 1019 41 340 1020 40 340 1021 34 340 1022 30 341 1023 36 341 1024 41 341 1025 37 342 1026 43 342 1027 42 342 1028 38 343 1029 44 343 1030 43 343 1031 38 344 1032 39 344 1033 45 344 1034 39 345 1035 40 345 1036 46 345 1037 47 346 1038 46 346 1039 40 346 1040 42 347 1041 47 347 1042 41 347 1043 49 348 1044 55 348 1045 54 348 1046 49 349 1047 50 349 1048 56 349 1049 50 350 1050 51 350 1051 57 350 1052 51 351 1053 52 351 1054 58 351 1055 59 352 1056 58 352 1057 52 352 1058 48 353 1059 54 353 1060 59 353 1061 61 354 1062 60 354 1063 54 354 1064 62 355 1065 61 355 1066 55 355 1067 62 356 1068 56 356 1069 57 356 1070 63 357 1071 57 357 1072 58 357 1073 65 358 1074 64 358 1075 58 358 1076 60 359 1077 65 359 1078 59 359 1079 67 360 1080 66 360 1081 60 360 1082 62 361 1083 68 361 1084 67 361 1085 63 362 1086 69 362 1087 68 362 1088 63 363 1089 64 363 1090 70 363 1091 65 364 1092 71 364 1093 70 364 1094 65 365 1095 60 365 1096 66 365 1097 66 366 1098 67 366 1099 73 366 1100 68 367 1101 74 367 1102 73 367 1103 75 368 1104 74 368 1105 68 368 1106 75 369 1107 69 369 1108 70 369 1109 71 370 1110 77 370 1111 76 370 1112 71 371 1113 66 371 1114 72 371 1115 81 372 1116 80 372 1117 78 372 1118 81 373 1119 83 373 1120 82 373 1121 83 374 1122 85 374 1123 84 374 1124 79 375 1125 78 375 1126 84 375 1127 91 376 1128 95 376 1129 94 376 1130 91 377 1131 92 377 1132 96 377 1133 97 378 1134 96 378 1135 92 378 1136 90 379 1137 94 379 1138 97 379 1139 99 380 1140 98 380 1141 94 380 1142 96 381 1143 100 381 1144 99 381 1145 97 382 1146 101 382 1147 100 382 1148 98 383 1149 101 383 1150 97 383 1151 105 384 1152 104 384 1153 102 384 1154 107 385 1155 106 385 1156 104 385 1157 107 386 1158 109 386 1159 108 386 1160 109 387 1161 103 387 1162 102 387 1163 111 388 1164 115 388 1165 114 388 1166 111 389 1167 112 389 1168 116 389 1169 113 390 1170 117 390 1171 116 390 1172 113 391 1173 110 391 1174 114 391 1175 115 392 1176 119 392 1177 118 392 1178 116 393 1179 120 393 1180 119 393 1181 116 394 1182 117 394 1183 121 394 1184 117 395 1185 114 395 1186 118 395 1187 123 396 1188 122 396 1189 118 396 1190 123 397 1191 119 397 1192 120 397 1193 124 398 1194 120 398 1195 121 398 1196 125 399 1197 121 399 1198 118 399 1199 122 400 1200 123 400 1201 127 400 1202 124 401 1203 128 401 1204 127 401 1205 124 402 1206 125 402 1207 129 402 1208 129 403 1209 125 403 1210 122 403 1211 126 404 1212 127 404 1213 131 404 1214 128 405 1215 132 405 1216 131 405 1217 133 406 1218 132 406 1219 128 406 1220 126 407 1221 130 407 1222 133 407 1223 135 408 1224 139 408 1225 138 408 1226 136 409 1227 140 409 1228 139 409 1229 137 410 1230 141 410 1231 140 410 1232 137 411 1233 134 411 1234 138 411 1235 139 412 1236 143 412 1237 142 412 1238 140 413 1239 144 413 1240 143 413 1241 140 414 1242 141 414 1243 145 414 1244 141 415 1245 138 415 1246 142 415 1247 143 416 1248 147 416 1249 146 416 1250 148 417 1251 147 417 1252 143 417 1253 144 418 1254 145 418 1255 149 418 1256 142 419 1257 146 419 1258 149 419 1259 151 420 1260 150 420 1261 146 420 1262 151 421 1263 147 421 1264 148 421 1265 152 422 1266 148 422 1267 149 422 1268 150 423 1269 153 423 1270 149 423 1271 150 424 1272 151 424 1273 155 424 1274 152 425 1275 156 425 1276 155 425 1277 152 426 1278 153 426 1279 157 426 1280 150 427 1281 154 427 1282 157 427 1283 159 428 1284 161 428 1285 160 428 1286 163 429 1287 162 429 1288 160 429 1289 165 430 1290 164 430 1291 162 430 1292 165 431 1293 159 431 1294 158 431 1295 160 432 1296 167 432 1297 166 432 1298 160 433 1299 162 433 1300 168 433 1301 164 434 1302 169 434 1303 168 434 1304 164 435 1305 158 435 1306 166 435 1307 167 436 1308 171 436 1309 170 436 1310 168 437 1311 172 437 1312 171 437 1313 168 438 1314 169 438 1315 173 438 1316 170 439 1317 173 439 1318 169 439 1319 175 440 1320 174 440 1321 170 440 1322 172 441 1323 176 441 1324 175 441 1325 172 442 1326 173 442 1327 177 442 1328 177 443 1329 173 443 1330 170 443 1331 175 444 1332 179 444 1333 178 444 1334 175 445 1335 176 445 1336 180 445 1337 177 446 1338 181 446 1339 180 446 1340 177 447 1341 174 447 1342 178 447 1343 179 448 1344 183 448 1345 182 448 1346 184 449 1347 183 449 1348 179 449 1349 181 450 1350 185 450 1351 184 450 1352 181 451 1353 178 451 1354 182 451 1355 0 452 1356 1 452 1357 261 452 1358 1 453 1359 2 453 1360 262 453 1361 3 454 1362 264 454 1363 262 454 1364 3 455 1365 4 455 1366 265 455 1367 5 456 1368 266 456 1369 265 456 1370 0 457 1371 260 457 1372 266 457 1373 267 458 1374 7 458 1375 6 458 1376 8 459 1377 7 459 1378 267 459 1379 9 460 1380 8 460 1381 268 460 1382 265 461 1383 10 461 1384 9 461 1385 266 462 1386 11 462 1387 10 462 1388 6 463 1389 11 463 1390 266 463 1391 261 464 1392 49 464 1393 48 464 1394 50 465 1395 49 465 1396 261 465 1397 51 466 1398 50 466 1399 262 466 1400 268 467 1401 52 467 1402 51 467 1403 267 468 1404 53 468 1405 52 468 1406 48 469 1407 53 469 1408 267 469 1409 269 470 1410 102 470 1411 104 470 1412 271 471 1413 270 471 1414 104 471 1415 271 472 1416 106 472 1417 108 472 1418 108 473 1419 102 473 1420 269 473 1421 110 474 1422 269 474 1423 272 474 1424 112 475 1425 111 475 1426 272 475 1427 263 476 1428 113 476 1429 112 476 1430 110 477 1431 113 477 1432 263 477 1433 130 478 1434 131 478 1435 276 478 1436 132 479 1437 277 479 1438 276 479 1439 280 480 1440 277 480 1441 132 480 1442 130 481 1443 279 481 1444 280 481 1445 270 482 1446 135 482 1447 134 482 1448 136 483 1449 135 483 1450 270 483 1451 272 484 1452 137 484 1453 136 484 1454 134 485 1455 137 485 1456 272 485 1457 274 486 1458 273 486 1459 154 486 1460 274 487 1461 155 487 1462 156 487 1463 278 488 1464 275 488 1465 156 488 1466 278 489 1467 157 489 1468 154 489 1469 276 490 1470 277 490 1471 186 490 1472 274 491 1473 275 491 1474 187 491 1475 92 492 1476 88 492 1477 89 492 1478 87 493 1479 88 493 1480 92 493 1481 90 494 1482 93 494 1483 89 494 1484 91 495 1485 90 495 1486 86 495 1487 84 496 1488 89 496 1489 88 496 1490 88 497 1491 87 497 1492 80 497 1493 86 498 1494 89 498 1495 84 498 1496 80 499 1497 87 499 1498 86 499 1499

+
+ + + + +

188 192 576 189 192 577 190 192 578 191 193 579 188 193 580 190 193 581 192 194 582 191 194 583 190 194 584 193 195 585 192 195 586 190 195 587 189 196 588 193 196 589 190 196 590 194 197 591 195 197 592 196 197 593 195 198 594 197 198 595 196 198 596 197 199 597 198 199 598 196 199 599 198 200 600 199 200 601 196 200 602 199 201 603 194 201 604 196 201 605 188 202 606 194 202 607 189 202 608 191 203 609 195 203 610 188 203 611 192 204 612 197 204 613 191 204 614 193 205 615 198 205 616 192 205 617 189 206 618 199 206 619 193 206 620 194 207 621 188 207 622 195 207 623 195 208 624 191 208 625 197 208 626 197 209 627 192 209 628 198 209 629 198 210 630 193 210 631 199 210 632 199 211 633 189 211 634 194 211 635 200 212 636 201 212 637 202 212 638 203 213 639 201 213 640 200 213 641 204 214 642 201 214 643 203 214 644 205 215 645 201 215 646 204 215 647 202 216 648 201 216 649 205 216 650 206 217 651 207 217 652 208 217 653 208 218 654 207 218 655 209 218 656 209 219 657 207 219 658 210 219 659 210 220 660 207 220 661 211 220 662 211 221 663 207 221 664 206 221 665 200 222 666 202 222 667 206 222 668 203 223 669 200 223 670 208 223 671 204 224 672 203 224 673 209 224 674 205 225 675 204 225 676 210 225 677 202 226 678 205 226 679 211 226 680 206 227 681 208 227 682 200 227 683 208 228 684 209 228 685 203 228 686 209 229 687 210 229 688 204 229 689 210 230 690 211 230 691 205 230 692 211 231 693 206 231 694 202 231 695 212 232 696 213 232 697 214 232 698 215 233 699 212 233 700 214 233 701 216 234 702 215 234 703 214 234 704 217 235 705 216 235 706 214 235 707 213 236 708 217 236 709 214 236 710 218 237 711 219 237 712 220 237 713 219 238 714 221 238 715 220 238 716 221 239 717 222 239 718 220 239 719 222 240 720 223 240 721 220 240 722 223 241 723 218 241 724 220 241 725 212 242 726 218 242 727 213 242 728 215 243 729 219 243 730 212 243 731 216 244 732 221 244 733 215 244 734 217 245 735 222 245 736 216 245 737 213 246 738 223 246 739 217 246 740 218 247 741 212 247 742 219 247 743 219 248 744 215 248 745 221 248 746 221 249 747 216 249 748 222 249 749 222 250 750 217 250 751 223 250 752 223 251 753 213 251 754 218 251 755 224 252 756 225 252 757 226 252 758 227 253 759 224 253 760 226 253 761 228 254 762 227 254 763 226 254 764 229 255 765 228 255 766 226 255 767 225 256 768 229 256 769 226 256 770 230 257 771 231 257 772 232 257 773 231 258 774 233 258 775 232 258 776 233 259 777 234 259 778 232 259 779 234 260 780 235 260 781 232 260 782 235 261 783 230 261 784 232 261 785 224 262 786 230 262 787 225 262 788 227 263 789 231 263 790 224 263 791 228 264 792 233 264 793 227 264 794 229 265 795 234 265 796 228 265 797 225 266 798 235 266 799 229 266 800 230 267 801 224 267 802 231 267 803 231 268 804 227 268 805 233 268 806 233 269 807 228 269 808 234 269 809 234 270 810 229 270 811 235 270 812 235 271 813 225 271 814 230 271 815 236 272 816 237 272 817 238 272 818 239 273 819 237 273 820 236 273 821 240 274 822 237 274 823 239 274 824 241 275 825 237 275 826 240 275 827 238 276 828 237 276 829 241 276 830 242 277 831 243 277 832 244 277 833 244 278 834 243 278 835 245 278 836 245 279 837 243 279 838 246 279 839 246 280 840 243 280 841 247 280 842 247 281 843 243 281 844 242 281 845 236 282 846 238 282 847 242 282 848 239 283 849 236 283 850 244 283 851 240 284 852 239 284 853 245 284 854 241 285 855 240 285 856 246 285 857 238 286 858 241 286 859 247 286 860 242 287 861 244 287 862 236 287 863 244 288 864 245 288 865 239 288 866 245 289 867 246 289 868 240 289 869 246 290 870 247 290 871 241 290 872 247 291 873 242 291 874 238 291 875 248 292 876 249 292 877 250 292 878 251 293 879 248 293 880 250 293 881 252 294 882 251 294 883 250 294 884 253 295 885 252 295 886 250 295 887 249 296 888 253 296 889 250 296 890 254 297 891 255 297 892 256 297 893 255 298 894 257 298 895 256 298 896 257 299 897 258 299 898 256 299 899 258 300 900 259 300 901 256 300 902 259 301 903 254 301 904 256 301 905 248 302 906 254 302 907 249 302 908 251 303 909 255 303 910 248 303 911 252 304 912 257 304 913 251 304 914 253 305 915 258 305 916 252 305 917 249 306 918 259 306 919 253 306 920 254 307 921 248 307 922 255 307 923 255 308 924 251 308 925 257 308 926 257 309 927 252 309 928 258 309 929 258 310 930 253 310 931 259 310 932 259 311 933 249 311 934 254 311 935

+
+
+
+
+ + + + 0.2 0 0 0 0 -3.25841e-8 -0.2 0 0 0.2 -3.25841e-8 0 0 0 0 1 + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/Samples/05 AISamples/Common/Resources/Tree/tree1.json b/Samples/05 AISamples/Common/Resources/Tree/tree1.json new file mode 100644 index 000000000..157862640 --- /dev/null +++ b/Samples/05 AISamples/Common/Resources/Tree/tree1.json @@ -0,0 +1,3 @@ +{ + "modelFilename": "tree1.dae" +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/BuildingFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/BuildingFile.cs new file mode 100644 index 000000000..563098b2f --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/BuildingFile.cs @@ -0,0 +1,9 @@ + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct BuildingFile + { + public PolygonFile Polygon { get; set; } + public float Height { get; set; } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/CrossingFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/CrossingFile.cs new file mode 100644 index 000000000..131d698f5 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/CrossingFile.cs @@ -0,0 +1,29 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct CrossingFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Crossing)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Crossing( + Vector2File.FromVector2File(Position), + Vector2File.FromVector2File(Direction), + Width, + Height); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/EnvelopeFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/EnvelopeFile.cs new file mode 100644 index 000000000..917818146 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/EnvelopeFile.cs @@ -0,0 +1,11 @@ + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct EnvelopeFile + { + public Segment2File Skeleton { get; set; } + public float Width { get; set; } + public int Roundness { get; set; } + public PolygonFile Polygon { get; set; } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/GraphFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/GraphFile.cs index 86ad39e74..49ab0ad0f 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/GraphFile.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/GraphFile.cs @@ -1,30 +1,9 @@ -using System.Linq; - + namespace AISamples.SceneCWRVirtualWorld.Content { struct GraphFile { public Vector2File[] Points { get; set; } public Segment2File[] Segments { get; set; } - - public static GraphFile FromGraph(Graph graph) - { - var points = graph.GetPoints().Select(Vector2File.FromVector2).ToArray(); - var segments = graph.GetSegments().Select(Segment2File.FromSegment).ToArray(); - - return new() - { - Points = points, - Segments = segments, - }; - } - - public static Graph FromGraphFile(GraphFile graph) - { - var points = graph.Points.Select(Vector2File.FromVector2File).ToArray(); - var segments = graph.Segments.Select(Segment2File.FromSegmentFile).ToArray(); - - return new(points, segments); - } } } diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/IMarkingFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/IMarkingFile.cs new file mode 100644 index 000000000..3e1ac3d1e --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/IMarkingFile.cs @@ -0,0 +1,16 @@ +using AISamples.SceneCWRVirtualWorld.Markings; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + interface IMarkingFile + { + string Type { get; set; } + Vector2File Position { get; set; } + Vector2File Direction { get; set; } + float Width { get; set; } + float Height { get; set; } + bool Is3D { get; set; } + + Marking FromMarkingFile(); + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/LightFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/LightFile.cs new file mode 100644 index 000000000..63425cfb4 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/LightFile.cs @@ -0,0 +1,35 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct LightFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + public LightState LightState { get; set; } + public float RedDuration { get; set; } + public float YellowDuration { get; set; } + public float GreenDuration { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Light)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Light(Vector2File.FromVector2File(Position), Vector2File.FromVector2File(Direction), Width, Height) + { + LightState = LightState, + RedDuration = RedDuration, + YellowDuration = YellowDuration, + GreenDuration = GreenDuration + }; + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/ParkingFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/ParkingFile.cs new file mode 100644 index 000000000..d535a51b9 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/ParkingFile.cs @@ -0,0 +1,29 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct ParkingFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Parking)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Parking( + Vector2File.FromVector2File(Position), + Vector2File.FromVector2File(Direction), + Width, + Height); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/PolygonFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/PolygonFile.cs new file mode 100644 index 000000000..96b8d0f88 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/PolygonFile.cs @@ -0,0 +1,9 @@ + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct PolygonFile + { + public Vector2File[] Vertices { get; set; } + public Segment2File[] Segments { get; set; } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Segment2File.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Segment2File.cs index ab5902cc8..5e0fbdba1 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Segment2File.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Segment2File.cs @@ -1,25 +1,9 @@  -using AISamples.SceneCWRVirtualWorld.Primitives; - namespace AISamples.SceneCWRVirtualWorld.Content { struct Segment2File { public Vector2File P1 { get; set; } public Vector2File P2 { get; set; } - - public static Segment2File FromSegment(Segment2 segment) - { - return new() - { - P1 = Vector2File.FromVector2(segment.P1), - P2 = Vector2File.FromVector2(segment.P2), - }; - } - - public static Segment2 FromSegmentFile(Segment2File segment) - { - return new(Vector2File.FromVector2File(segment.P1), Vector2File.FromVector2File(segment.P2)); - } } } diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/StartFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/StartFile.cs new file mode 100644 index 000000000..8b4412a3a --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/StartFile.cs @@ -0,0 +1,29 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct StartFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Start)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Start( + Vector2File.FromVector2File(Position), + Vector2File.FromVector2File(Direction), + Width, + Height); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/StopFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/StopFile.cs new file mode 100644 index 000000000..d7b07b2f1 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/StopFile.cs @@ -0,0 +1,29 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct StopFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Stop)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Stop( + Vector2File.FromVector2File(Position), + Vector2File.FromVector2File(Direction), + Width, + Height); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/TargetFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/TargetFile.cs new file mode 100644 index 000000000..b9b0e257b --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/TargetFile.cs @@ -0,0 +1,29 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct TargetFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Target)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Target( + Vector2File.FromVector2File(Position), + Vector2File.FromVector2File(Direction), + Width, + Height); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/TreeFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/TreeFile.cs new file mode 100644 index 000000000..5dfb02d7a --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/TreeFile.cs @@ -0,0 +1,10 @@ + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct TreeFile + { + public Vector3File Position { get; set; } + public float Radius { get; set; } + public float Height { get; set; } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Vector3File.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Vector3File.cs new file mode 100644 index 000000000..c37d0de47 --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/Vector3File.cs @@ -0,0 +1,26 @@ +using SharpDX; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct Vector3File + { + public float X { get; set; } + public float Y { get; set; } + public float Z { get; set; } + + public static Vector3File FromVector3(Vector3 vector) + { + return new() + { + X = vector.X, + Y = vector.Y, + Z = vector.Z + }; + } + + public static Vector3 FromVector3File(Vector3File vector) + { + return new(vector.X, vector.Y, vector.Z); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/WorldFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/WorldFile.cs new file mode 100644 index 000000000..046bbfc5f --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/WorldFile.cs @@ -0,0 +1,18 @@ +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct WorldFile + { + public GraphFile Graph { get; set; } + public float Height { get; set; } + public Guid Version { get; set; } + public EnvelopeFile[] Envelopes { get; set; } + public EnvelopeFile[] RoadEnvelopes { get; set; } + public Segment2File[] RoadBorders { get; set; } + public BuildingFile[] Buildings { get; set; } + public TreeFile[] Trees { get; set; } + public Segment2File[] LaneGuides { get; set; } + public IMarkingFile[] Markings { get; set; } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Content/YieldFile.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/YieldFile.cs new file mode 100644 index 000000000..3126c0fbd --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Content/YieldFile.cs @@ -0,0 +1,29 @@ +using AISamples.SceneCWRVirtualWorld.Markings; +using System; + +namespace AISamples.SceneCWRVirtualWorld.Content +{ + struct YieldFile : IMarkingFile + { + public string Type { get; set; } + public Vector2File Position { get; set; } + public Vector2File Direction { get; set; } + public float Width { get; set; } + public float Height { get; set; } + public bool Is3D { get; set; } + + public readonly Marking FromMarkingFile() + { + if (Type != nameof(Yield)) + { + throw new ArgumentException("Invalid marking file type"); + } + + return new Yield( + Vector2File.FromVector2File(Position), + Vector2File.FromVector2File(Direction), + Width, + Height); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Editors/GraphEditor.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Editors/GraphEditor.cs index 062f5ac5f..990e4f183 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Editors/GraphEditor.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Editors/GraphEditor.cs @@ -12,11 +12,12 @@ class GraphEditor(World world, float height) : IEditor private static readonly Color4 graphColor = new(0f, 0f, 0f, 0.5f); private static readonly Color4 highlightColor = new(1f, 1f, 0f, 0.33f); private const float editorPointRadius = 10f; + private const float hLayer = 0.5f; private const float hDelta = 0.1f; private GeometryColorDrawer graphDrawer = null; - private readonly Graph graph = world.Graph; + private readonly World world = world; private readonly float height = height; private readonly float pointRadius = editorPointRadius; private readonly float lineThickness = editorPointRadius * 0.1f; @@ -120,13 +121,13 @@ private void AddPoint(Vector2 point) { AddPointAndSegment(hovered.Value); - draggingPointIndex = graph.GetPointIndex(hovered.Value); + draggingPointIndex = world.Graph.GetPointIndex(hovered.Value); dragging = true; return; } - graph.AddPoint(point); + world.Graph.AddPoint(point); AddPointAndSegment(point); hovered = point; } @@ -134,7 +135,7 @@ private void AddPointAndSegment(Vector2 point) { if (selected.HasValue) { - graph.TryAddSegment(new(selected.Value, point)); + world.Graph.TryAddSegment(new(selected.Value, point)); } selected = point; } @@ -152,7 +153,7 @@ private void RemovePoint() return; } - graph.RemovePoint(hovered.Value); + world.Graph.RemovePoint(hovered.Value); hovered = null; } @@ -162,7 +163,7 @@ private void UpdateHovered(Vector2 point, float threshold, float dragTime) if (dragging && dragTime > 0.2f) { - graph.UpdatePoint(draggingPointIndex, point); + world.Graph.UpdatePoint(draggingPointIndex, point); hovered = point; selected = point; @@ -171,7 +172,7 @@ private void UpdateHovered(Vector2 point, float threshold, float dragTime) return; } - hovered = Utils.GetNearestPoint(point, graph.GetPoints(), threshold); + hovered = Utils.GetNearestPoint(point, world.Graph.GetPoints(), threshold); if (hovered.HasValue && selected != hovered) { drawHovered = true; @@ -187,27 +188,27 @@ public void Draw() { graphDrawer.Clear(); - foreach (var point in graph.GetPoints()) + foreach (var point in world.Graph.GetPoints()) { - DrawPoint(point, height, pointRadius, graphColor); + DrawPoint(point, height + hLayer, pointRadius, graphColor); } - foreach (var segment in graph.GetSegments()) + foreach (var segment in world.Graph.GetSegments()) { - DrawSegment(segment, height, lineThickness, graphColor); + DrawSegment(segment, height + hLayer, lineThickness, graphColor); } if (drawHovered && hovered.HasValue) { - DrawPoint(hovered.Value, height + 1, pointRadius * 0.4f, highlightColor); + DrawPoint(hovered.Value, height + hLayer + 1, pointRadius * 0.4f, highlightColor); } drawHovered = false; if (selected.HasValue) { - DrawPoint(selected.Value, height + 1, pointRadius * 0.6f, highlightColor); + DrawPoint(selected.Value, height + hLayer + 1, pointRadius * 0.6f, highlightColor); - DrawSegment(new Segment2(selected.Value, hovered ?? mouse), height, lineThickness, graphColor); + DrawSegment(new Segment2(selected.Value, hovered ?? mouse), height + hLayer, lineThickness, graphColor); } } private void DrawPoint(Vector2 point, float height, float strokeSize, Color4 tColor) diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Graph.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Graph.cs index 3c14a2b78..c54ed79d3 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Graph.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Graph.cs @@ -1,6 +1,5 @@ using AISamples.SceneCWRVirtualWorld.Content; using AISamples.SceneCWRVirtualWorld.Primitives; -using Engine; using SharpDX; using System; using System.Collections.Generic; @@ -21,6 +20,25 @@ public Graph(Vector2[] points, Segment2[] segments) this.segments.AddRange(segments); } + public static GraphFile FromGraph(Graph graph) + { + var points = graph.GetPoints().Select(Vector2File.FromVector2).ToArray(); + var segments = graph.GetSegments().Select(Segment2.FromSegment).ToArray(); + + return new() + { + Points = points, + Segments = segments, + }; + } + public static Graph FromGraphFile(GraphFile graph) + { + var points = graph.Points.Select(Vector2File.FromVector2File).ToArray(); + var segments = graph.Segments.Select(Segment2.FromSegmentFile).ToArray(); + + return new(points, segments); + } + public bool TryAddPoint(Vector2 point) { if (ContainsPoint(point)) @@ -140,23 +158,5 @@ public void UpdatePoint(int index, Vector2 point) Version = Guid.NewGuid(); } - - public void LoadFromFile(string fileName) - { - var graphFile = SerializationHelper.DeserializeJsonFromFile(fileName); - var newGraph = GraphFile.FromGraphFile(graphFile); - - Clear(); - - points.AddRange(newGraph.points); - segments.AddRange(newGraph.segments); - - Version = Guid.NewGuid(); - } - public void SaveToFile(string fileName) - { - var graphFile = GraphFile.FromGraph(this); - SerializationHelper.SerializeJsonToFile(graphFile, fileName); - } } } diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Items/Building.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Items/Building.cs new file mode 100644 index 000000000..758557fbc --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Items/Building.cs @@ -0,0 +1,65 @@ +using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; +using AISamples.SceneCWRVirtualWorld.Primitives; +using Engine; +using Engine.BuiltIn.Primitives; +using Engine.Common; +using SharpDX; +using System.Collections.Generic; +using System.Linq; + +namespace AISamples.SceneCWRVirtualWorld.Items +{ + class Building(Polygon polygon, float height) + { + public Polygon Polygon { get; set; } = polygon; + public float Height { get; set; } = height; + + public static BuildingFile FromBuilding(Building building) + { + return new() + { + Polygon = Polygon.FromPolygon(building.Polygon), + Height = building.Height, + }; + } + public static Building FromBuildingFile(BuildingFile building) + { + var polygon = Polygon.FromPolygonFile(building.Polygon); + var height = building.Height; + + return new(polygon, height); + } + + public IEnumerable CreateBuilding(float baseHeight) + { + Vector2[] baseVertices = Polygon.GetVertices(); + Vector3[] points = Polygon.Extrude(baseHeight, Height); + + var uvW = Constants.Gray; + var uvC = Constants.Red; + + // Create the walls + int vertexCount = baseVertices.Length; + for (int i = 0; i < vertexCount; i++) + { + yield return new VertexPositionTexture() { Position = points[i], Texture = uvW }; + yield return new VertexPositionTexture() { Position = points[(i + 1) % vertexCount], Texture = uvW }; + yield return new VertexPositionTexture() { Position = points[i + vertexCount], Texture = uvW }; + + yield return new VertexPositionTexture() { Position = points[(i + 1) % vertexCount], Texture = uvW }; + yield return new VertexPositionTexture() { Position = points[(i + 1) % vertexCount + vertexCount], Texture = uvW }; + yield return new VertexPositionTexture() { Position = points[i + vertexCount], Texture = uvW }; + } + + var ceiling = GeometryUtil.CreatePolygon(Topology.TriangleList, points.Skip(vertexCount), false); + for (int i = 0; i < ceiling.Indices.Count(); i++) + { + int index = (int)ceiling.Indices.ElementAt(i); + var p = ceiling.Vertices.ElementAt(index); + + yield return new VertexPositionTexture() { Position = p, Texture = uvC }; + } + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Items/Tree.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Items/Tree.cs new file mode 100644 index 000000000..4e4419f9a --- /dev/null +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Items/Tree.cs @@ -0,0 +1,36 @@ +using AISamples.SceneCWRVirtualWorld.Content; +using Engine; +using SharpDX; + +namespace AISamples.SceneCWRVirtualWorld.Items +{ + class Tree(Vector3 position, float radius, float height) + { + public Vector3 Position { get; set; } = position; + public float Radius { get; set; } = radius; + public float Height { get; set; } = height; + + public static TreeFile FromTree(Tree tree) + { + return new() + { + Position = Vector3File.FromVector3(tree.Position), + Radius = tree.Radius, + Height = tree.Height, + }; + } + public static Tree FromTreeFile(TreeFile tree) + { + var position = Vector3File.FromVector3File(tree.Position); + var radius = tree.Radius; + var height = tree.Height; + + return new(position, radius, height); + } + + public float DistanceToPoint(Vector2 point) + { + return Vector2.Distance(Position.XZ(), point); + } + } +} diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Crossing.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Crossing.cs index 046776ed2..841b1c6e0 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Crossing.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Crossing.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; using Engine.BuiltIn.Primitives; @@ -8,6 +9,19 @@ namespace AISamples.SceneCWRVirtualWorld.Markings { class Crossing(Vector2 position, Vector2 direction, float width, float height) : Marking(position, direction, width, height) { + public override IMarkingFile FromMarking() + { + return new CrossingFile + { + Type = nameof(Crossing), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D + }; + } + public Segment2[] GetBorders() { var polySegments = GetPolygon().GetSegments(); diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Light.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Light.cs index 3574c6c94..d424e9323 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Light.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Light.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; using Engine.BuiltIn.Primitives; @@ -16,6 +17,23 @@ class Light(Vector2 position, Vector2 direction, float width, float height) : Ma public float YellowDuration { get; set; } = 2; public float GreenDuration { get; set; } = 38; + public override IMarkingFile FromMarking() + { + return new LightFile + { + Type = nameof(Light), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D, + LightState = LightState, + RedDuration = RedDuration, + YellowDuration = YellowDuration, + GreenDuration = GreenDuration, + }; + } + public Segment2 GetBorder() { return GetPolygon().GetSegments()[2]; diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Marking.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Marking.cs index af4171d8c..e745a4873 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Marking.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Marking.cs @@ -1,4 +1,5 @@ -using AISamples.SceneCWRVirtualWorld.Primitives; +using AISamples.SceneCWRVirtualWorld.Content; +using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; using Engine.BuiltIn.Primitives; using Engine.Common; @@ -36,6 +37,8 @@ protected Marking(Vector2 position, Vector2 direction, float width, float height polygon = new Envelope(support, width, 0).GetPolygon(); } + public abstract IMarkingFile FromMarking(); + public Segment2 GetSupport() { return support; diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Parking.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Parking.cs index 68f900312..796c90b4f 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Parking.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Parking.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; using Engine.BuiltIn.Primitives; @@ -8,6 +9,19 @@ namespace AISamples.SceneCWRVirtualWorld.Markings { class Parking(Vector2 position, Vector2 direction, float width, float height) : Marking(position, direction, width, height) { + public override IMarkingFile FromMarking() + { + return new ParkingFile + { + Type = nameof(Parking), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D + }; + } + public Segment2[] GetBorders() { var polySegments = GetPolygon().GetSegments(); diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Start.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Start.cs index 62ea59455..223cbfe89 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Start.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Start.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using Engine; using Engine.BuiltIn.Primitives; using SharpDX; @@ -7,6 +8,19 @@ namespace AISamples.SceneCWRVirtualWorld.Markings { class Start(Vector2 position, Vector2 direction, float width, float height) : Marking(position, direction, width, height) { + public override IMarkingFile FromMarking() + { + return new StartFile + { + Type = nameof(Start), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D + }; + } + protected override VertexPositionTexture[] CreateMarking(float height) { var support = GetSupport(); diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Stop.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Stop.cs index 9e2d65322..5d8047bba 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Stop.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Stop.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; using Engine.BuiltIn.Primitives; @@ -8,6 +9,19 @@ namespace AISamples.SceneCWRVirtualWorld.Markings { class Stop(Vector2 position, Vector2 direction, float width, float height) : Marking(position, direction, width, height) { + public override IMarkingFile FromMarking() + { + return new StopFile + { + Type = nameof(Stop), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D + }; + } + public Segment2 GetBorder() { return GetPolygon().GetSegments()[2]; diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Target.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Target.cs index 90a2eae7a..5c22818f3 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Target.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Target.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using Engine; using Engine.BuiltIn.Primitives; using SharpDX; @@ -7,6 +8,19 @@ namespace AISamples.SceneCWRVirtualWorld.Markings { class Target(Vector2 position, Vector2 direction, float width, float height) : Marking(position, direction, width, height) { + public override IMarkingFile FromMarking() + { + return new TargetFile + { + Type = nameof(Target), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D + }; + } + protected override VertexPositionTexture[] CreateMarking(float height) { var support = GetSupport(); diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Yield.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Yield.cs index 60bdc88f1..15c9a60e7 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Yield.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Markings/Yield.cs @@ -1,4 +1,5 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; using Engine.BuiltIn.Primitives; @@ -8,6 +9,19 @@ namespace AISamples.SceneCWRVirtualWorld.Markings { class Yield(Vector2 position, Vector2 direction, float width, float height) : Marking(position, direction, width, height) { + public override IMarkingFile FromMarking() + { + return new YieldFile + { + Type = nameof(Yield), + Position = Vector2File.FromVector2(Position), + Direction = Vector2File.FromVector2(Direction), + Width = Width, + Height = Height, + Is3D = Is3D + }; + } + public Segment2 GetBorder() { return GetPolygon().GetSegments()[2]; diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Envelope.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Envelope.cs index 26908ab73..6fe2f62ba 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Envelope.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Envelope.cs @@ -1,4 +1,5 @@ -using SharpDX; +using AISamples.SceneCWRVirtualWorld.Content; +using SharpDX; using System; using System.Collections.Generic; @@ -19,6 +20,33 @@ public Envelope(Segment2 skeleton, float width, int roundness) polygon = GeneratePolygon(); } + private Envelope(Segment2 skeleton, float width, int roundness, Polygon polygon) + { + this.skeleton = skeleton; + this.width = width; + this.roundness = roundness; + this.polygon = polygon; + } + + public static EnvelopeFile FromEnvelope(Envelope envelope) + { + return new() + { + Skeleton = Segment2.FromSegment(envelope.skeleton), + Width = envelope.width, + Roundness = envelope.roundness, + Polygon = Polygon.FromPolygon(envelope.polygon) + }; + } + public static Envelope FromEnvelopeFile(EnvelopeFile envelope) + { + var skeleton = Segment2.FromSegmentFile(envelope.Skeleton); + var width = envelope.Width; + var roundness = envelope.Roundness; + var polygon = Polygon.FromPolygonFile(envelope.Polygon); + + return new(skeleton, width, roundness, polygon); + } private Polygon GeneratePolygon() { @@ -56,7 +84,7 @@ public Polygon GetPolygon() } public Vector2[] GetPolygonVertices() { - return polygon.Vertices; + return polygon.GetVertices(); } } } diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Polygon.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Polygon.cs index bfc0e666c..5142f9934 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Polygon.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Polygon.cs @@ -1,25 +1,51 @@ -using SharpDX; +using AISamples.SceneCWRVirtualWorld.Content; +using SharpDX; using System; using System.Collections.Generic; +using System.Linq; namespace AISamples.SceneCWRVirtualWorld.Primitives { class Polygon { + private readonly Vector2[] vertices = []; private readonly List segments = []; - public Vector2[] Vertices { get; private set; } - public Polygon(Vector2[] vertices) { - Vertices = vertices; + this.vertices = vertices; for (int i = 0; i < vertices.Length; i++) { segments.Add(new Segment2(vertices[i], vertices[(i + 1) % vertices.Length])); } } + private Polygon(Vector2[] vertices, List segments) + { + this.vertices = vertices; + this.segments = segments; + } + public static PolygonFile FromPolygon(Polygon polygon) + { + return new() + { + Vertices = polygon.vertices.Select(Vector2File.FromVector2).ToArray(), + Segments = polygon.segments.Select(Segment2.FromSegment).ToArray(), + }; + } + public static Polygon FromPolygonFile(PolygonFile polygon) + { + var vertices = polygon.Vertices.Select(Vector2File.FromVector2File).ToArray(); + var segments = polygon.Segments.Select(Segment2.FromSegmentFile).ToList(); + + return new(vertices, segments); + } + + public Vector2[] GetVertices() + { + return [.. vertices]; + } public Segment2[] GetSegments() { return [.. segments]; @@ -144,9 +170,9 @@ public float DistanceToPoint(Vector2 point) public float DistanceToPolygon(Polygon poly) { float minDistance = float.MaxValue; - for (int i = 0; i < Vertices.Length; i++) + for (int i = 0; i < vertices.Length; i++) { - minDistance = MathF.Min(minDistance, poly.DistanceToPoint(Vertices[i])); + minDistance = MathF.Min(minDistance, poly.DistanceToPoint(vertices[i])); } return minDistance; } @@ -169,5 +195,18 @@ private static (bool Exists, float Offset, Vector2 Point) GetIntersection(Vector return (false, 0, Vector2.Zero); } + + public Vector3[] Extrude(float baseHeight, float height) + { + var points = new Vector3[vertices.Length * 2]; + + for (int i = 0; i < vertices.Length; i++) + { + points[i] = new(vertices[i].X, baseHeight, vertices[i].Y); + points[i + vertices.Length] = new(vertices[i].X, baseHeight + height, vertices[i].Y); + } + + return points; + } } } diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Segment2.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Segment2.cs index 9d6fe7e64..1d5339920 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Segment2.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/Primitives/Segment2.cs @@ -1,4 +1,5 @@ -using SharpDX; +using AISamples.SceneCWRVirtualWorld.Content; +using SharpDX; using System; namespace AISamples.SceneCWRVirtualWorld.Primitives @@ -10,6 +11,19 @@ struct Segment2(Vector2 p1, Vector2 p2) : IEquatable public readonly float Length => Vector2.Distance(P1, P2); public readonly Vector2 Direction => Vector2.Normalize(P2 - P1); + public static Segment2File FromSegment(Segment2 segment) + { + return new() + { + P1 = Vector2File.FromVector2(segment.P1), + P2 = Vector2File.FromVector2(segment.P2), + }; + } + public static Segment2 FromSegmentFile(Segment2File segment) + { + return new(Vector2File.FromVector2File(segment.P1), Vector2File.FromVector2File(segment.P2)); + } + public readonly float DistanceToPoint(Vector2 point) { var proj = ProjectPoint(point); diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/VirtualWorldScene.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/VirtualWorldScene.cs index fb5190503..3b7eead28 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/VirtualWorldScene.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/VirtualWorldScene.cs @@ -1,4 +1,5 @@ -using AISamples.SceneCWRVirtualWorld.Editors; +using AISamples.SceneCWRVirtualWorld.Content; +using AISamples.SceneCWRVirtualWorld.Editors; using Engine; using Engine.BuiltIn.Components.Models; using Engine.BuiltIn.UI; @@ -69,6 +70,8 @@ public VirtualWorldScene(Game game) : base(game) GameEnvironment.Background = Color.Black; world = new(graph, 0); + world.Generate(); + tools = new(this, world); tools.AddEditor(EditorModes.Graph, 0); tools.AddEditor(EditorModes.Start, 0); @@ -139,8 +142,8 @@ private async Task InitializeEditorButtons() List buttons = []; - buttons.Add(await InitializeButton("editorLoadButton", "LOAD GRAPH", editorButtonDesc, LoadGraph)); - buttons.Add(await InitializeButton("editorSaveButton", "SAVE GRAPH", editorButtonDesc, SaveGraph)); + buttons.Add(await InitializeButton("editorLoadButton", "LOAD WORLD", editorButtonDesc, LoadWorld)); + buttons.Add(await InitializeButton("editorSaveButton", "SAVE WORLD", editorButtonDesc, SaveWorld)); buttons.Add(null); foreach (var mode in tools.GetModes()) { @@ -313,12 +316,12 @@ private void UpdateInputCamera(IGameTime gameTime) if (Game.Input.KeyPressed(Keys.C)) { - Camera.MoveDown(gameTime, Game.Input.ShiftPressed); + Camera.Move(gameTime, Vector3.Down, Game.Input.ShiftPressed); } if (Game.Input.KeyPressed(Keys.Space)) { - Camera.MoveUp(gameTime, Game.Input.ShiftPressed); + Camera.Move(gameTime, Vector3.Up, Game.Input.ShiftPressed); } } @@ -357,33 +360,35 @@ private void UpdateEditorLayout() UIControlExtensions.LocateButtons(Game.Form, editorButtons, editorButtonWidth, editorButtonHeight, editorButtons.Length); } - private void LoadGraph() + private void LoadWorld() { using System.Windows.Forms.OpenFileDialog dlg = new() { - Filter = "Graph files (*.graph)|*.graph", + Filter = "World files (*.world)|*.world", FilterIndex = 1, RestoreDirectory = true, }; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { - graph.LoadFromFile(dlg.FileName); + var worldFile = SerializationHelper.DeserializeJsonFromFile(dlg.FileName); + world.LoadFromWorldFile(worldFile); } } - private void SaveGraph() + private void SaveWorld() { using System.Windows.Forms.SaveFileDialog dlg = new() { - FileName = "newgraph.graph", - Filter = "Graph files (*.graph)|*.graph", + FileName = "newworld.world", + Filter = "World files (*.world)|*.world", FilterIndex = 1, RestoreDirectory = true, }; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { - graph.SaveToFile(dlg.FileName); + var worldFile = World.FromWorld(world); + SerializationHelper.SerializeJsonToFile(worldFile, dlg.FileName); } } private void OpenEditor() diff --git a/Samples/05 AISamples/SceneCWRVirtualWorld/World.cs b/Samples/05 AISamples/SceneCWRVirtualWorld/World.cs index 2d9f0581d..35086a408 100644 --- a/Samples/05 AISamples/SceneCWRVirtualWorld/World.cs +++ b/Samples/05 AISamples/SceneCWRVirtualWorld/World.cs @@ -1,7 +1,10 @@ using AISamples.Common; +using AISamples.SceneCWRVirtualWorld.Content; +using AISamples.SceneCWRVirtualWorld.Items; using AISamples.SceneCWRVirtualWorld.Markings; using AISamples.SceneCWRVirtualWorld.Primitives; using Engine; +using Engine.BuiltIn.Components.Models; using Engine.BuiltIn.Components.Primitives; using Engine.BuiltIn.Primitives; using Engine.Common; @@ -14,23 +17,20 @@ namespace AISamples.SceneCWRVirtualWorld { - class World + class World(Graph graph, float height) { private static readonly Color4 roadColor = new(0.6f, 0.6f, 0.6f, 1f); private static readonly Color4 roadMarksColor = new(0.9f, 0.9f, 0.9f, 1f); - private static readonly Color4 buildingColor = new(0.3f, 0.3f, 1f, 0.5f); - private static readonly Color4 treeColor = new(0.3f, 1f, 0.3f, 0.5f); + private const float hLayer = 0.5f; private const float hDelta = 0.1f; - public Graph Graph { get; } - public Guid Version { get; private set; } = Guid.NewGuid(); - - private readonly float height; - private Guid graphVersion; + private float height = height; + private Graph graph = graph; + private Guid graphVersion = graph.Version; private bool worldChanged = false; + private readonly List envelopes = []; - public float RoadWidth { get; } = 30f; private readonly int roadRoundness = 16; private readonly List roadEnvelopes = []; private readonly List roadBorders = []; @@ -40,33 +40,94 @@ class World private readonly float buildingWidth = 100f; private readonly float buildingMinLenth = 100f; private readonly float buildingSpacing = 25f; - private readonly List buildingEnvelopes = []; - private readonly List buildingGuides = []; - private readonly List buildingSupports = []; - private readonly List buildingBases = []; - private GeometryColorDrawer buildingDrawer = null; + private readonly float buildingHeight = 50f; + private readonly List buildings = []; + private GeometryDrawer buildingDrawer = null; - private readonly List trees = []; + private readonly float treeScale = 0.333f; private readonly float treeRadius = 30; + private readonly float treeHeight = 100; + private readonly List trees = []; + private ModelInstanced treesDrawer = null; private readonly List laneGuides = []; - + private readonly List markings = []; private GeometryDrawer markingsDrawer2d = null; private GeometryDrawer markingsDrawer3d = null; - private readonly List markings = []; - public World(Graph graph, float height) + public Graph Graph { get => graph; } + public Guid Version { get; private set; } = Guid.NewGuid(); + public float RoadWidth { get; } = 30f; + + public static WorldFile FromWorld(World world) { - Graph = graph; + var graph = Graph.FromGraph(world.graph); + var height = world.height; + var envelopes = world.envelopes.Select(Envelope.FromEnvelope).ToArray(); + var roadEnvelopes = world.roadEnvelopes.Select(Envelope.FromEnvelope).ToArray(); + var roadBorders = world.roadBorders.Select(Segment2.FromSegment).ToArray(); + var buildings = world.buildings.Select(Building.FromBuilding).ToArray(); + var trees = world.trees.Select(Tree.FromTree).ToArray(); + var laneGuides = world.GetLaneGuides().Select(Segment2.FromSegment).ToArray(); + var markings = world.markings.Select(m => m.FromMarking()).ToArray(); + var version = world.Version; + + return new() + { + Graph = graph, + Height = height, + + Envelopes = envelopes, + RoadEnvelopes = roadEnvelopes, + RoadBorders = roadBorders, + Buildings = buildings, + Trees = trees, + LaneGuides = laneGuides, + Markings = markings, + + Version = version, + }; + } + public void LoadFromWorldFile(WorldFile file) + { + var graph = Graph.FromGraphFile(file.Graph); + var height = file.Height; + var envelopes = file.Envelopes.Select(Envelope.FromEnvelopeFile).ToList(); + var roadEnvelopes = file.RoadEnvelopes.Select(Envelope.FromEnvelopeFile).ToList(); + var roadBorders = file.RoadBorders.Select(Segment2.FromSegmentFile).ToList(); + var buildings = file.Buildings.Select(Building.FromBuildingFile).ToList(); + var trees = file.Trees.Select(Tree.FromTreeFile).ToList(); + var laneGuides = file.LaneGuides.Select(Segment2.FromSegmentFile).ToList(); + var markings = file.Markings.Select(m => m.FromMarkingFile()).ToList(); + var version = file.Version; + + this.graph = graph; this.height = height; - graphVersion = graph.Version; + this.envelopes.Clear(); + this.roadEnvelopes.Clear(); + this.roadBorders.Clear(); + this.buildings.Clear(); + this.trees.Clear(); + this.laneGuides.Clear(); + this.markings.Clear(); + + this.envelopes.AddRange(envelopes); + this.roadEnvelopes.AddRange(roadEnvelopes); + this.roadBorders.AddRange(roadBorders); + this.buildings.AddRange(buildings); + this.trees.AddRange(trees); + this.laneGuides.AddRange(laneGuides); + this.markings.AddRange(markings); - Generate(); + Version = version; + + worldChanged = true; } - private void Generate() + + public void Generate() { - var segments = Graph.GetSegments(); + var segments = graph.GetSegments(); GenerateRoads(segments); @@ -93,19 +154,18 @@ private void GenerateRoads(Segment2[] segments) } private void GenerateBuildings(Segment2[] segments) { - buildingEnvelopes.Clear(); - + List buildingEnvelopes = []; float width = RoadWidth + buildingWidth + buildingSpacing * 2; for (int i = 0; i < segments.Length; i++) { buildingEnvelopes.Add(new(segments[i], width, roadRoundness)); } - buildingGuides.Clear(); + List buildingGuides = []; buildingGuides.AddRange(Polygon.Union(buildingEnvelopes.Select(e => e.GetPolygon()).ToArray())); buildingGuides.RemoveAll(e => e.Length < buildingMinLenth); - buildingSupports.Clear(); + List buildingSupports = []; foreach (var guide in buildingGuides) { float len = guide.Length + buildingSpacing; @@ -125,7 +185,7 @@ private void GenerateBuildings(Segment2[] segments) } } - buildingBases.Clear(); + List buildingBases = []; var bases = buildingSupports.Select(seg => new Envelope(seg, buildingWidth, 1).GetPolygon()); buildingBases.AddRange(bases); @@ -151,6 +211,9 @@ private void GenerateBuildings(Segment2[] segments) return false; }); + + buildings.Clear(); + buildings.AddRange(buildingBases.Select(b => new Building(b, buildingHeight))); } private void GenerateTrees(Segment2[] segments) { @@ -165,7 +228,7 @@ private void GenerateTrees(Segment2[] segments) Polygon[] illegalPolys = [ - .. buildingBases, + .. buildings.Select(b => b.Polygon), .. envelopes.Select(e => e.GetPolygon()) ]; @@ -190,7 +253,7 @@ .. envelopes.Select(e => e.GetPolygon()) if (keep) { - keep = !trees.Exists(t => Vector2.Distance(t, p) < treeRadius * 2); + keep = !trees.Exists(t => t.DistanceToPoint(p) < treeRadius * 2); } if (keep) @@ -200,7 +263,7 @@ .. envelopes.Select(e => e.GetPolygon()) if (keep) { - trees.Add(p); + trees.Add(new(new(p.X, height, p.Y), treeRadius, treeHeight)); treeCount = 0; } treeCount++; @@ -228,7 +291,7 @@ private RectangleF GetWorldSize() Vector2[] points = [ .. roadBorders.SelectMany(b => new Vector2[] { b.P1, b.P2 }), - .. buildingBases.SelectMany(b => b.Vertices) + .. buildings.SelectMany(b => b.Polygon.GetVertices()) ]; Vector2 min = new(float.MaxValue); @@ -249,16 +312,10 @@ public async Task Initialize(Scene scene) var descT = new GeometryColorDrawerDescription() { Count = 20000, - DepthEnabled = false, + DepthEnabled = true, BlendMode = BlendModes.Alpha, }; - buildingDrawer = await scene.AddComponentEffect, GeometryColorDrawerDescription>( - nameof(buildingDrawer), - nameof(buildingDrawer), - descT, - Scene.LayerEffects); - roadDrawer = await scene.AddComponentEffect, GeometryColorDrawerDescription>( nameof(roadDrawer), nameof(roadDrawer), @@ -271,20 +328,55 @@ public async Task Initialize(Scene scene) descT, Scene.LayerEffects + 2); + var tDesc = new ModelInstancedDescription() + { + Content = ContentDescription.FromFile(Constants.TreesResourcesFolder, Constants.TreesModel), + Instances = 1000, + Optimize = true, + PickingHull = PickingHullTypes.None, + CastShadow = ShadowCastingAlgorihtms.None, + StartsVisible = false, + }; + + treesDrawer = await scene.AddComponent( + nameof(treesDrawer), + nameof(treesDrawer), + tDesc, + SceneObjectUsages.Agent); (string, string)[] images = [ ("diffuse", Constants.MarkingsTexture), ]; + var materialB = MaterialBlinnPhongContent.Default; + materialB.DiffuseTexture = "diffuse"; + materialB.IsTransparent = false; + + var descB = new GeometryDrawerDescription() + { + Count = 100000, + DepthEnabled = true, + BlendMode = BlendModes.Opaque, + Topology = Topology.TriangleList, + Images = images, + Material = materialB, + TintColor = Color.White, + }; + + buildingDrawer = await scene.AddComponentGround, GeometryDrawerDescription>( + nameof(buildingDrawer), + nameof(buildingDrawer), + descB); + var material2d = MaterialBlinnPhongContent.Default; material2d.DiffuseTexture = "diffuse"; material2d.IsTransparent = true; var descS2d = new GeometryDrawerDescription() { - Count = 20000, - DepthEnabled = false, + Count = 100000, + DepthEnabled = true, BlendMode = BlendModes.Transparent, Topology = Topology.TriangleList, Images = images, @@ -304,7 +396,7 @@ public async Task Initialize(Scene scene) var descS3d = new GeometryDrawerDescription() { - Count = 20000, + Count = 100000, DepthEnabled = true, BlendMode = BlendModes.Alpha, Topology = Topology.TriangleList, @@ -334,9 +426,9 @@ public void Update(IGameTime gameTime) DrawMarkings(); } - if (graphVersion != Graph.Version) + if (graphVersion != graph.Version) { - graphVersion = Graph.Version; + graphVersion = graph.Version; Version = Guid.NewGuid(); Generate(); @@ -351,7 +443,7 @@ private void DrawMarkings() foreach (var marking in markings) { - var vlist = marking.Draw(height); + var vlist = marking.Draw(height + hLayer + hDelta); if (marking.Is3D) { markingsDrawer3d.AddPrimitives(vlist); @@ -369,38 +461,35 @@ private void DrawGraph() roadMarksDrawer.Clear(); // Draw building areas - foreach (var support in buildingBases) + foreach (var building in buildings) { - DrawPolygon(support, height, buildingColor, buildingDrawer); + DrawBuilding(building, height, buildingDrawer); } // Draw trees - foreach (var tree in trees) - { - DrawCircle(tree, treeRadius, height, treeColor, buildingDrawer); - } + DrawTrees(trees, treeScale, treesDrawer); // Draw road base foreach (var roadEnvelope in roadEnvelopes) { - DrawEnvelope(roadEnvelope, height, roadColor, roadDrawer); + DrawEnvelope(roadEnvelope, height + hLayer, roadColor, roadDrawer); } // Draw road marks - foreach (var segment in Graph.GetSegments()) + foreach (var segment in graph.GetSegments()) { var dashes = Utils.Divide(segment, 5, 5); foreach (var dash in dashes) { - DrawEnvelope(new Envelope(dash, 2, 1), height + hDelta, roadMarksColor, roadMarksDrawer); + DrawEnvelope(new Envelope(dash, 2, 1), height + hLayer + hDelta, roadMarksColor, roadMarksDrawer); } } // Draw road borders foreach (var border in roadBorders) { - DrawEnvelope(new Envelope(border, 2, 3), height + hDelta, roadMarksColor, roadMarksDrawer); + DrawEnvelope(new Envelope(border, 2, 3), height + hLayer + hDelta, roadMarksColor, roadMarksDrawer); } } private static void DrawEnvelope(Envelope envelope, float height, Color4 color, GeometryColorDrawer drawer) @@ -412,21 +501,34 @@ private static void DrawEnvelope(Envelope envelope, float height, Color4 color, var t = GeometryUtil.CreatePolygonTriangleList(vertices, true); drawer.AddPrimitives(color, Triangle.ComputeTriangleList(t)); } - private static void DrawPolygon(Polygon polygon, float height, Color4 color, GeometryColorDrawer drawer) + private static void DrawTrees(IEnumerable trees, float baseScale, ModelInstanced drawer) { - var vertices = polygon - .Vertices - .Select(v => new Vector3(v.X, height, v.Y)); + for (int i = 0; i < drawer.InstanceCount; i++) + { + var tree = trees.ElementAtOrDefault(i); + if (tree == null) + { + drawer[i].Manipulator.SetTransform(Matrix.Identity); + drawer[i].Visible = false; + continue; + } - var t = GeometryUtil.CreatePolygonTriangleList(vertices, true); - drawer.AddPrimitives(color, Triangle.ComputeTriangleList(t)); + var scale = Matrix.Scaling(tree.Radius * baseScale); + var rot = Matrix.RotationY(i * 0.1f); + var translation = Matrix.Translation(tree.Position); + var transform = scale * rot * translation; + + drawer[i].Manipulator.SetTransform(transform); + drawer[i].Visible = true; + } + + drawer.Visible = trees.Any(); } - private static void DrawCircle(Vector2 point, float radius, float height, Color4 color, GeometryColorDrawer drawer) + private static void DrawBuilding(Building building, float height, GeometryDrawer drawer) { - var v = new Vector3(point.X, height, point.Y); + var vlist = building.CreateBuilding(height); - var t = GeometryUtil.CreateCircle(Topology.TriangleList, v, radius, 32); - drawer.AddPrimitives(color, Triangle.ComputeTriangleList(t)); + drawer.AddPrimitives(vlist); } public Segment2[] GetLaneGuides() @@ -470,7 +572,13 @@ public void RemoveMarking(Marking marking) public void Clear() { - Graph.Clear(); + graph.Clear(); + envelopes.Clear(); + roadEnvelopes.Clear(); + roadBorders.Clear(); + buildings.Clear(); + trees.Clear(); + laneGuides.Clear(); markings.Clear(); worldChanged = true;