Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

@@ -0,0 +1,8 @@
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
ADD_SUBDIRECTORY(UnitTest_TrajectorySplitter)
@@ -0,0 +1,124 @@
{ "xRelativ": 0, "yRelativ": 87, "zRelativ": 0, "zeit": 0 } { "xRelativ":
264.92901384887057, "yRelativ": 174.47292577550235, "zRelativ": 0.02662089743508293, "zeit": 0.42316757561829477 } { "xRelativ": 527.817117836265,
"yRelativ": 259.39749108373843, "zRelativ": 0.10711867810716591, "zeit": 0.8671332156643488 } { "xRelativ": 788.7136308929233, "yRelativ":
341.7537090754077, "zRelativ": 0.24257733886856256, "zeit": 1.317025093437079 } { "xRelativ": 1047.6615285149353, "yRelativ": 421.51802443336, "zRelativ":
0.4341458137452195, "zeit": 1.7729216456145016 } { "xRelativ": 1272.670456388367, "yRelativ": 489.16424954886634, "zRelativ": 0.648743912367082,
"zeit": 2.175420509369112 } { "xRelativ": 1496.1617588664074, "yRelativ": 554.7638718196823, "zRelativ": 0.9079763526756811, "zeit": 2.580929441712794 }
{ "xRelativ": 1718.0422067916973, "yRelativ": 618.2656482647882, "zRelativ": 1.2125072432874477, "zeit": 2.9908190774616394 } { "xRelativ":
1938.330944134444, "yRelativ": 679.6520331535114, "zRelativ": 1.5631256945293488, "zeit": 3.405114349100484 } { "xRelativ": 2157.044359965948, "yRelativ":
738.9042569599119, "zRelativ": 1.9606317053734932, "zeit": 3.8238343302505746 } { "xRelativ": 2374.179454251386, "yRelativ": 795.9981045121799,
"zRelativ": 2.4057001489064205, "zeit": 4.246959426288938 } { "xRelativ": 2589.7075746926794, "yRelativ": 850.9031532411445,
"zRelativ": 2.8988951350823706, "zeit": 4.674416976133513 } { "xRelativ": 2803.625245250845, "yRelativ": 903.5962127427072,
"zRelativ": 3.4408242962627167, "zeit": 5.106179504182334 } { "xRelativ": 3015.753395193171, "yRelativ": 954.0134750176439,
"zRelativ": 4.0315840043246425, "zeit": 5.541857190559005 } { "xRelativ": 3226.04018172054, "yRelativ": 1002.1263109737092, "zRelativ": 4.671491724277319,
"zeit": 5.981306785503242 } { "xRelativ": 3434.503695723219, "yRelativ": 1047.9235062132045, "zRelativ": 5.361047083221246, "zeit": 6.424524728114267 } {
"xRelativ": 3641.159218345649, "yRelativ": 1091.3931626499334, "zRelativ": 6.100752704963098, "zeit": 6.87150067202138 } { "xRelativ": 3846.0195490859824,
"yRelativ": 1132.5229007478931, "zRelativ": 6.891111327028094, "zeit": 7.322217861888602 } { "xRelativ": 4049.0953248019264, "yRelativ":
1171.3000490713105, "zRelativ": 7.73262312147463, "zeit": 7.776653548451646 } { "xRelativ": 4250.395329938128, "yRelativ": 1207.7118204515107,
"zRelativ": 8.62578323430379, "zeit": 8.234779443194908 } { "xRelativ": 4449.9039507029875, "yRelativ": 1241.7416941206964, "zRelativ": 9.570963177466668,
"zeit": 8.696509201569398 } { "xRelativ": 4647.484925820487, "yRelativ": 1273.35579439689, "zRelativ": 10.567796577492881, "zeit": 9.161470612161173 } {
"xRelativ": 4815.295806413785, "yRelativ": 1298.5235324118603, "zRelativ": 11.463385441541586, "zeit": 9.562509460890828 } { "xRelativ":
4981.693048622579, "yRelativ": 1321.9069836272317, "zRelativ": 12.397105821249431, "zeit": 9.965840845672002 } { "xRelativ": 5146.687445822314,
"yRelativ": 1343.5036375846614, "zRelativ": 13.36908702977499, "zeit": 10.371448875731526 } { "xRelativ": 5310.289247221179, "yRelativ":
1363.3110214569886, "zRelativ": 14.379455555652042, "zeit": 10.779316221496169 } { "xRelativ": 5472.508280876805, "yRelativ": 1381.32673988717,
"zRelativ": 15.428334686559369, "zeit": 11.189424416135394 } { "xRelativ": 5633.3540705338055, "yRelativ": 1397.5485073966336,
"zRelativ": 16.515844254274977, "zeit": 11.60175416482782 } { "xRelativ": 5792.918488561989, "yRelativ": 1411.9812057614772,
"zRelativ": 17.642695945593214, "zeit": 12.016500348251098 } { "xRelativ": 5951.602993266749, "yRelativ": 1424.649459083988,
"zRelativ": 18.812027905606268, "zeit": 12.434673896701511 } { "xRelativ": 6109.436505497795, "yRelativ": 1435.5373424624672,
"zRelativ": 20.024545582829482, "zeit": 12.856329450140114 } { "xRelativ": 6266.509511696176, "yRelativ": 1444.6310496431215,
"zRelativ": 21.28146507192771, "zeit": 13.28169203569395 } { "xRelativ": 6423.704767078978, "yRelativ": 1451.9452196648554,
"zRelativ": 22.590782872547205, "zeit": 13.713151591402328 } { "xRelativ": 6581.511294764046, "yRelativ": 1457.4420159446634,
"zRelativ": 23.958181651576584, "zeit": 14.152081584408341 } { "xRelativ": 6740.708204467678, "yRelativ": 1461.063997699184,
"zRelativ": 25.392696730677216, "zeit": 14.60069300198115 } { "xRelativ": 6901.974936945717, "yRelativ": 1462.7127400025756,
"zRelativ": 26.90355408049825, "zeit": 15.060978072354045 } { "xRelativ": 7065.931914784388, "yRelativ": 1462.2520863694708,
"zRelativ": 28.50045932326631, "zeit": 15.534773332435343 } { "xRelativ": 7204.3899296521095, "yRelativ": 1460.1465791292762,
"zRelativ": 29.89774175801777, "zeit": 15.939311665982192 } { "xRelativ": 7344.310327774728, "yRelativ": 1456.3886585442183,
"zRelativ": 31.35592735710163, "zeit": 16.3521166282013 } { "xRelativ": 7485.506385757768, "yRelativ": 1450.9036028742253, "zRelativ": 32.875180047653885,
"zeit": 16.7726404680203 } { "xRelativ": 7627.7846984507705, "yRelativ": 1443.6243527953839, "zRelativ": 34.45522654617, "zeit": 17.200295887629697 } {
"xRelativ": 7770.96783657639, "yRelativ": 1434.490934439522, "zRelativ": 36.095593855551805, "zeit": 17.63452550541688 } { "xRelativ": 7914.891572427645,
"yRelativ": 1423.4503767882618, "zRelativ": 37.79571974304789, "zeit": 18.07479676390447 } { "xRelativ": 8059.403915188324, "yRelativ": 1410.456436242184,
"zRelativ": 39.5549601209268, "zeit": 18.52060181849778 } { "xRelativ": 8204.366506351464, "yRelativ": 1395.4690478428847, "zRelativ": 41.37262014144733,
"zeit": 18.971464479435113 } { "xRelativ": 8349.655456359758, "yRelativ": 1378.453653736664, "zRelativ": 43.24798279390431, "zeit": 19.426945432815643 }
{ "xRelativ": 8495.161679455245, "yRelativ": 1359.3804541368684, "zRelativ": 45.180334266378004, "zeit": 19.886645813789276 } { "xRelativ":
8640.790802339236, "yRelativ": 1338.2236212923929, "zRelativ": 47.16898568033212, "zeit": 20.350209288555977 } { "xRelativ": 8786.462730602496,
"yRelativ": 1314.9605102311587, "zRelativ": 49.2132910994555, "zeit": 20.81732285371174 } { "xRelativ": 8932.110956878605, "yRelativ": 1289.5708924959679,
"zRelativ": 51.312661940457964, "zeit": 21.287716585014074 } { "xRelativ": 9077.682313654632, "yRelativ": 1262.0361113438485,
"zRelativ": 53.46659106527009, "zeit": 21.761164607415193 } { "xRelativ": 9223.15299564122, "yRelativ": 1232.334925946738, "zRelativ": 55.67514660103901,
"zeit": 22.237539310761296 } { "xRelativ": 9368.499044808717, "yRelativ": 1200.4481097398589, "zRelativ": 57.938683482733126, "zeit": 22.71671693082566 }
{ "xRelativ": 9513.696966361245, "yRelativ": 1166.3580456065579, "zRelativ": 60.25749995488794, "zeit": 23.19857964224667 } { "xRelativ":
9658.731690049053, "yRelativ": 1130.0465954717768, "zRelativ": 62.63193322853328, "zeit": 23.683042287890338 } { "xRelativ": 9803.595681312554,
"yRelativ": 1091.4946627331606, "zRelativ": 65.06236075273098, "zeit": 24.17005024564265 } { "xRelativ": 9948.288068488084, "yRelativ":
1050.6818120718194, "zRelativ": 67.54920058086417, "zeit": 24.659577214566927 } { "xRelativ": 10092.813834134578, "yRelativ": 1007.5859338231913,
"zRelativ": 70.09291151720386, "zeit": 25.151623100713145 } { "xRelativ": 10237.183074859822, "yRelativ": 962.1829474248021,
"zRelativ": 72.69399312942286, "zeit": 25.64621203834946 } { "xRelativ": 10381.410330438524, "yRelativ": 914.4465384758553, "zRelativ": 75.35298568895132,
"zeit": 26.143390568795883 } { "xRelativ": 10525.276790425323, "yRelativ": 864.4323748374304, "zRelativ": 78.06594706166167, "zeit": 26.64240073362623 }
{ "xRelativ": 10668.292565257545, "yRelativ": 812.3118170374198, "zRelativ": 80.82322553052114, "zeit": 27.14152290057901 } { "xRelativ":
10810.450109000809, "yRelativ": 758.1014590452174, "zRelativ": 83.6238919660965, "zeit": 27.64070006753179 } { "xRelativ": 10951.756580024134, "yRelativ":
701.8127436432027, "zRelativ": 86.4672527220736, "zeit": 28.13993223448457 } { "xRelativ": 11004.943335671449, "yRelativ": 679.9994989836455,
"zRelativ": 87.55287154361422, "zeit": 28.32863291589727 } { "xRelativ": 11024.335485058064, "yRelativ": 671.9830718180636, "zRelativ": 87.92903026884116,
"zeit": 28.420639771216415 } { "xRelativ": 11100.21984616728, "yRelativ": 639.7392557756232, "zRelativ": 89.40212615944367, "zeit": 28.821882126373755 }
{ "xRelativ": 11152.742165081048, "yRelativ": 616.0529483568182, "zRelativ": 90.42341406537633, "zeit": 29.226286071708532 } { "xRelativ":
11193.271852123562, "yRelativ": 596.3408074418735, "zRelativ": 91.21278397948197, "zeit": 29.631428430972147 } { "xRelativ": 11226.28500991867,
"yRelativ": 578.8210033928916, "zRelativ": 91.85675684807502, "zeit": 30.03540991971389 } { "xRelativ": 11254.227157001867, "yRelativ": 562.5123550319646,
"zRelativ": 92.4026108289216, "zeit": 30.438482771707214 } { "xRelativ": 11278.594301262206, "yRelativ": 546.7919561769685, "zRelativ": 92.87927865140509,
"zeit": 30.8420332938371 } { "xRelativ": 11300.357097851796, "yRelativ": 531.2266409087222, "zRelativ": 93.30553868133093, "zeit": 31.24781331532016 } {
"xRelativ": 11319.794086200334, "yRelativ": 515.8078371851949, "zRelativ": 93.68667708034342, "zeit": 31.64938614114135 } { "xRelativ":
11337.989362305336, "yRelativ": 499.7997097923123, "zRelativ": 94.04382573010889, "zeit": 32.060973130558004 } { "xRelativ": 11354.447034153147,
"yRelativ": 483.7648081358486, "zRelativ": 94.36714405385955, "zeit": 32.46462420892174 } { "xRelativ": 11370.473778499521, "yRelativ": 466.4902966169071,
"zRelativ": 94.68221569173885, "zeit": 32.88797252052937 } { "xRelativ": 11384.89101884696, "yRelativ": 449.33805886194824, "zRelativ": 94.96579170236389,
"zeit": 33.29598001219888 } { "xRelativ": 11395.981469933671, "yRelativ": 434.96545697335347, "zRelativ": 95.18399600505616, "zeit": 33.62863291589727 }
{ "xRelativ": 11409.236947977843, "yRelativ": 416.29617224851137, "zRelativ": 95.44482733206365, "zeit": 34.04082881539747 } { "xRelativ":
11411.285518092966, "yRelativ": 413.26044882799937, "zRelativ": 95.48513715974597, "zeit": 34.10532899875924 } { "xRelativ": 11419.459782669115,
"yRelativ": 400.45101207953184, "zRelativ": 95.64597096552859, "zeit": 34.50706881576209 } { "xRelativ": 11423.734861523346, "yRelativ":
392.5118315876584, "zRelativ": 95.73005916380147, "zeit": 34.910235145415434 } { "xRelativ": 11426.49578154897, "yRelativ": 386.0591251966,
"zRelativ": 95.78432184334547, "zeit": 35.314853248312566 } { "xRelativ": 11428.434132450526, "yRelativ": 380.1405848375414,
"zRelativ": 95.82235658843106, "zeit": 35.72479461543669 } { "xRelativ": 11429.826693932191, "yRelativ": 374.4631097940547, "zRelativ": 95.8496034725259,
"zeit": 36.13686244791632 } { "xRelativ": 11430.858784299904, "yRelativ": 368.76345688039686, "zRelativ": 95.86970170148653, "zeit": 36.55950145263015 }
{ "xRelativ": 11431.58968493453, "yRelativ": 363.2663541915362, "zRelativ": 95.88383019968666, "zeit": 36.97094102626642 } { "xRelativ":
11432.162550220839, "yRelativ": 357.3343031965715, "zRelativ": 95.89477793773139, "zeit": 37.416671227566354 } { "xRelativ": 11432.57453933342,
"yRelativ": 351.35486425071315, "zRelativ": 95.9025105233024, "zeit": 37.86665234292258 } { "xRelativ": 11432.877837647795, "yRelativ":
345.10909634518674, "zRelativ": 95.90804515577143, "zeit": 38.33692802395387 } { "xRelativ": 11433.09846822694, "yRelativ": 338.517286188265,
"zRelativ": 95.91189045274999, "zeit": 38.833363879071 } { "xRelativ": 11433.248677646154, "yRelativ": 331.87916060955405, "zRelativ": 95.91431459190422,
"zeit": 39.333363879071 } { "xRelativ": 11433.348882570777, "yRelativ": 325.2422397338318, "zRelativ": 95.91572983853065, "zeit": 39.833363879071 } {
"xRelativ": 11433.414518760721, "yRelativ": 318.60681330888696, "zRelativ": 95.91644574367233, "zeit": 40.333363879070994 } { "xRelativ":
11433.456260054918, "yRelativ": 311.973114406024, "zRelativ": 95.91667699041493, "zeit": 40.833363879070994 } { "xRelativ": 11433.481486984167,
"yRelativ": 305.3412990458193, "zRelativ": 95.9165724557235, "zeit": 41.333363879070994 } { "xRelativ": 11433.495302253918, "yRelativ":
298.71146245908585, "zRelativ": 95.9162353668241, "zeit": 41.83336387907099 } { "xRelativ": 11433.500548152258, "yRelativ": 293.4090555920253,
"zRelativ": 95.91584714678909, "zeit": 42.23336387907099 } { "xRelativ": 11433.501967204562, "yRelativ": 286.7829015145368, "zRelativ": 95.91525679993751,
"zeit": 42.733363879070986 } { "xRelativ": 11433.499335919818, "yRelativ": 280.15882375525115, "zRelativ": 95.91458354139951, "zeit": 43.233363879070986
} { "xRelativ": 11433.493907953312, "yRelativ": 273.536830677164, "zRelativ": 95.91385300842985, "zeit": 43.733363879070986 } { "xRelativ":
11433.486549507788, "yRelativ": 266.91692553984, "zRelativ": 95.9130829647681, "zeit": 44.23336387907098 } { "xRelativ": 11433.479681686724, "yRelativ":
261.6225051311806, "zRelativ": 95.91244688984187, "zeit": 44.633363879070984 } { "xRelativ": 11433.47022997119, "yRelativ": 255.00635849002902,
"zRelativ": 95.91163415590303, "zeit": 45.13336387907098 } { "xRelativ": 11433.460096115776, "yRelativ": 248.39229789577348,
"zRelativ": 95.91080763291724, "zeit": 45.63336387907098 }
{ "xRelativ": 11004.943335671449, "yRelativ": 679.9994989836455, "zRelativ": 87.55287154361422,
"zeit": 28.32863291589727 } { "xRelativ": 11043.727634444678, "yRelativ": 663.9667038330389, "zRelativ": 88.3051889940681, "zeit": 28.506460354460955 } {
"xRelativ": 11119.006328411935, "yRelativ": 631.7585823372341, "zRelativ": 89.76652640827223, "zeit": 28.906818574224253 } { "xRelativ":
11171.917972657753, "yRelativ": 607.7540924048816, "zRelativ": 90.79537083018761, "zeit": 29.308956641395085 } { "xRelativ": 11213.546941861956,
"yRelativ": 587.4288634353316, "zRelativ": 91.60613181351381, "zeit": 29.71415104903123 } { "xRelativ": 11247.924664954591, "yRelativ": 569.1686105331734,
"zRelativ": 92.27670528358261, "zeit": 30.11865680553989 } { "xRelativ": 11277.473529493598, "yRelativ": 551.9745945754645, "zRelativ": 92.85393305216392,
"zeit": 30.523192972002366 } { "xRelativ": 11303.510356440383, "yRelativ": 535.3123986302426, "zRelativ": 93.36325360985394, "zeit": 30.92682745026673 }
{ "xRelativ": 11327.577437716074, "yRelativ": 518.3252752102593, "zRelativ": 93.83464803213366, "zeit": 31.341524665217197 } { "xRelativ":
11349.641672687, "yRelativ": 501.12144249545435, "zRelativ": 94.26732562403264, "zeit": 31.75855034515161 } { "xRelativ": 11369.765284326642, "yRelativ":
483.8130803812575, "zRelativ": 94.66236165678039, "zeit": 32.17127410388573 } { "xRelativ": 11388.327099857737, "yRelativ": 466.24971891921405,
"zRelativ": 95.02706541088766, "zeit": 32.58116552646909 } { "xRelativ": 11406.017762440957, "yRelativ": 447.8622790882401, "zRelativ": 95.37491218944194,
"zeit": 33.00003479838909 } { "xRelativ": 11422.674212587985, "yRelativ": 428.8630725613948, "zRelativ": 95.70261568950436, "zeit": 33.42202695039745 } {
"xRelativ": 11438.234029710628, "yRelativ": 409.42577037021096, "zRelativ": 96.00886727478525, "zeit": 33.84307821894881 } { "xRelativ":
11452.689275337752, "yRelativ": 389.7031408150357, "zRelativ": 96.29343689359482, "zeit": 34.26021424776057 } { "xRelativ": 11464.71710783156, "yRelativ":
371.909984788195, "zRelativ": 96.5302211066025, "zeit": 34.62863291589727 } { "xRelativ": 11477.755322713407, "yRelativ": 351.04268351808685,
"zRelativ": 96.78684636252149, "zeit": 35.044035435387514 } { "xRelativ": 11478.71814942543, "yRelativ": 349.43379687939347,
"zRelativ": 96.80579361537536, "zeit": 35.07509661563648 } { "xRelativ": 11486.513069239078, "yRelativ": 335.7661291318016, "zRelativ": 96.95915516430225,
"zeit": 35.47517459504593 } { "xRelativ": 11490.518074724874, "yRelativ": 327.5136024325229, "zRelativ": 97.03790090782059, "zeit": 35.87820118223462 } {
"xRelativ": 11493.064658354193, "yRelativ": 320.96043709953466, "zRelativ": 97.08791443049023, "zeit": 36.27933906477598 } { "xRelativ":
11494.837446546813, "yRelativ": 315.0483179389918, "zRelativ": 97.12266178839167, "zeit": 36.68279449934332 } { "xRelativ": 11496.119408344146,
"yRelativ": 309.3783634813608, "zRelativ": 97.14770566200089, "zeit": 37.09088182111604 } { "xRelativ": 11497.070857247425, "yRelativ": 303.7024052820246,
"zRelativ": 97.1661941532448, "zeit": 37.51012220397199 } { "xRelativ": 11497.736335528018, "yRelativ": 298.322652240787, "zRelativ": 97.17902200050501,
"zeit": 37.91231871352893 } { "xRelativ": 11498.249863869263, "yRelativ": 292.667249805557, "zRelativ": 97.18880249154032, "zeit": 38.33749091881605 } {
"xRelativ": 11498.606515498383, "yRelativ": 287.28931803609777, "zRelativ": 97.19547534066456, "zeit": 38.74284195244496 } { "xRelativ":
11498.907073677967, "yRelativ": 280.9474775583367, "zRelativ": 97.2009434860124, "zeit": 39.221425986209404 } { "xRelativ": 11499.121563240604,
"yRelativ": 274.34404243874127, "zRelativ": 97.20466256494127, "zeit": 39.720062770644574 } { "xRelativ": 11499.266493362005, "yRelativ":
267.7249346365973, "zRelativ": 97.2069814590229, "zeit": 40.22006277064457 } { "xRelativ": 11499.362911009477, "yRelativ": 261.1076959097998,
"zRelativ": 97.20832226297901, "zeit": 40.72006277064457 } { "xRelativ": 11499.42583300566, "yRelativ": 254.49226735111273, "zRelativ": 97.20898592381488,
"zeit": 41.22006277064457 } { "xRelativ": 11499.465060791077, "yRelativ": 248.00000032681314, "zRelativ": 97.20918057242068, "zeit": 41.710891614207426 }
@@ -0,0 +1,30 @@
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
SET(UnitTestSources
../trajectory_splitter.cpp
../trajectory_splitter.h
trajectory_splitter_unit_test.cpp
trajectory_splitter_unit_test.h
)
SOURCE_GROUP( UnitTestSources FILES ${UnitTestSources} )
IF(BUILD_TESTING)
ADD_EXECUTABLE(aesUnitTestTrajectorySplitter ${LinkedSources} ${UnitTestSources} )
TARGET_LINK_LIBRARIES(aesUnitTestTrajectorySplitter
NGLLogger
nglcoreapplication
Qt5::Core
Qt5::Test
svcAesCommon
)
ADD_TEST(NAME aesUnitTestTrajectorySplitter COMMAND $<TARGET_FILE:aesUnitTestTrajectorySplitter>)
ENDIF()
@@ -0,0 +1,285 @@
/**
* @RDE_HEADER@
* Unittest
* $Id$
* $HeadURL$
* $Author$
*/
#include "trajectory_splitter_unit_test.h"
#include "../trajectory_splitter.h"
#include <nglapplication/nglcoreapplication.h>
#include <QtTest/QTest>
#include <iostream>
using namespace AreaEffectSimulation;
//
//
// This class is an UnitTest with values taken from the TNE.
// That was created while Michael Moetje was implementing that code at the TNE (PlayerUnit)
//
//
static TrajectoryType getExampleData()
{
TrajectoryType vector;
// trunk (size = 5)
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 1));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 2));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 3));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 4));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 5));
// branch 1 (size = 3)
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 6));
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 7));
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 8));
// branch 2 (size = 4)
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 6));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 7));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 8));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 9));
return vector;
}
static TrajectoryType getRealTrunk()
{
TrajectoryType vector;
// trunk (size = 5)
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 1));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 2));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 3));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 4));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 5));
return vector;
}
static TrajectoryType getRealBranch1()
{
TrajectoryType vector;
// branch 1 (size = 3)
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 6));
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 7));
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 8));
return vector;
}
static TrajectoryType getRealBranch2()
{
TrajectoryType vector;
// branch 2 (size = 4)
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 6));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 7));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 8));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 9));
return vector;
}
static TrajectoryType getRealTrajectory1()
{
TrajectoryType vector;
// trunk (size = 5)
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 1));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 2));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 3));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 4));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 5));
// branch 1 (size = 3)
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 6));
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 7));
vector.emplace_back(Core::GeoPositionRelativeTime(1.1, 0.2, 0.3, 8));
return vector;
}
static TrajectoryType getRealTrajectory2()
{
TrajectoryType vector;
// trunk (size = 5)
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 1));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 2));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 3));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 4));
vector.emplace_back(Core::GeoPositionRelativeTime(0.1, 0.2, 0.3, 5));
// branch 2 (size = 4)
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 6));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 7));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 8));
vector.emplace_back(Core::GeoPositionRelativeTime(2.1, 0.2, 0.3, 9));
return vector;
}
// TrajectorySplitter::init is protected.
// To gain access, create a temporary class and enable access:
class MyLocalTrajectorySplitter : public TrajectorySplitter<std::vector<Core::GeoPositionRelativeTime>>
{
public:
using BaseClass = TrajectorySplitter;
explicit MyLocalTrajectorySplitter(const TrajectoryType &trajectory)
: BaseClass(trajectory)
{}
bool init() const
{
return BaseClass::init();
}
size_t rawTrajectorySize() const
{
return BaseClass::rawTrajectorySize();
}
static qint64 findDuplicateTimeInternal(const TrajectoryType &trajectory) { return BaseClass::findDuplicateTimeInternal(trajectory);}
static int findDuplicateBranchIndexInternal(const TrajectoryType &trajectory) { return BaseClass::findDuplicateBranchIndexInternal(trajectory);}
static int findIndexOfEndOfFirstBranchInternal(const TrajectoryType &trajectory) { return BaseClass::findIndexOfEndOfFirstBranchInternal(trajectory);}
};
void UnitTestTrajectorySplitter::init()
{
m_trajectory = getExampleData();
}
void UnitTestTrajectorySplitter::test_rawTrajectorySize()
{
QCOMPARE(m_trajectory.size(), 12);
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
}
void UnitTestTrajectorySplitter::test_findDuplicateTimeInternal()
{
const int value = MyLocalTrajectorySplitter::findDuplicateTimeInternal(m_trajectory);
QCOMPARE(value, 6);
}
void UnitTestTrajectorySplitter::test_findDuplicateTimeInternalFailure()
{
const int value = MyLocalTrajectorySplitter::findDuplicateTimeInternal(getRealTrunk());
QCOMPARE(value, -1);
}
void UnitTestTrajectorySplitter::test_findDuplicateBranchIndexInternal()
{
const int idx = MyLocalTrajectorySplitter::findDuplicateBranchIndexInternal(m_trajectory);
QCOMPARE(idx, 5);
}
void UnitTestTrajectorySplitter::test_findDuplicateBranchIndexInternalFailure()
{
const int idx = MyLocalTrajectorySplitter::findDuplicateBranchIndexInternal(getRealTrunk());
QCOMPARE(idx, -1);
}
void UnitTestTrajectorySplitter::test_init()
{
{
MyLocalTrajectorySplitter splitter({});
QCOMPARE(splitter.init(), false);
}
{
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
QCOMPARE(splitter.init(), true);
QCOMPARE(splitter.init(), true); // execute a second time
}
}
void UnitTestTrajectorySplitter::test_findIndexOfEndOfFirstBranchInternal()
{
const int idx = MyLocalTrajectorySplitter::findIndexOfEndOfFirstBranchInternal(m_trajectory);
QCOMPARE(idx, 7);
}
void UnitTestTrajectorySplitter::test_trunk()
{
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
const auto trunk = splitter.getTrunk();
QCOMPARE(trunk.size(), 5);
const auto realTrunk = getRealTrunk();
QCOMPARE(trunk, realTrunk);
}
void UnitTestTrajectorySplitter::test_branch1()
{
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
const auto br1 = splitter.getBranch1();
QCOMPARE(br1.size(), 3);
const auto &realBranch1 = getRealBranch1();
QCOMPARE(br1, realBranch1);
}
void UnitTestTrajectorySplitter::test_branch2()
{
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
const auto br2 = splitter.getBranch2();
QCOMPARE(br2.size(), 4);
const auto &realBranch2 = getRealBranch2();
QCOMPARE(br2, realBranch2);
}
void UnitTestTrajectorySplitter::test_trajectory1()
{
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
const auto traj1 = splitter.getTrajectory1();
QCOMPARE(traj1.size(), 8);
const auto &getRealTraj1 = getRealTrajectory1();
QCOMPARE(traj1, getRealTraj1);
}
void UnitTestTrajectorySplitter::test_trajectory2()
{
MyLocalTrajectorySplitter splitter(m_trajectory);
QCOMPARE(splitter.rawTrajectorySize(), 12);
const auto tra2 = splitter.getTrajectory2();
QCOMPARE(tra2.size(), 9);
const auto &getRealTraj2 = getRealTrajectory2();
QCOMPARE(tra2, getRealTraj2);
}
void UnitTestTrajectorySplitter::test_failure()
{
MyLocalTrajectorySplitter splitter(getRealTrunk());
QCOMPARE(splitter.rawTrajectorySize(), 5);
QCOMPARE(splitter.init(), false);
QCOMPARE(splitter.getTrunk().size(), 0);
QCOMPARE(splitter.getBranch1().size(), 0);
QCOMPARE(splitter.getBranch2().size(), 0);
QCOMPARE(splitter.getTrajectory1().size(), 0);
QCOMPARE(splitter.getTrajectory2().size(), 0);
}
int main(int argc, char *argv[])
{
NGLCoreApplication app(argc, argv);
app.createLogger("UnitTest_TrajectorySplitter", "log4cxxUnitTest.props");
UnitTestTrajectorySplitter tc;
return QTest::qExec(&tc, argc, argv);
}
@@ -0,0 +1,52 @@
/**
* @RDE_HEADER@
* Unittest
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
#include <QCoreApplication>
#include <QtTest/QTest>
#include <Core/core.hpp>
using TrajectoryType = std::vector<Core::GeoPositionRelativeTime>;
/**
* @brief This class is an UnitTest with values taken from the TNE.
* That was created while Michael Moetje was implementing that code at the TNE (PlayerUnit)
*/
class UnitTestTrajectorySplitter : public QObject
{
Q_OBJECT
private Q_SLOTS:
void init();
void test_rawTrajectorySize();
void test_findDuplicateTimeInternal();
void test_findDuplicateTimeInternalFailure();
void test_findDuplicateBranchIndexInternal();
void test_findDuplicateBranchIndexInternalFailure();
void test_init();
void test_findIndexOfEndOfFirstBranchInternal();
void test_trunk();
void test_branch1();
void test_branch2();
void test_trajectory1();
void test_trajectory2();
void test_failure();
// void cleanup();
private:
TrajectoryType m_trajectory;
};
@@ -0,0 +1 @@
cat RealExampleData.json | jq
@@ -0,0 +1,100 @@
/**
* @RDE_HEADER@
* TrajectorySplitter
* $Id$
* $HeadURL$
* $Author$
* Created by Norbert Thoden, ESVG, 2026-04-10
*/
#include "trajectory_splitter.h"
#include <QVector>
namespace AreaEffectSimulation
{
#ifdef NEVER
{ "xRelativ": 0, "yRelativ": 87, "zRelativ": 0, "zeit": 0 }
{ "xRelativ": 264.92901384887057, "yRelativ": 174.47292577550235, "zRelativ": 0.02662089743508293, "zeit": 0.42316757561829477 }
{ "xRelativ": 527.817117836265, "yRelativ": 259.39749108373843, "zRelativ": 0.10711867810716591, "zeit": 0.8671332156643488 }
{ "xRelativ": 788.7136308929233, "yRelativ": 341.7537090754077, "zRelativ": 0.24257733886856256, "zeit": 1.317025093437079 }
{ "xRelativ": 1047.6615285149353, "yRelativ": 421.51802443336, "zRelativ": 0.4341458137452195, "zeit": 1.7729216456145016 }
...
{ "xRelativ": 10668.292565257545, "yRelativ": 812.3118170374198, "zRelativ": 80.82322553052114, "zeit": 27.14152290057901 }
{ "xRelativ": 10810.450109000809, "yRelativ": 758.1014590452174, "zRelativ": 83.6238919660965, "zeit": 27.64070006753179 }
{ "xRelativ": 10951.756580024134, "yRelativ": 701.8127436432027, "zRelativ": 86.4672527220736, "zeit": 28.13993223448457 }
{ "xRelativ": 11004.943335671449, "yRelativ": 679.9994989836455, "zRelativ": 87.55287154361422, "zeit": 28.32863291589727 } <- "zeit": 28.32863291589727
{ "xRelativ": 11024.335485058064, "yRelativ": 671.9830718180636, "zRelativ": 87.92903026884116, "zeit": 28.420639771216415 }
{ "xRelativ": 11100.21984616728, "yRelativ": 639.7392557756232, "zRelativ": 89.40212615944367, "zeit": 28.821882126373755 }
...
{ "xRelativ": 11433.493907953312, "yRelativ": 273.536830677164, "zRelativ": 95.91385300842985, "zeit": 43.733363879070986 }
{ "xRelativ": 11433.486549507788, "yRelativ": 266.91692553984, "zRelativ": 95.9130829647681, "zeit": 44.23336387907098 }
{ "xRelativ": 11433.479681686724, "yRelativ": 261.6225051311806, "zRelativ": 95.91244688984187, "zeit": 44.633363879070984 }
{ "xRelativ": 11433.47022997119, "yRelativ": 255.00635849002902, "zRelativ": 95.91163415590303, "zeit": 45.13336387907098 }
{ "xRelativ": 11433.460096115776, "yRelativ": 248.39229789577348, "zRelativ": 95.91080763291724, "zeit": 45.63336387907098 }
// { "xRelativ": 11004.943335671449, "yRelativ": 679.9994989836455, "zRelativ": 87.55287154361422,"zeit": 28.32863291589727 } <- "zeit": 28.32863291589727
// { "xRelativ": 11043.727634444678, "yRelativ": 663.9667038330389, "zRelativ": 88.3051889940681, "zeit": 28.506460354460955 }
// { "xRelativ": 11119.006328411935, "yRelativ": 631.7585823372341, "zRelativ": 89.76652640827223, "zeit": 28.906818574224253 }
...
{ "xRelativ": 11499.121563240604, "yRelativ": 274.34404243874127, "zRelativ": 97.20466256494127, "zeit": 39.720062770644574 }
{ "xRelativ": 11499.266493362005, "yRelativ": 267.7249346365973, "zRelativ": 97.2069814590229, "zeit": 40.22006277064457 }
{ "xRelativ": 11499.362911009477, "yRelativ": 261.1076959097998, "zRelativ": 97.20832226297901, "zeit": 40.72006277064457 }
{ "xRelativ": 11499.42583300566, "yRelativ": 254.49226735111273, "zRelativ": 97.20898592381488, "zeit": 41.22006277064457 }
{ "xRelativ": 11499.465060791077, "yRelativ": 248.00000032681314, "zRelativ": 97.20918057242068, "zeit": 41.710891614207426 }
#endif // NEVER
/*
Approach Malte Diets, 2026-05-19
template <typename T> std::vector<std::vector<T>> getIndividualPaths(const std::vector<T> &flatTree)
{
if (flatTree.empty())
return {};
std::vector<std::vector<T>> allPaths;
std::vector<T> currentPath;
std::map<T, size_t> elementIndices;
for (const auto &element : flatTree)
{
auto it = elementIndices.find(element);
if (it != elementIndices.end())
{
allPaths.push_back(currentPath);
size_t splitIndex = it->second;
for (size_t i = splitIndex + 1; i < currentPath.size(); ++i)
elementIndices.erase(currentPath[i]);
currentPath.erase(currentPath.begin() + (splitIndex + 1), currentPath.end());
}
else
{
elementIndices[element] = currentPath.size();
currentPath.push_back(element);
}
}
if (!currentPath.empty())
allPaths.push_back(std::move(currentPath));
return allPaths;
}
*/
} // namespace AreaEffectSimulation
@@ -0,0 +1,211 @@
/**
* @RDE_HEADER@
* TrajectorySplitter
* $Id$
* $HeadURL$
* $Author$
* Created by Norbert Thoden, ESVG, 2026-04-10
*/
#pragma once
//#include <LtsCoordinate/ltscoordinate_export.h>
#include <Core/core.hpp>
#include <QVector>
namespace AreaEffectSimulation
{
// E01562-294: Falsche Darstellung Flugkurve SMArt
// At SMArt ADLER (or SAA?) generates a polyline which is "dividing":
// x x
// x x
// x x x
// x x x
// | Start | T1 | T2 (Target 1 & Target 2)
// Same diagram, but with order
// x4 x5
// x3 x6 (duplicate)
// x2 x7 x10
// x1 x8 x11
// x12
// The relativeTime step backward between x8 and x10.
//using TRAJECTORY_POINT_TYPE = Core::RelativePositionRelativeTime;
//using TRAJECTORY_TYPE = std::vector<Core::RelativePositionRelativeTime>;
//!
//! \brief The TrajectorySplitter class splits a combined/special vector into single trajectories.
//! See UnitTestTrajectorySplitter
//!
template<typename TRAJECTORY_TYPE>
class TrajectorySplitter
{
public:
// friend class UnitTestTrajectorySplitter;
explicit TrajectorySplitter(const TRAJECTORY_TYPE &trajectory)
: m_trajectory(trajectory)
{}
TRAJECTORY_TYPE getTrunk() const
{
if (!init())
{
return {};
}
TRAJECTORY_TYPE trunk(m_trajectory.begin(), m_trajectory.begin()+m_branchIndex);
return trunk;
}
TRAJECTORY_TYPE getBranch1() const
{
if (!init())
{
return {};
}
const int idx = findIndexOfEndOfFirstBranchInternal(m_trajectory);
const TRAJECTORY_TYPE branch1(m_trajectory.begin()+m_branchIndex, m_trajectory.begin()+idx+1);
return branch1;
}
TRAJECTORY_TYPE getBranch2() const
{
if (!init())
{
return {};
}
const int idx = findIndexOfEndOfFirstBranchInternal(m_trajectory);
const TRAJECTORY_TYPE branch2(m_trajectory.begin()+idx+1, m_trajectory.end());
return branch2;
}
TRAJECTORY_TYPE getTrajectory1() const
{
if (!init())
{
return {};
}
auto complete = getTrunk();
const auto &branch = getBranch1();
complete.insert(complete.end(), branch.begin(), branch.end());
return complete;
}
TRAJECTORY_TYPE getTrajectory2() const
{
if (!init())
{
return {};
}
auto complete = getTrunk();
const auto &branch = getBranch2();
complete.insert(complete.end(), branch.begin(), branch.end());
return complete;
}
size_t rawTrajectorySize() const { return m_trajectory.size(); }
protected:
static qint64 findDuplicateTimeInternal(const TRAJECTORY_TYPE &trajectory)
{
// extract relativeTimes, sort, find adjacent duplicates
QVector<qint64> relativeTimes;
relativeTimes.reserve(static_cast<int>(trajectory.size()));
for (const auto &posTimeAware : trajectory)
{
relativeTimes.append(posTimeAware.relativeTime());
}
std::sort(relativeTimes.begin(), relativeTimes.end());
auto it = std::adjacent_find(relativeTimes.begin(), relativeTimes.end());
if (it == relativeTimes.end())
{
return -1; // not found
}
const qint64 duplicateRelativeTime = *it;
return duplicateRelativeTime;
}
static int findDuplicateBranchIndexInternal(const TRAJECTORY_TYPE &trajectory)
{
const qint64 duplicateRelativeTime = findDuplicateTimeInternal(trajectory);
if (duplicateRelativeTime < 0)
{
return -1; // not found
}
// find first occurance:
int idx = 0;
{
for (const auto &posTimeAware : trajectory)
{
const qint64 currentTime = posTimeAware.relativeTime();
if (duplicateRelativeTime == currentTime)
{
break;
}
++idx;
} // for
}
return idx;
}
static int findIndexOfEndOfFirstBranchInternal(const TRAJECTORY_TYPE &trajectory)
{
int idx = -1;
{
qint64 currentTime = std::numeric_limits<qint64>::min();
for (const auto &posTimeAware : trajectory)
{
if (posTimeAware.relativeTime() < currentTime)
{
break;
}
currentTime = posTimeAware.relativeTime();
++idx;
} // for
}
return idx;
}
bool init() const
{
// already calculated?
if (m_branchIndex > 0)
{
return true;
}
// sanity check:
if (m_trajectory.size() < 3)
{
return false;
}
m_branchIndex = findDuplicateBranchIndexInternal(m_trajectory);
return (m_branchIndex >= 0);
}
private:
TRAJECTORY_TYPE m_trajectory;
mutable int m_branchIndex{0};
};
} // namespace AreaEffectSimulation