1<!DOCTYPE html> 2<html lang="en-US" data-dir="ltr" style="direction: ltr;" > 3<head> 4 <title>Ãbersicht | C++ Community</title> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <meta name="content-type" content="text/html; charset=UTF-8" /> 7 <meta name="apple-mobile-web-app-capable" content="yes" /> 8 <meta name="mobile-web-app-capable" content="yes" /> 9 <meta property="og:site_name" content="C++ Community" /> 10 <meta name="msapplication-badge" content="frequency=30; polling-uri=https://www.c-plusplus.net/forum/sitemap.xml" /> 11 <meta name="keywords" content="C++,Cpp,Forum,C#,C,C++/CLI,MFC,VCL,JavaScript,HTML,CSS,SQL,DB,Database,Qt,Boost,IT,Computer Science,CompSci,Informatik,Community,German,Deutsch,Programmiersprache,Code,Spiele,csharp,.Net,dotNet" /> 12 <meta name="msapplication-square150x150logo" content="/forum/assets/uploads/system/site-logo.png" /> 13 <meta name="title" content="C++ Community" /> 14 <meta property="og:type" content="website" /> 15 <meta property="og:title" content="C++ Community" /> 16 <meta property="og:url" content="https://www.c-plusplus.net/forum/" /> 17 <meta name="description" content="Deutsprachige C++ Community - Irgendwer hat immer eine Antwort" /> 18 <meta property="og:description" content="Deutsprachige C++ Community - Irgendwer hat immer eine Antwort" /> 19 <meta property="og:image" content="https://www.c-plusplus.net/forum/assets/uploads/system/og-image.png" /> 20 <meta property="og:image:width" content="600" /> 21 <meta property="og:image:height" content="600" /> 22 23 <link rel="stylesheet" type="text/css" href="/forum/assets/client.css?v=ab1pehoraso" /> 24 <link rel="icon" type="image/x-icon" href="/forum/assets/uploads/system/favicon.ico?v=ab1pehoraso" /> 25 <link rel="manifest" href="/forum/manifest.json" /> 26 <link rel="search" type="application/opensearchdescription+xml" title="C++ Community" href="/forum/osd.xml" /> 27 <link rel="apple-touch-icon" href="/forum/assets/uploads/system/touchicon-orig.png" /> 28 <link rel="icon" sizes="36x36" href="/forum/assets/uploads/system/touchicon-36.png" /> 29 <link rel="icon" sizes="48x48" href="/forum/assets/uploads/system/touchicon-48.png" /> 30 <link rel="icon" sizes="72x72" href="/forum/assets/uploads/system/touchicon-72.png" /> 31 <link rel="icon" sizes="96x96" href="/forum/assets/uploads/system/touchicon-96.png" /> 32 <link rel="icon" sizes="144x144" href="/forum/assets/uploads/system/touchicon-144.png" /> 33 <link rel="icon" sizes="192x192" href="/forum/assets/uploads/system/touchicon-192.png" /> 34 <link rel="prefetch" href="/forum/assets/src/modules/composer.js?v=ab1pehoraso" /> 35 <link rel="prefetch" href="/forum/assets/src/modules/composer/uploads.js?v=ab1pehoraso" /> 36 <link rel="prefetch" href="/forum/assets/src/modules/composer/drafts.js?v=ab1pehoraso" /> 37 <link rel="prefetch" href="/forum/assets/src/modules/composer/tags.js?v=ab1pehoraso" /> 38 <link rel="prefetch" href="/forum/assets/src/modules/composer/categoryList.js?v=ab1pehoraso" /> 39 <link rel="prefetch" href="/forum/assets/src/modules/composer/resize.js?v=ab1pehoraso" /> 40 <link rel="prefetch" href="/forum/assets/src/modules/composer/autocomplete.js?v=ab1pehoraso" /> 41 <link rel="prefetch" href="/forum/assets/templates/composer.tpl?v=ab1pehoraso" /> 42 <link rel="prefetch" href="/forum/assets/language/de/topic.json?v=ab1pehoraso" /> 43 <link rel="prefetch" href="/forum/assets/language/de/modules.json?v=ab1pehoraso" /> 44 <link rel="prefetch" href="/forum/assets/language/de/tags.json?v=ab1pehoraso" /> 45 <link rel="prefetch stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700" /> 46 <link rel="stylesheet" href="/forum/plugins/nodebb-plugin-emoji/emoji/styles.css?v=ab1pehoraso" /> 47 <link rel="prefetch stylesheet" href="/forum/plugins/nodebb-plugin-cppnet-markdown/styles/vs.css" /> 48 <link rel="prefetch" href="/forum/assets/src/modules/highlight.js?v=ab1pehoraso" /> 49 <link rel="prefetch" href="/forum/assets/language/de/markdown.json?v=ab1pehoraso" /> 50 51 52
52<script> 53 var RELATIVE_PATH = "/forum"; 54 var config = JSON.parse('{"relative_path":"/forum","upload_url":"/assets/uploads","siteTitle":"C++ Community","browserTitle":"C++ Community","titleLayout":"{pageTitle} | {browserTitle}","showSiteTitle":true,"minimumTitleLength":3,"maximumTitleLength":255,"minimumPostLength":2,"maximumPostLength":65536,"minimumTagsPerTopic":0,"maximumTagsPerTopic":5,"minimumTagLength":3,"maximumTagLength":15,"useOutgoingLinksPage":false,"allowGuestHandles":true,"allowFileUploads":false,"allowTopicsThumbnail":false,"usePagination":false,"disableChat":false,"disableChatMessageEditing":false,"maximumChatMessageLength":1000,"socketioTransports":["polling","websocket"],"socketioOrigins":"https://www.c-plusplus.net:*","websocketAddress":"","maxReconnectionAttempts":5,"reconnectionDelay":1500,"topicsPerPage":20,"postsPerPage":20,"maximumFileSize":2048,"theme:id":"nodebb-theme-persona","theme:src":"","defaultLang":"de","userLang":"en-US","loggedIn":false,"uid":-1,"cache-buster":"v=ab1pehoraso","requireEmailConfirmation":true,"topicPostSort":"oldest_to_newest","categoryTopicSort":"newest_to_oldest","csrf_token":false,"searchEnabled":true,"bootswatchSkin":"","enablePostHistory":true,"notificationAlertTimeout":5000,"timeagoCodes":["af","ar","az-short","az","bg","bs","ca","cs","cy","da","de-short","de","dv","el","en-short","en","es-short","es","et","eu","fa-short","fa","fi","fr-short","fr","gl","he","hr","hu","hy","id","is","it-short","it","ja","jv","ko","ky","lt","lv","mk","nl","no","pl","pt-br-short","pt-br","pt-short","pt","ro","rs","ru","rw","si","sk","sl","sr","sv","th","tr-short","tr","uk","uz","vi","zh-CN","zh-TW"],"timeagoCutoff":30,"cookies":{"enabled":false,"message":"[[global:cookies.message]]","dismiss":"[[global:cookies.accept]]","link":"[[global:cookies.learn_more]]"},"acpLang":"en-US","topicSearchEnabled":false,"composer-default":{},"hideSubCategories":false,"hideCategoryLastPost":false,"enableQuickReply":false,"markdown":{"highlight":1,"theme":"vs.css"},"gdpr":{"require":true,"given":false}}'); 55 var app = { 56 template: "categories", 57 user: JSON.parse('{"uid":0,"username":"Guest","userslug":"","fullname":"Guest","email":"","icon:text":"?","icon:bgColor":"#aaa","groupTitle":"","status":"offline","reputation":0,"email:confirmed":false,"postcount":0,"topiccount":0,"profileviews":0,"banned":0,"banned:expire":0,"joindate":0,"lastonline":0,"lastposttime":0,"followingCount":0,"followerCount":0,"picture":"","groupTitleArray":[],"joindateISO":"","lastonlineISO":"","banned_until":0,"banned_until_readable":"Not Banned","unreadData":{"":{},"new":{},"watched":{},"unreplied":{}},"isAdmin":false,"isGlobalMod":false,"isMod":false,"privileges":{"chat":false,"upload:post:image":false,"upload:post:file":false,"search:content":false,"search:users":false,"search:tags":false},"offline":true,"isEmailConfirmSent":false}') 58 }; 59 </script>
59 60 61 62 63</head> 64 65<body class="page-categories page-status-200 skin-noskin"> 66 <nav id="menu" class="slideout-menu hidden"> 67 <div class="menu-profile"> 68 69</div> 70 71<section class="menu-section" data-section="navigation"> 72 <h3 class="menu-section-title">Navigation</h3> 73 <ul class="menu-section-list"></ul> 74</section> 75 76 77 </nav> 78 <nav id="chats-menu" class="slideout-menu hidden"> 79 80 </nav> 81 82 <main id="panel" class="slideout-panel"> 83 <nav class="navbar navbar-default navbar-fixed-top header" id="header-menu" component="navbar"> 84 <div class="container"> 85 <div class="navbar-header"> 86 <button type="button" class="navbar-toggle pull-left" id="mobile-menu"> 87 <span component="notifications/icon" class="notification-icon fa fa-fw fa-bell-o unread-count" data-content="0"></span> 88 <i class="fa fa-lg fa-fw fa-bars"></i> 89 </button> 90 <button type="button" class="navbar-toggle hidden" id="mobile-chats"> 91 <span component="chat/icon" class="notification-icon fa fa-fw fa-comments unread-count" data-content="0"></span> 92 <i class="fa fa-lg fa-comment-o"></i> 93 </button> 94 95 96 <a href="/forum/"> 97 <img alt="cpp-logo" class=" forum-logo" src="/forum/assets/uploads/system/site-logo.png" /> 98 </a> 99 100 101 <a href="/forum/"> 102 <h1 class="navbar-brand forum-title">C++ Community</h1> 103 </a> 104 105 106 <div component="navbar/title" class="visible-xs hidden"> 107 <span></span> 108 </div> 109 </div> 110 111 <div id="nav-dropdown" class="hidden-xs"> 112 113 114 <ul id="logged-out-menu" class="nav navbar-nav navbar-right"> 115 116 <li> 117 <a href="/forum/register"> 118 <i class="fa fa-pencil fa-fw hidden-sm hidden-md hidden-lg"></i> 119 <span>Register</span> 120 </a> 121 </li> 122 123 <li> 124 <a href="/forum/login"> 125 <i class="fa fa-sign-in fa-fw hidden-sm hidden-md hidden-lg"></i> 126 <span>Login</span> 127 </a> 128 </li> 129 </ul> 130 131 132 <ul class="nav navbar-nav navbar-right"> 133 <li> 134 <form id="search-form" class="navbar-form navbar-right hidden-xs" role="search" method="GET"> 135 <button id="search-button" type="button" class="btn btn-link"><i class="fa fa-search fa-fw" title="Search"></i></button> 136 <div class="hidden" id="search-fields"> 137 <div class="form-group"> 138 <input type="text" class="form-control" placeholder="Search" name="query" value=""> 139 <a href="#"><i class="fa fa-gears fa-fw advanced-search-link"></i></a> 140 </div> 141 <button type="submit" class="btn btn-default hide">Search</button> 142 </div> 143 </form> 144 </li> 145 <li class="visible-xs" id="search-menu"> 146 <a href="/forum/search"> 147 <i class="fa fa-search fa-fw"></i> Search 148 </a> 149 </li> 150 </ul> 151 152 153 <ul class="nav navbar-nav navbar-right hidden-xs"> 154 <li> 155 <a href="#" id="reconnect" class="hide" title="Connection to C++ Community has been lost, attempting to reconnect..."> 156 <i class="fa fa-check"></i> 157 </a> 158 </li> 159 </ul> 160 161 <ul class="nav navbar-nav navbar-right pagination-block visible-lg visible-md"> 162 <li class="dropdown"> 163 <a><i class="fa fa-angle-double-up pointer fa-fw pagetop"></i></a> 164 <a><i class="fa fa-angle-up pointer fa-fw pageup"></i></a> 165 166 <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 167 <span class="pagination-text"></span> 168 </a> 169 170 <a><i class="fa fa-angle-down pointer fa-fw pagedown"></i></a> 171 <a><i class="fa fa-angle-double-down pointer fa-fw pagebottom"></i></a> 172 173 <div class="progress-container"> 174 <div class="progress-bar"></div> 175 </div> 176 177 <ul class="dropdown-menu" role="menu"> 178 <li> 179 <input type="text" class="form-control" id="indexInput" placeholder="Enter index"> 180 </li> 181 </ul> 182 </li> 183 </ul> 184 185 <ul id="main-nav" class="nav navbar-nav"> 186 187 188 <li class=""> 189 <a class="navigation-link" href="/forum/categories" title="Categories" > 190 191 <i class="fa fa-fw fa-list" data-content=""></i> 192 193 194 195 <span class="visible-xs-inline">Categories</span> 196 197 </a> 198 </li> 199 200 201 202 <li class=""> 203 <a class="navigation-link" href="/forum/recent" title="Recent" > 204 205 <i class="fa fa-fw fa-clock-o" data-content=""></i> 206 207 208 209 <span class="visible-xs-inline">Recent</span> 210 211 </a> 212 </li> 213 214 215 216 <li class=""> 217 <a class="navigation-link" href="/forum/tags" title="Tags" > 218 219 <i class="fa fa-fw fa-tags" data-content=""></i> 220 221 222 223 <span class="visible-xs-inline">Tags</span> 224 225 </a> 226 </li> 227 228 229 230 <li class=""> 231 <a class="navigation-link" href="/forum/popular" title="Popular" > 232 233 <i class="fa fa-fw fa-fire" data-content=""></i> 234 235 236 237 <span class="visible-xs-inline">Popular</span> 238 239 </a> 240 </li> 241 242 243 244 245 246 <li class=""> 247 <a class="navigation-link" href="/forum/groups" title="Groups" > 248 249 <i class="fa fa-fw fa-group" data-content=""></i> 250 251 252 253 <span class="visible-xs-inline">Groups</span> 254 255 </a> 256 </li> 257 258 259 </ul> 260 261 262 </div> 263 264 </div> 265 </nav> 266 <div class="container" id="content"> 267 <noscript> 268 <div class="alert alert-danger"> 269 <p>
270 Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you may not be able to execute some actions. 271 </p> 272 <p> 273 Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript). 274 </p> 275 </div> 276 </noscript> 277 278<div widget-area="header"> 279 280</div> 281<div class="row"> 282 <div class="col-lg-12"> 283 <h1 class="categories-title">Categories</h1> 284 <ul class="categories" itemscope itemtype="http://www.schema.org/ItemList"> 285 286 <li component="categories/category" data-cid="12" data-numRecentReplies="1" class="row clearfix"> 287 <meta itemprop="name" content="Ankündigungen"> 288 289 <div class="content col-xs-12 col-md-7 col-sm-9"> 290 <div class="icon pull-left" style="background-color: #edbb26; color: #fff;"> 291 <i class="fa fa-fw fa-bullhorn"></i> 292 </div> 293 294 <h2 class="title"> 295 296 297<a href="/forum/category/12/ankündigungen" itemprop="url"> 298 299Ankündigungen 300</a> 301 302 </h2> 303 <div> 304 305 306 <span class="category-children"><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #edbb26; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/59/die-artikel"><small>Die Artikel</small></a></span></span> 307 308 </div> 309 <span class="visible-xs pull-right"> 310 311 <a class="permalink" href="/forum/post/2623952"> 312 <small class="timeago" title="2025-06-08T20:30:54.836Z"></small> 313 </a> 314 315 </span> 316 </div> 317 318 319 <div class="col-md-1 hidden-sm hidden-xs stats"> 320 <span class="unread human-readable-number" title="102">102</span><br /> 321 <small>Topics</small> 322 </div> 323 <div class="col-md-1 hidden-sm hidden-xs stats"> 324 <span class="unread human-readable-number" title="1804">1804</span><br /> 325 <small>Posts</small> 326 </div> 327 328 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 329 <div class="card" style="border-color: #edbb26"> 330 331 332 <div component="category/posts"> 333 <p> 334 <a href="/forum/user/genxy"> 335 336 <span class="user-icon user-img" title="GenXy" style="background-color: #e91e63;">G</span> 337 338 </a> 339 <a class="permalink" href="/forum/topic/355319/aktuelle-forumprobleme-2025-06-06/14"> 340 <small class="timeago" title="2025-06-08T20:30:54.836Z"></small> 341 </a> 342 </p> 343 <div class="post-content"> 344 @Dravere Ok, dann ist die Sache vom Tisch. 345 346 </div> 347 </div> 348 349 350 351 352</div> 353 354 </div> 355 356 357</li> 358 359 360 <li component="categories/category" data-cid="33" data-numRecentReplies="1" class="row clearfix"> 361 <meta itemprop="name" content="C++ (alle ISO-Standards)"> 362 363 <div class="content col-xs-12 col-md-7 col-sm-9"> 364 <div class="icon pull-left" style="background-color: #1e8f5c; color: #f7f7f7;"> 365 <i class="fa fa-fw fa-gittip"></i> 366 </div> 367 368 <h2 class="title"> 369 370 371<a href="/forum/category/33/c-alle-iso-standards" itemprop="url"> 372 373C++ (alle ISO-Standards) 374</a> 375 376 </h2> 377 <div> 378 379 <div class="description"> 380 <p>Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!</p> 381 382 </div> 383 384 385 <span class="category-children"><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #198553; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/19/mfc"><small>MFC</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #659981; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/21/vcl-c-builder"><small>VCL (C++ Builder)</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #26704e; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/78/c-cli-mit-net"><small>C++/CLI mit .NET</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #21a366; color: #333;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/41/andere-guis-qt-gtk-wxwidgets"><small>Andere GUIs - Qt, GTK+, wxWidgets</small></a></span></span> 386 387 </div> 388 <span class="visible-xs pull-right"> 389 390 <a class="permalink" href="/forum/post/2625246"> 391 <small class="timeago" title="2026-09-24T20:00:02.716Z"></small> 392 </a> 393 394 </span> 395 </div> 396 397 398 <div class="col-md-1 hidden-sm hidden-xs stats"> 399 <span class="unread human-readable-number" title="129333">129333</span><br /> 400 <small>Topics</small> 401 </div> 402 <div class="col-md-1 hidden-sm hidden-xs stats"> 403 <span class="unread human-readable-number" title="948085">948085</span><br /> 404 <small>Posts</small> 405 </div> 406 407 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 408 <div class="card" style="border-color: #1e8f5c"> 409 410 411 <div component="category/posts"> 412 <p> 413 <a href="/forum/user/kahnsoft"> 414
415 <span class="user-icon user-img" title="KahnSoft" style="background-color: #f44336;">K</span> 416 417 </a> 418 <a class="permalink" href="/forum/topic/355496/rail-road-tycoon-mfc-in-action/6"> 419 <small class="timeago" title="2026-09-24T20:00:02.716Z"></small> 420 </a> 421 </p> 422 <div class="post-content"> 423 @Finnegan sagte in Rail Road Tycoon MFC in Action: 424 425way E 426 427Hey Finnegan, 428Das Projekt ist auch auf GitHub, https://github.com/KahnSoft/FlexxRail 429Hab da nicht ganz die MuÃe, mir den Code anzusehen 430Ja ist auch nur ein Fetzen, zeigt aber den Vorgang der Chunk -Generierung ohne Cracks untereinander, da spielt ein gewisses Micro Overlapping eine rolle, das am ende aber kein Brot frisst (+2 auf den sizes der Chunks) Es wird sonnst Abstrus Rechen lastig wenn man da keine Tricks anwendet, also alles ist immer ein Kompromiss zwischen best of und Perform. Wenn man da Hunderte Loks mit Anhängern anzeigt, braucht man jeden Rechenquant, solange kein Gameplay statt findet, muss ich immer 1Khz Framerate erreichen, sonnst ist es später vorbei, also minimalste Operationen mit bestmöglichen Ergebnis. 431die Berglandschaft in dem Video ist nicht unbedingt eine Heightmap-Geometrie sondern ein eventuell generischeres 3D-Modell 432Genau es ist keine Highmap es ist alles dynamisch mit der Perlin Noise erzeugtes Grid- dessen Höhenwerte vom Shader mit Texpixeln im shader Texturmischer belegt werden, ich erzeuge damit riesige Karten mit Kantenlängen von bis zu 1 Million Dreiecke Seitenlänge was riesig ist, die Loks fahren mit rund 145Kmh alles bereist authentisch proportional, und ich kann die Kamera auf eine Fahrende Lok aufschalten und diese verfolgen, die benötigt in diesem Affentempo rund 5 Minuten um eine Seitenlänge zu passieren. Eine Highmap dieser GröÃe sprengt den Speicherrahmen , es ist auch nicht gerade günstig eine Textur zu haben die 10000 Pixel Breit und Hoch ist. Man nennt das mit vielen Highmaps dann Content-Streaming DirectX SDK macht das vor, aber ich muss wie gesagt insgesamt die Performance erhalten , es können später tausende Objekte mit den Chunks und dem LodSystem so veraltet werden. Da bin ich auch froh drüber es ohne ContentStreaming und Ohne HighMaps gemacht zu haben, zumal nach der Highmap dann nochmal selbige ColorMap als Textur benötigt wird, alles wird also Dynamisch zur Laufzeit erzeugt, die Qualität ist natürlich nicht die einer ColorMap, aber sie ist apokalyptisch groÃ, es wird also keine 3D -Lok Simulation wo jedes Gauge im Kesselhaus zu sehen ist, das zerbricht die Welt der unendlichen Weiten , das wird der groÃe Vorteil gegenüber statischer Körperwelten. Also Aktienhandel Resourcenabbau alles Basiert auf Primitives, in einer erschlagenden Dimension. 433Nur die Ränder der "Szene", 434Genau keine Cracks in der Szene (NoGo) lediglich die Ränder haben eine Treppensignatur, aber die könnte ich wegrechnen ist aber unnötig out of SkyBox 435Parametrischen Kurven (Splines) meist eine Variable "Geschwindigkeit" haben. 436Da die Lok die Spline kennt (also die errechnet die selbst , es existieren real nur Kontrollpunkte) erzeugt sie für die Kurvigkeit eine Speed-Drossel die wirkt für Aufstieg bremsend für Abstieg Beschleunigend und für rechts links Radien Bremsend. 437void CSplineObjFollow::CalcSpeed() 438{ 439 const int dirSz = (int)m_DirN.size(); 440 if (m_SplineIdx < 0 || m_SplineIdx >= dirSz) 441 { 442 m_ConsecUphill = 0; 443 m_ConsecDownhill = 0; 444 m_ConsecCurve = 0; 445 m_UphillFlt *= 0.9f; 446 m_DownhillFlt *= 0.9f; 447 m_CurveFlt *= 0.9f; 448 m_LastSpeedFactor = 1.0f; 449 return; 450 } 451 452 // Calculate Slope directly 453 const float s = m_DirN[m_SplineIdx].z; 454 455 // Calculate Curvature directly 456 float avgCurv = 0.0f; 457 int curvSamples = 0; 458 const int splineSz = (int)m_Spline.size(); 459 460 if (splineSz >= 3) 461 { 462 const int maxCenter = splineSz - 2; 463 CVertex* splinePtr = m_Spline.data(); 464 int si, center; 465 float c; 466 467 for (si = 0; si < 3; ++si) 468 { 469 center = m_SplineIdx + si; 470 if (center < 1) center = 1; 471 else if (center > maxCenter) center = maxCenter; 472 473 c = Spline::LocalCurvature(splinePtr[center - 1], splinePtr[center], splinePtr[center + 1]); 474 if (c > 0.0f) { avgCurv += c; ++curvSamples; } 475 } 476 477 if (curvSamples) avgCurv /= (float)curvSamples; 478 } 479 480 const float absS = fabsf(s); 481 float factor = 1.0f; 482 483 if (absS > SFF_EFFECT_THR) 484 { 485 float eff = absS - SFF_EFFECT_THR; 486 if (s > 0.0f) // Bergauf: langsamer 487 { 488 if (eff > SFF_MAX_UP_EFF) eff = SFF_MAX_UP_EFF; 489 factor -= eff * m_UphillFlt; 490 } 491 else // Bergab: schneller 492 { 493 if (eff > 0.10f) eff = 0.10f; 494 factor += eff * m_DownhillFlt; 495 } 496 } 497 498 if (avgCurv > 1e-5f) ++m_ConsecCurve; else if (m_ConsecCurve > 0) --m_ConsecCurve; 499 500 const float invUp = 1.0f / (float)SFF_CONSEC_FULL_UP; 501 const float uphillTarget = (m_ConsecUphill > 0) ? (m_ConsecUphill * invUp) : 0.0f; 502 const float downhillTarget = (m_ConsecDownhill > 0) ? (m_ConsecDownhill * invUp) : 0.0f; 503 const float curveTarget = (avgCurv > 0.0f) ? (avgCurv / (avgCurv + 0.003f) * 1.5f) : 0.0f; 504 505 m_UphillFlt += (uphillTarget - m_UphillFlt) * ((uphillTarget > m_UphillFlt) ? SFF_RISE : SFF_DECAY); 506 m_CurveFlt += (curveTarget - m_CurveFlt) * ((curveTarget > m_CurveFlt) ? SFF_RISE : SFF_DECAY); 507 m_DownhillFlt += (downhillTarget - m_DownhillFlt) * ((downhillTarget > m_DownhillFlt) ? SFF_RISE : SFF_DECAY); 508 509 if (m_CurveFlt > 0.0f) // Kurven: langsamer 510 { 511 float tmp = 1.0f - SFF_CURVE_MAX_RED * (m_CurveFlt * (1.0f + 0.65f * m_CurveFlt) * (1.0f + 0.75f * m_
511CurveFlt)); 512 if (tmp < 0.1f) tmp = 0.1f; 513 factor *= tmp; 514 } 515 516 if (factor < 0.25f) factor = 0.25f; 517 else if (factor > 1.5f) factor = 1.5f; 518 519 const float smooth = (factor < m_LastSpeedFactor) ? SFF_SPEED_SMOOTH_DOWN : (SFF_SPEED_SMOOTH_UP / (1.0f + m_Speed * SFF_SPD_SMOOTH_SCL)); 520 m_LastSpeedFactor += (factor - m_LastSpeedFactor) * smooth; 521} 522 523void CSplineObjFollow::CalcSpeedA() 524{ 525 float factor = 1.0f; 526 const int dirSz = (int)m_DirN.size(); 527 528 if (dirSz >= 2 && m_SplineIdx >= 0) 529 { 530 float maxProxy = 0.0f; 531 const CVertex *dirPtr = m_DirN.data(); 532 533 for (int i = 0; i < 3; ++i) 534 { 535 int pidx = m_SplineIdx + i; 536 if (pidx < 1) pidx = 1; 537 else if (pidx >= dirSz) pidx = dirSz - 1; 538 539 int p0 = (pidx > 0) ? pidx - 1 : 0; 540 float d = dirPtr[p0].Dot(dirPtr[pidx]); 541 if (d > 1.0f) d = 1.0f; 542 else if (d < -1.0f) d = -1.0f; 543 544 float proxy = 1.0f - d; 545 if (proxy > maxProxy) maxProxy = proxy; 546 } 547 548 const float curveEffect = (maxProxy > 0.0f) ? (maxProxy / (maxProxy + 0.001f)) : 0.0f; 549 m_CurveFlt += (curveEffect - m_CurveFlt) * ((curveEffect > m_CurveFlt) ? SFF_RISE : SFF_DECAY); 550 factor = 1.0f - SFF_CURVE_MAX_RED * (curveEffect * (1.0f + 0.75f * m_
550CurveFlt)); 551 } 552 553 if (factor < 0.15f) factor = 0.15f; 554 else if (factor > 1.5f) factor = 1.5f; 555 556 float alpha = 0.20f + 0.55f * (1.0f - factor); 557 if (alpha > 1.0f) alpha = 1.0f; 558 if (factor < m_LastSpeedFactor) alpha = alpha * 0.9f + 0.5f * (1.0f - alpha); 559 560 m_LastSpeedFactor += (factor - m_LastSpeedFactor) * alpha; 561} 562 563Diese Verfolgung von Tracks wird also in separaten Threads berechnet, und für jede Lok durchlaufen, da gibt es nicht die geringsten Probleme mit der Render Geschwindigkeit , es wird also kein Normal benötigt um die Geschwindigkeit auf den Dynamischen Tracks zu erhalten, die allerdings über normal vektoren verfügen, jedoch nie von der Mechanik abgefragt werden, die Tracks haben auch eine Beschreibung über den sog. TrackFragmentGenerator: 564/* 565========================================================== 566TrackFragment Eigenschaften & Geometrie-Regelwerk 567========================================================== 568 5691) Grundstruktur (RNA1): 570 - Ein TrackFragment besteht aus mehreren Einzelteilen: Balast, Slicer (Schienen), Sleeper (Schwellen). 571 - Die Geometrie wird entlang einer Eingangsspline (VertexLst) erzeugt und verteilt. 572 - Jeder Einzelteiltyp hat eigene Parameter und Farben. 573 5742) Balast (RNA1): 575 - Wird als U-Profil ohne Boden generiert. 576 - Besteht aus Seitenwänden und Dach, keine Unterseite. 577 - Die Breite und Höhe sind abhängig vom MaÃstab (scale). 578 - Die Balast-Spline wird mit niedriger Dichte (Subsampling) erzeugt. 579 - Speicherbedarf steigt mit Dichte und Länge der Spline. 580 5813) Slicer (Schienen) (RNA1): 582 - Werden als U-Profile ohne Boden generiert. 583 - Bestehen aus Seitenwänden und Dach, keine Unterseite. 584 - Slicer sind schmaler und höher als der Balast. 585 - Es werden zwei Slicer erzeugt: linke und rechte Schiene, jeweils entlang der Spline versetzt. 586 - Slicer erhalten eine eigene Farbe für Seiten und Dach. 587 - Subsampling reduziert Speicher und Rechenlast. 588 5894) Sleeper (Schwellen) (RNA1): 590 - Werden als Quader erzeugt, keine U-Profile. 591 - Liegen quer zur Spline und verbinden die beiden Slicer. 592 - Die Platzierung erfolgt gleichmäÃig entlang der Spline, am Anfang, Ende und dazwischen. 593 - Sleeper erhalten eigene Farben für Seiten und Oberseite. 594 - Anzahl und Abstand beeinflussen die Komplexität. 595 5965) Geometrie-Erzeugung (RNA1): 597 - Die Methode GenerateVbo erzeugt die Einzelteile entlang der Spline. 598 - Für Balast und Slicer wird die Spline mit unterschiedlichen Schrittweiten abgetastet (Subsampling). 599 - Die Geometrie wird als Vertex-, Normal-, Color- und Index-Arrays für das VBO erzeugt. 600 - Datenfluss: Spline -> Sampling -> Einzelteil -> VBO. 601 6026) Farben und Materialien (RNA1): 603 - Jede Komponente (Balast, Slicer, Sleeper) erhält eigene Farben für Seiten und Dach/Oberseite. 604 - Die Farben werden beim Erzeugen der Vertices zugewiesen. 605 - Farbwechsel im Code beachten. 606 6077) VBO-Handling (RNA1): 608 - Die erzeugten Geometrien werden in einem VBOSet gespeichert. 609 - Nach der Erzeugung wird das VBO für die Darstellung vorbereitet. 610 - Speicherbedarf und Performance hängen von der Anzahl der Vertices und Indices ab. 611 6128) Besonderheiten (RNA1): 613 - Die Geometrie ist so ausgelegt, dass keine Bodenflächen für U-Profile entstehen. 614 - Die Verteilung und Ausrichtung der Einzelteile erfolgt dynamisch entlang der Eingangsspline. 615 - Fehlerquellen: Indizierung, Subsampling, falsche Parameter. 616 6179) Komplexitätsfaktoren (KI-relevant): 618 - Anzahl und Dichte der Einzelteile (Balast, Slicer, Sleeper). 619 - Länge und Form der Eingangsspline. 620 - Subsampling-Parameter und ProfilgröÃen. 621 - VBO-Speicherbedarf und Render-Performance. 622 - Korrekte Indizierung und Farbzuteilung. 623 - Robustheit gegen fehlerhafte Eingabedaten. 624 62510) Speicherverwaltung und Vektorzugriffe (RNA1): 626 - Alle Geometrie-Daten werden in std::vector gespeichert. 627 - Jeder push/remove/clear/erase-Aufruf ruft automatisch die Destruktoren der enthaltenen Objekte auf. 628 - Dadurch werden Ressourcen immer korrekt freigegeben. 629 - Speicherlecks sind ausgeschlossen, solange keine rohen Zeiger verwendet werden. 630 63111) LOD-Rendering für entfernte Fragmente (RNA1): 632 - Ab einer Entfernung von TRACK_LOD_DIST werden weniger Indices im VBO gezeichnet. 633 - Ein visueller Hinweis (z.B. "LOD aktiv") wird rechtsbündig am Fragment angezeigt. 634 - Die LOD-Distanz ist als TRACK_LOD_DIST im Code definiert. 635 636 LOD-Priorität (VBO-Reihenfolge, Index 0 = höchste Priorität): 637 +-------+------------------+---------------+---------------------------+ 638 | Phase | Komponente | LOD-Priorität | Beschreibung | 639 +-------+------------------+---------------+---------------------------+ 640 | 1 | Gauges | Höchste | Lichttafel (4 Lichter) | 641 | 1 | Dipper | Höchste | Signalflügel | 642 | 2 | Switch-Cube | Hoch | Weichen-Hitbox | 643 | 3 | Terminal | Hoch | Bahnsteig-Geometrie | 644 | 4 | Signal-Mast | Mittel | Stange + Sockel | 645 | 5 | Prellbock | Mittel | Buffer Stop | 646 | 6 | Ballast | Niedrig | Schotter (viele Faces) | 647 | 6 | Slicer | Niedrig | Schienen (viele Faces) | 648 | 6 | Sleeper | Niedrig | Schwellen (viele Faces) | 649 +-------+------------------+---------------+---------------------------+ 650 651 Bei LOD-Reduktion werden zuerst Sleeper/Slicer/Ballast weggelassen, 652 Gauges und Dipper bleiben bis zuletzt sichtbar. 653 65412) Switch-Cube für Weichen (RNA2): 655 - Wird nur bei TYPE_SWITCH_TRK erzeugt. 656 - Besteht aus einem Würfel (Cube) und einem Sockel (Pyramiden-Stumpf) neben dem Gleis am Ende der Spline. 657 - Position: Neben dem Balast in Fahrtrichtung, versetzt um die halbe Balast-Breite plus zusätzlichen Abstand. 658 - GröÃe: Würfel hat scale * 1.6f GröÃe, Sockel ist doppelt so breit. 659 - Farben: Würfel in Slicer-Farben (Grün=Open, Rot=Closed), Sockel in Balast-Farben. 660 - Zweck: Visuelle Darstellung von Weichen-Switches mit Statusanzeige (Ope
660n/Closed). 661 - Bounding Box: Separate m_SwitchBBoxMin/Max für Kollision oder Selektion. 662 66313) Signal-Mast für Weichen & Strecken (RNA3): 664 - Wird bei TYPE_SWITCH_TRK (automatisch) oder via SnapIn (manuell) erzeugt. 665 - Besteht aus mehreren Komponenten: 666 a) Sockel: Pyramiden-Stumpf auf Terrain-Höhe 667 b) Mast: Zwei vertikale Streben (Leiter-Stil) mit Sprossen 668 c) Kopfstück: Horizontaler Balken am oberen Ende 669 d) Ausleger: Horizontale Stäbe zur Seitenstabilisierung 670 e) Dipper: Beweglicher Signal-Flügel (Formsignal) 671 f) Gauge: Lichttafel mit 4 Signallichtern (Hp0/Hp1/Hp2) 672 - Position: 673 * Weichen: Automatisch in der Mitte der Spline. 674 * Strecken: An definierter SnapIn-Position (dotIdx). 675 - Dipper-Zustände: 676 * TYPE_SIGNAL_OPEN gesetzt: Dipper horizontal (Hp0 = Halt) 677 * TYPE_SIGNAL_OPEN nicht gesetzt: Dipper nach unten (Hp1 = Fahrt frei) 678 - Farben: Mast in Balast-Farben, Dipper rot mit weiÃer Füllung und Ring. 679 - Bounding Box: Separate m_SignalBoxes für Klick-Erkennung (umschlieÃt gesamten Mast). 680 - Debug-Anzeige: WeiÃe Box, roter Text "Hp0"/"Hp1". 681 - Lok-Steuerung: Signal-Status wird in SnapIn.flags gespeichert. 682 68314) Prellbock / Buffer Stop (RNA4): 684 - Wird automatisch bei TYPE_PILLER_TRK erzeugt (Track mit offenem Ende). 685 - Erkennung: forwardFragmentId == -1 ODER backwardFragmentId == -1. 686 - Position: Am Gleisende, versetzt um 3 * SLEEPER_PITCH nach hinten. 687 - Struktur: 688 a) Gleis-Extension: Echtes Gleis (Balast/Slicer/Sleeper) vom Ende bis zum Prellbock. 689 b) Schraege Stuetzen: 2x 45-Grad Hypotenuse (links/rechts auf Schienen). 690 c) Vertikale Kateten: 2x senkrechte Pfosten hinter den Stuetzen. 691 d) Querbalken oben: Horizontaler Balken zwischen den Kateten-Spitzen. 692 e) Querbalken unten: Horizontaler Balken am Fuss der Stuetzen. 693 - Doppelgleis: 2 separate Prellboecke mit Gleisabstand versetzt. 694 - Verkehrsvertrag: Am Prellbock dreht nur die Fahrtrichtung der Lok. Ihre 695 m_TrackSide bleibt unveraendert; der seitliche Render-Offset wird gespiegelt. 696 Bei einem Doppelgleis-Hostwechsel wird zusaetzlich die Weltposition fuer 697 die Seitenkontinuitaet ausgewertet, damit Weichen keinen Spurwechsel erzeugen. 698 - Farben: Stuetzen grau, Querbalken in Sleeper-Farben. 699 - Rekursionsschutz: TYPE_PILLER_TRK wird fuer Extension-Spline entfernt. 700 70115) Terminal / Bahnsteig (RNA5): 702 - Länge basiert auf Zuglänge: TERMINAL_WAGON_LEN à TERMINAL_MAX_WAGONS = 15000 units 703 - 1 Waggon/Lok = 1500 units, Max 10 Waggons am Bahnsteig 704 - Z-Ebene: Einheitliche Höhe (Mittelwert aller Dots) - keine Wellen! 705 - Zwei Signale (A + B) an den Enden für Face-to-Face Steuerung. 706 - Dynamische Verkürzung wenn Track zu kurz ist. 707 70816) Verkehr & Fahrplaner (RNA6): 709 - Die Basis-Verkehrslogik ist aktiv: physische Doppelgleis-Seiten, 710 Bremsen und Disaster-Erkennung laufen in GLSceneTraffic. 711 - Ein globaler Fahrplaner/Scheduler über dieser Basis bleibt geplant. 712 - Er nutzt RNA1-5 (Gleise, Weichen, Signale, Prellboecke, Terminals) 713 fuer Zeitsteuerung und Automatisierung von Weichen/Signalen. 714*/ 715 716 717nicht in jedem Frame machen. Die Geometrie der Lok und Waggons bedingt ja einen minimalen Krümmungsradius. 718Tatsächlich wird es sogar öfters berechnet als pro jedem Frame, das geht mit bis zu 20 tausend Iterationen also 20Khz 719in den Threads, die Loks fahren seidig und extrem Pixel genau auf den Gleiskörpern. 720Durch die Translationen für die Lok -Mesh Körper werden diese exact an der Spline geführt dazu wird für die Loks eine Pivot-Translation verwendet: 721void CGLmatrix::TranslatePivotXYZTrack(const CVertex& world, CVertex& pivot, const CVertex& forward, const CVertex& right, const CVertex& up) 722{ 723 float* m = m_m0; 724 725 // Snapshot original orientation (R0) and translation (t0) 726 const float r0x = m[0], r0y = m[1], r0z = m[2]; 727 const float r1x = m[4], r1y = m[5], r1z = m[6]; 728 const float r2x = m[8], r2y = m[9], r2z = m[10]; 729 float tx = m[12], ty = m[13], tz = m[14]; 730 731 // Phase 1: t1 = t0 + R0 * (world + pivot) 732 const float v0x = world.x + pivot.x; 733 const float v0y = world.y + pivot.y; 734 const float v0z = world.z + pivot.z; 735 tx += r0x * v0x + r1x * v0y + r2x * v0z; 736 ty += r0y * v0x + r1y * v0y + r2y * v0z; 737 tz += r0z * v0x + r1z * v0y + r2z * v0z; 738 739 // Phase 2: DIREKTE Matrix-Orientierung aus Spline-Basis (statt Euler-Rotation) 740 // R' = R0 * SplineBasis (Forward, Right, Up direkt verwenden) 741 m[0] = r0x * forward.x + r1x * forward.y + r2x * forward.z; 742 m[1] = r0y * forward.x + r1y * forward.y + r2y * forward.z; 743 m[2] = r0z * forward.x + r1z * forward.y + r2z * forward.z; 744 745 m[4] = r0x * right.x + r1x * right.y + r2x * right.z; 746 m[5] = r0y * right.x + r1y * right.y + r2y * right.z; 747 m[6] = r0z * right.x + r1z * right.y + r2z * right.z; 748 749 m[8] = r0x * up.x + r1x * up.y + r2x * up.z; 750 m[9] = r0y * up.x + r1y * up.y + r2y * up.z; 751 m[10] = r0z * up.x + r1z * up.y + r2z * up.z; 752 753 // Phase 3: t' = t1 + R' * (-pivot) 754 tx += m[0] * (-pivot.x) + m[4] * (-pivot.y) + m[8] * (-pivot.z); 755 ty += m[1] * (-pivot.x) + m[5] * (-pivot.y) + m[9] * (-pivot.z); 756 tz += m[2] * (-pivot.x) + m[6] * (-pivot.y) + m[10] * (-pivot.z); 757 m[12] = tx; m[13] = ty; m[14] = tz; // keep m[15] as is 758} 759 760 761Und für normale nicht dem Track folgender Objekte eine Pivot normale Translation (Beides Teil der GL Engine wo jede Matrix wenn sie fertig im Speicher liegt nur einmal per Frame an GL gesendet wird was zu wahnsinnigen Ablaufraten führt: 762void CGLmatrix::TranslatePivotXYZ(const CVertex& world, CVertex& pivot, const CVertex& rot) 763{ 764 float* m = m_m0; 765 766 // Snapshot original orientation (R0) and translation (t0) 767 const float r0x = m[0], r0y = m[1], r0z = m[2]; 768 const float r1x = m[4], r1y = m[5], r1z = m[6]; 769 const float r2x = m[8], r2y = m[9], r2z = m[10]; 770 float tx = m[12], ty = m[13], tz = m[14]; 771 772 // Phase 1: t1 = t0 + R0 * (world + pivot) 773 const float v0x = world.x + pivot.x; 774 const float v0y = world.y + pivot.y; 775 const float v0z = world.z + pivot.z; 776 tx += r0x * v0x + r1x * v0y + r2x * v0z; 777 ty += r0y * v0x + r1y * v0y + r2y * v0z; 778 tz += r0z * v0x + r1z * v0y + r2z * v0z; 779 780 // Phase 2: R' = R0 * R(rot) â RotXYZ(rot) on the basis columns 781 const float cX = CCalculate::LutCos(rot.x); const float sX = CCalculate::LutSin(rot.x); 782 const float cY = CCalculate::LutCos(rot.y); const float sY = CCalculate::LutSin(rot.y); 783 const float cZ = CCalculate::LutCos(rot.z); const float sZ = CCalculate::LutSin(rot.z); 784 785 // Start from current m (R0) and apply X, then Y, then Z exactly like RotXYZ 786 float x0, y0, z0, x1, y1, z1, x2, y2, z2; 787 // X-axis 788 x0 = m[0]; y0 = m[1]; z0 = m[2]; 789 x1 = m[4] * cX + m[8] * sX; y1 = m[5] * cX + m[9] * sX; z1 = m[6] * cX + m[10] * sX; 790 x2 = m[4] * -sX + m[8] * cX; y2 = m[5] * -sX + m[9] * cX; z2 = m[6] * -sX + m[10] * cX; 791 792 m[0] = x0; m[1] = y0; m[2] = z0; 793 m[4] = x1; m[5] = y1; m[6] = z1; 794 m[8] = x2; m[9] = y2; m[10] = z2; 795 796 // Y-axis 797 x0 = m[0] * cY + m[8] * -sY; y0 = m[1] * cY + m[9] * -sY; z0 = m[2] * cY + m[10] * -sY; 798 x1 = m[4]; y1 = m[5]; z1 = m[6]; 799 x2 = m[0] * sY + m[8] * cY; y2 = m[1] * sY + m[9] * cY; z2 = m[2] * sY + m[10] * cY; 800 801 m[0] = x0; m[1] = y0; m[2] = z0; 802 m[4] = x1; m[5] = y1; m[6] = z1; 803 m[8] = x2; m[9] = y2; m[10] = z2; 804 805 // Z-axis 806 x0 = m[0] * cZ + m[4] * sZ; y0 = m[1] * cZ + m[5] * sZ; z0 = m[2] * cZ + m[6] * sZ; 807 x1 = m[0] * -sZ + m[4] * cZ; y1 = m[1] * -sZ + m[5] * cZ; z1 = m[2] * -sZ + m[6] * cZ; 808 x2 = m[8]; y2 = m[9]; z2 = m[10]; 809 810 m[0] = x0; m[1] = y0; m[2] = z0; 811 m[4] = x1; m[5] = y1; m[6] = z1; 812 m[8] = x2; m[9] = y2; m[10] = z2; 813 814 // Phase 3: t' = t1 + R' * (-pivot) 815 tx += m[0] * (-pivot.x) + m[4] * (-pivot.y) + m[8] * (-pivot.z); 816 ty += m[1] * (-pivot.x) + m[5] * (-pivot.y) + m[9] * (-pivot.z); 817 tz += m[2] * (-pivot.x) + m[6] * (-pivot.y) + m[10] * (-pivot.z); 818 m[12] = tx; m[13] = ty; m[14] = tz; // keep m[15] as is 819} 820 821einfacher sein könnte, dem User das Feintuning zu überlassen 822Der braucht ein klares Spielerlebnis , das da beim gleise Legen irgendwelche Kapriolen passieren soll der nicht handhaben, 823es spielen ja auch viele Kinder oder bei groÃen Gleisanlagen währ es zu frikelig, der Editor unterstellt dem User ganz klare Edit Regeln die unbedingt von der Software sichergestellt werden müssen so wie bei einem CAD Programm. 82450 Spieler "MMO" ist schon nen hartes Ziel. 825Auf jeden Fall, die können sogar Server mieten und ihr eigenes Terrain (Ressourcen) über Tunnels an das Maingrid anschlieÃen, das läuft dann aber über Linux auf Mietservern, das Thema alleine sprengt schnell den Rahmen da muss man aufpassen, es beginnt in kürze mit der Fahrplan Erstellung und dem Zug-Roster der die Wagongs koppelt(folge Jahr) . Sicher kommen dort Hacker und Einkreiser usw. muss man sehen das sich das selber verwaltet. UDP SSL Kodierter Transfer mal sehen das ist noch ein Weilchen hin. Aber die Kommunikation ist im Prinzip klar, läuft dann zuerst auf ner VM am Nebentisch... 826Viel Erfolg damit! Ich glaub da gibts auch sicher einige Foren und Communities für derartige Spiele. 827Na erstmal noch nicht , in dem Zustand interessiert das nur Experten, es gibt ja noch kein Game, in Foren habe ich bis heute noch keinen gehört dem das gefällt Da bist Du der erste mit dem ich drüber Chatten kann 828Das OpenTTD ist eine andere Liga, da will ich nicht hin, ich mache ein ganz spezielles Railroad wo der User Signale weichen Bahnhöfe auch über Lua -Skript kontrollieren kann, also Stichwort alles ist volldynamisch und generisch. 829Ego-Perspektive (Lokführer) 830Genau ich habe einen Gleistracker der mit der Kamera alle bestehnden Gleise abfährt (Neben der Zugverfolgung) Das jetzt schon ein Wahnsinns ScreenBlanker ! 831Danke für deine Aufmerksamkeit 832Ich berichte mal immer gerne über solche Sachen 833Gruà Karsten 834 835 </div> 836 </div> 837 838 839 840 841</div> 842 843 </div> 844 845 846</li> 847 848 849 <li component="categories/category" data-cid="30" data-numRecentReplies="1" class="row clearfix"> 850 <meta itemprop="name" content="Sonstige Programmiersprachen"> 851
852 <div class="content col-xs-12 col-md-7 col-sm-9"> 853 <div class="icon pull-left" style="background-color: #7cafc2; color: #ffffff;"> 854 <i class="fa fa-fw fa-support"></i> 855 </div> 856 857 <h2 class="title"> 858 859 860<a href="/forum/category/30/sonstige-programmiersprachen" itemprop="url"> 861 862Sonstige Programmiersprachen 863</a> 864 865 </h2> 866 <div> 867 868 <div class="description"> 869 <p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.</p> 870 871 </div> 872 873 874 <span class="category-children"><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #3987a3; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/25/c-alle-iso-standards"><small>C (alle ISO-Standards)</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #57a5c2; color: #333;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/29/c-und-net"><small>C# und .NET</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #678f9e; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/60/java"><small>Java</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #0da0d6; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/23/assembler"><small>Assembler</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #477c8f; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/40/webzeugs"><small>Webzeugs</small></a></span></span> 875 876 </div> 877 <span class="visible-xs pull-right"> 878 879 <a class="permalink" href="/forum/post/2625249"> 880 <small class="timeago" title="2026-09-25T01:24:21.244Z"></small> 881 </a> 882 883 </span> 884 </div> 885 886 887 <div class="col-md-1 hidden-sm hidden-xs stats"> 888 <span class="unread human-readable-number" title="58253">58253</span><br /> 889 <small>Topics</small> 890 </div> 891 <div class="col-md-1 hidden-sm hidden-xs stats"> 892 <span class="unread human-readable-number" title="463478">463478</span><br /> 893 <small>Posts</small> 894 </div> 895 896 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 897 <div class="card" style="border-color: #7cafc2"> 898 899 900 <div component="category/posts"> 901 <p> 902 <a href="/forum/user/anon-81275"> 903 904 <span class="user-icon user-img" title="Anon-81275" style="background-color: #3f51b5;">A</span> 905 906 </a> 907 <a class="permalink" href="/forum/topic/355495/den-polygonschwerpunkt-von-roten-linien-in-einem-png-bild-mittels-javascript-rekonstruieren-und-die-genauen-koordinaten-ermitteln/10"> 908 <small class="timeago" title="2026-09-25T01:24:21.244Z"></small> 909 </a> 910 </p> 911 <div class="post-content"> 912 @Anon-81275 sagte in Den Polygonschwerpunkt von roten Linien in einem PNG-Bild mittels JavaScript rekonstruieren und die genauen Koordinaten ermitteln?: 913 914private static double normalizeAngle(double angle) { 915while (angle < 0) { 916angle += Math.PI; 917} 918while (angle >= Math.PI) { 919angle -= Math.PI; 920} 921return angle; 922} 923 924Leider ist diese Methode nicht ganz SpotBugs-konform... 925 926M C FL: Using floating-point loop counters can lead to unexpected behavior. At MapPolygon.java:[line 644] 927 928... Deshalb: 929 private static double normalizeAngle(double angle) { 930 double normalizedAngle = angle % Math.PI; 931 return normalizedAngle < 0 ? normalizedAngle + Math.PI : normalizedAngle; 932 } 933 934 935 </div> 936 </div> 937 938 939 940 941</div> 942 943 </div> 944 945 946</li> 947 948 949 <li component="categories/category" data-cid="5" data-numRecentReplies="1" class="row clearfix"> 950 <meta itemprop="name" content="Betriebssysteme"> 951 952 <div class="content col-xs-12 col-md-7 col-sm-9"> 953 <div class="icon pull-left" style="background-color: #2722d1; color: #ffffff;"> 954 <i class="fa fa-fw fa-linux"></i> 955 </div> 956 957 <h2 class="title"> 958 959 960<a href="/forum/category/5/betriebssysteme" itemprop="url"> 961 962Betriebssysteme 963</a> 964 965 </h2> 966 <div> 967 968 <div class="description"> 969 <p>Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.</p> 970 971 </div> 972 973 974 <span class="category-children"><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #1c1aad; color: #333;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/27/winapi"><small>WinAPI</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #423fcc; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/47/linux-unix"><small>Linux/Unix</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #2320e3; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/48/projekt-os-development"><small>Projekt: OS-Development </small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #1d1b7d; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/55/dos-und-win32-konsole-nur-lesen"><small>DOS und Win32-Konsole (nur Lesen)</small></a></span></span> 975 976 </div> 977 <span class="visible-xs pull-right"> 978 979 <a class="permalink" href="/forum/post/2625248"> 980 <small class="timeago" title="2026-09-24T20:26:36.691Z"></small> 981 </a> 982 983 </span> 984 </div> 985 986 987 <div class="col-md-1 hidden-sm hidden-xs stats"> 988 <span class="unread human-readable-number" title="35309">35309</span><br /> 989 <small>Topics</small> 990 </div> 991 <div class="col-md-1 hidden-sm hidden-xs stats"> 992 <span class="unread human-readable-number" title="238355">238355</span><br /> 993 <small>Posts</small> 994 </div> 995 996 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 997 <div class="card" style="border-color: #2722d1"> 998 999 1000 <div component="category/posts"> 1001 <p> 1002 <a href="/forum/user/lorenparker"> 1003
1004 <span class="user-icon user-img" title="LorenParker" style="background-color: #2196f3;">L</span> 1005 1006 </a> 1007 <a class="permalink" href="/forum/topic/355330/ncursesw-und-der-datentyp-cchar_t/2"> 1008 <small class="timeago" title="2026-09-24T20:26:36.691Z"></small> 1009 </a> 1010 </p> 1011 <div class="post-content"> 1012 1013Wenn man sich den Datentyp cchar_t anschaut, dann steht dazu in den ncurses man pages, dass er mehr als ein non spacing character enthalten darf. Weià jemand, ob die fünf wchar_t, die man in der ncursesw Library gewählt irgend einer Definition aus Unicode entstammen, oder ist das eine mehr oder minder willkürlich gewählte Implementationsdefinition? 1014Gibt es eine Möglichkeit auf einfache Art und Weise abzuleiten, ob ein Zeichen half oder full Size ist (sprich ob es ein klassisches ASCII Zeichen in einem Terminal belegt oder deren zwei)? 1015 1016Die fünf wchar_t in cchar_t sind meines Wissens keine Unicode-Vorgabe, sondern eine Implementationsentscheidung von ncurses. Unicode schreibt nicht vor, wie viele Combining Characters eine Zelle maximal puffern muss. Entscheidend ist eher, dass ein Base Character zusammen mit seinen Nonspacing Marks dargestellt werden kann; die Begrenzung auf fünf ist also eine praktische interne Grenze. 1017Für die Breite würde ich nicht selbst anhand der Unicode-Codepoints zwischen âhalfâ und âfullâ unterscheiden. Dafür gibt es wcwidth() bzw. wcswidth(). wcwidth() liefert typischerweise 0 für Combining Characters, 1 für normale Zeichen und 2 für Wide Characters. Allerdings hängt das Ergebnis auch von Locale und Unicode-/Terminal-Unterstützung ab. AuÃerdem ist die tatsächliche Darstellung letztlich Sache des Terminals, weshalb wcwidth() nicht in jedem exotischen Fall exakt das Verhalten des Terminals vorhersagen kann. 1018 1019 </div> 1020 </div> 1021 1022 1023 1024 1025</div> 1026 1027 </div> 1028 1029 1030</li> 1031 1032 1033 <li component="categories/category" data-cid="6" data-numRecentReplies="1" class="row clearfix"> 1034 <meta itemprop="name" content="Weitere Fachbereiche"> 1035 1036 <div class="content col-xs-12 col-md-7 col-sm-9"> 1037 <div class="icon pull-left" style="background-color: #a78ab8; color: #fff;"> 1038 <i class="fa fa-fw fa-commenting-o"></i> 1039 </div> 1040 1041 <h2 class="title"> 1042 1043 1044<a href="/forum/category/6/weitere-fachbereiche" itemprop="url"> 1045 1046Weitere Fachbereiche 1047</a> 1048 1049 </h2> 1050 <div> 1051 1052 1053 <span class="category-children"><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #9462b3; color: #333;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/42/mathematik-und-physik"><small>Mathematik und Physik</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #877294; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/53/spiele-grafikprogrammierung"><small>Spiele-/Grafikprogrammierung</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #b273d9; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/69/datenbanken"><small>Datenbanken</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #ab97b8; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/34/compiler-und-ide-forum"><small>Compiler- und IDE-Forum</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #8e42bd; color: #333;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/20/projekte"><small>Projekte</small></a></span></span> 1054 1055 </div> 1056 <span class="visible-xs pull-right"> 1057 1058 <a class="permalink" href="/forum/post/2625168"> 1059 <small class="timeago" title="2026-08-29T11:52:05.572Z"></small> 1060 </a> 1061 1062 </span> 1063 </div> 1064 1065 1066 <div class="col-md-1 hidden-sm hidden-xs stats"> 1067 <span class="unread human-readable-number" title="28395">28395</span><br /> 1068 <small>Topics</small> 1069 </div> 1070 <div class="col-md-1 hidden-sm hidden-xs stats"> 1071 <span class="unread human-readable-number" title="208969">208969</span><br /> 1072 <small>Posts</small> 1073 </div> 1074 1075 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 1076 <div class="card" style="border-color: #a78ab8"> 1077 1078 1079 <div component="category/posts"> 1080 <p> 1081 <a href="/forum/user/jorisclausen"> 1082
1083 <span class="user-icon user-img" title="JorisClausen" style="background-color: #9c27b0;">J</span> 1084 1085 </a> 1086 <a class="permalink" href="/forum/topic/355488/was-ist-eine-falte/9"> 1087 <small class="timeago" title="2026-08-29T11:52:05.572Z"></small> 1088 </a> 1089 </p> 1090 <div class="post-content"> 1091 Ja, genau das Beispiel zeigt eigentlich ganz schön, warum âFalte = unstetige Ableitungâ nicht passen kann. Bei einer Falte geht es eher um die Geometrie bzw. darum, dass die Abbildung lokal zwei Bereiche so zusammenführt, dass eine Knicklinie entsteht. Die Ableitung kann dabei durchaus stetig sein â entscheidend ist nicht einfach ein Knick im Graphen, sondern wie die Abbildung die Fläche bzw. den Raum faltet. Das Beispiel aus dem Buch ist dafür ziemlich lehrreich. Letztens musste ich beim langen Mathe-Lernen im kalten Zimmer übrigens an meine warmen Herren-Unterhosen für den Winter denken, weil man bei solchen mathematischen Herleitungen echt schnell friert, wenn man stundenlang am Schreibtisch sitzt und grübelt. 1092 1093 </div> 1094 </div> 1095 1096 1097 1098 1099</div> 1100 1101 </div> 1102 1103 1104</li> 1105 1106 1107 <li component="categories/category" data-cid="72" data-numRecentReplies="1" class="row clearfix"> 1108 <meta itemprop="name" content="Jenseits der Programmierung"> 1109 1110 <div class="content col-xs-12 col-md-7 col-sm-9"> 1111 <div class="icon pull-left" style="background-color: #949494; color: #fff;"> 1112 <i class="fa fa-fw fa-comments-o"></i> 1113 </div> 1114 1115 <h2 class="title"> 1116 1117 1118<a href="/forum/category/72/jenseits-der-programmierung" itemprop="url"> 1119 1120Jenseits der Programmierung 1121</a> 1122 1123 </h2> 1124 <div> 1125 1126 <div class="description"> 1127 <p>Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.</p> 1128 1129 </div> 1130 1131 1132 <span class="category-children"><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #a1a1a1; color: #a1a1a1;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/74/beruf-und-ausbildung"><small>Beruf und Ausbildung</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #7a7a7a; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/58/stellenangebote"><small>Stellenangebote</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #bdbdbd; color: #333;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/77/themen-rund-um-die-it"><small>Themen rund um die IT</small></a></span><span class="category-children-item pull-left"><div class="icon pull-left" style="background-color: #575757; color: #fff;"><i class="fa fa-fw hidden"></i></div><a href="/forum/category/70/gaming-corner"><small>Gaming-Corner</small></a></span></span> 1133 1134 </div> 1135 <span class="visible-xs pull-right"> 1136 1137 <a class="permalink" href="/forum/post/2625254"> 1138 <small class="timeago" title="2026-09-25T13:18:53.607Z"></small> 1139 </a> 1140 1141 </span> 1142 </div> 1143 1144 1145 <div class="col-md-1 hidden-sm hidden-xs stats"> 1146 <span class="unread human-readable-number" title="31151">31151</span><br /> 1147 <small>Topics</small> 1148 </div> 1149 <div class="col-md-1 hidden-sm hidden-xs stats"> 1150 <span class="unread human-readable-number" title="414724">414724</span><br /> 1151 <small>Posts</small> 1152 </div> 1153 1154 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 1155 <div class="card" style="border-color: #949494"> 1156 1157 1158 <div component="category/posts"> 1159 <p> 1160 <a href="/forum/user/seppj"> 1161 1162 <img class="user-img" title="SeppJ" alt="SeppJ" src="/forum/assets/uploads/profile/19375-profileavatar.png"> 1163 1164 </a> 1165 <a class="permalink" href="/forum/topic/355420/pro-contra-ki-eigene-erfahrungen/39"> 1166 <small class="timeago" title="2026-09-25T13:18:53.607Z"></small> 1167 </a> 1168 </p> 1169 <div class="post-content"> 1170 Meine Erfahrung mit aktuellen Premiummodellen ist immer noch, dass man ihnen selbstständig bloà Juniorentwickleraufgaben geben kann, wo man dann hinterher auch nochmals gründlich drübergucken muss. Dabei wird es immer schwieriger die Fehler zu finden, aber es sind immer noc
1170h zu häufig grobe Böcke drin, als dass ich dem ungesehen vertrauen würde. Und halt stets so zuversichtlich, wo dann am Code kommentiert ist, was das machen soll, aber erst wenn man 3x guckt, merkt man, das stimmt gar nicht. Das ist dann besonders gefährlich, weil man nicht bloà querlesen kann, ob etwas sinnvoll aussieht, sondern man muss es wirklich komplett durchdenken, ob das stimmt. Wenn man dann auf die Fehler zeigt, tendieren sie auch dazu, Dinge kaputt zu reparieren. Das ist dann vergleichbar viel Aufwand wie selber schreiben. 1171Umgekehrt ist es hingegen höchst nützlich, wenn man sie benutzt, um den eigenen Code zu kritisieren. Da kann man dann ja schnell beurteilen, ob ein Einwand gerechtfertigt ist oder ob ein Verbesserungsvorschlag wirklich besser ist. Da bekommt man schneller viel mehr nützliche Vorschläge und Einwände als selbst der kritischte Reviewer einem geben könnte. Wenn davon dann nicht alle gerechtfertigt sind, ist das ja nicht weiter schlimm, man muss sie ja nicht umsetzen. Das finde ich schon sehr hilfreich und will ich nicht mehr vermissen. 1172Was auch geht sind FleiÃaufgaben so a la "Mit diesem (von mir geschriebenen) Test als Vorbild schreibe weitere Tests für folgende Szenarien [...] und mach Vorschläge für was noch fehlen könnte"
1172. Muss man auch nochmal draufgucken, aber da ist es dann auch nicht so kritisch, und die Chancen, dass es falsch ist, sind kleiner. 1173 1174 </div> 1175 </div> 1176 1177 1178 1179 1180</div> 1181 1182 </div> 1183 1184 1185</li> 1186 1187 1188 <li component="categories/category" data-cid="35" data-numRecentReplies="1" class="row clearfix"> 1189 <meta itemprop="name" content="Forentechnik"> 1190 1191 <div class="content col-xs-12 col-md-7 col-sm-9"> 1192 <div class="icon pull-left" style="background-color: #f7ca88; color: #333333;"> 1193 <i class="fa fa-fw fa-cogs"></i> 1194 </div> 1195 1196 <h2 class="title"> 1197 1198 1199<a href="/forum/category/35/forentechnik" itemprop="url"> 1200 1201Forentechnik 1202</a> 1203 1204 </h2> 1205 <div> 1206 1207 <div class="description"> 1208 <p>Hier kann man über die neue Forumsoftware diskutieren.<br /> 1209Kritik, Lob, Probleme, Lösungen usw.</p> 1210 1211 </div> 1212 1213 1214 1215 1216 </div> 1217 <span class="visible-xs pull-right"> 1218 1219 <a class="permalink" href="/forum/post/2625111"> 1220 <small class="timeago" title="2026-08-19T14:23:29.522Z"></small> 1221 </a> 1222 1223 </span> 1224 </div> 1225 1226 1227 <div class="col-md-1 hidden-sm hidden-xs stats"> 1228 <span class="unread human-readable-number" title="1750">1750</span><br /> 1229 <small>Topics</small> 1230 </div> 1231 <div class="col-md-1 hidden-sm hidden-xs stats"> 1232 <span class="unread human-readable-number" title="15005">15005</span><br /> 1233 <small>Posts</small> 1234 </div> 1235 1236 <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser"> 1237 <div class="card" style="border-color: #f7ca88"> 1238 1239 1240 <div component="category/posts"> 1241 <p> 1242 <a href="/forum/user/anon-81275"> 1243 1244 <span class="user-icon user-img" title="Anon-81275" style="background-color: #3f51b5;">A</span> 1245 1246 </a> 1247 <a class="permalink" href="/forum/topic/355486/ab-wann-kann-man-postings-bewerten/25"> 1248 <small class="timeago" title="2026-08-19T14:23:29.522Z"></small> 1249 </a> 1250 </p> 1251 <div class="post-content"> 1252 Wenn ihr die Richtigkeit meiner Aussage weiter anzweifelt, könnte ich ja mal die Gegenfrage stellen, welche Unterschiede ihr denn zwischen Rassist und Nazi seht... Aber ich glaube, das wäre tatsächlich der Diskussion nicht förderlich. Also lasst die Beleidigungen doch einfach. 1253 1254 </div> 1255 </div> 1256 1257 1258 1259 1260</div> 1261 1262 </div> 1263 1264 1265</li> 1266 1267 1268 </ul> 1269 </div> 1270 <div widget-area="sidebar" class="col-lg-3 col-sm-12 hidden"> 1271 1272 </div> 1273</div> 1274<div widget-area="footer"> 1275 1276 <footer id="footer" class="container footer"><div> 1277<a href="/datenschutz.html">Datenschutz</a> | <a target="_blank" href="/impressum.html">Impressum</a> 1278</div><div> 1279Powered by <a target="_blank" href="https://nodebb.org">NodeBB</a> | <a target="_blank" href="//github.com/NodeBB/NodeBB/graphs/contributors">Contributors</a></div> 1280</footer> 1281 1282</div>
1283<script id="ajaxify-data" type="application/json">{"title":"[[pages:home]]","categories":[{"bgColor":"#edbb26","cid":12,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-bullhorn","imageClass":"cover","link":"","name":"Ankündigungen","numRecentReplies":1,"order":1,"parentCid":0,"post_count":111,"slug":"12/ankündigungen","topic_count":5,"isSection":0,"totalPostCount":1804,"totalTopicCount":102,"tagWhitelist":[],"unread-class":"unread","children":[{"bgColor":"#edbb26","cid":59,"class":"col-md-3 col-xs-6","color":"#fff","description":"Das kostenlose Onlinemagazin zu C++ und verwandten Themen","descriptionParsed":"<p>Das kostenlose Onlinemagazin zu C++ und verwandten Themen<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Die Artikel","numRecentReplies":1,"order":20,"parentCid":12,"post_count":1693,"slug":"59/die-artikel","topic_count":97,"isSection":0,"totalPostCount":1693,"totalTopicCount":97,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#edbb26","cid":12,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-bullhorn","imageClass":"cover","link":"","name":"Ankündigungen","numRecentReplies":1,"order":1,"parentCid":0,"post_count":111,"slug":"12/ankündigungen","topic_count":5,"isSection":0,"totalPostCount":111,"totalTopicCount":5,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2622013,"timestamp":1721383521760,"content":"@omggg Es gibt kein Modernes Exception Handling, da keine Ausnahmen stattfinden. Wenn doch ist was anderes unbrauchbar.\n","timestampISO":"2024-07-19T10:05:21.760Z","user":{"username":"[[global:former_user]]","userslug":"","picture":"","oldUid":30533,"icon:text":"?","icon:bgColor":"#aaa","groupTitle":"","groupTitleArray":[]},"index":22,"cid":59,"parentCid":12,"topic":{"slug":"219865/modernes-exception-handling-teil-2-hinter-den-kulissen","title":"Modernes Exception-Handling Teil 2 - Hinter den Kulissen"}}]}],"posts":[{"pid":2623952,"timestamp":1749414654836,"content":"@Dravere Ok, dann ist die Sache vom Tisch.\n","timestampISO":"2025-06-08T20:30:54.836Z","user":{"username":"GenXy","userslug":"genxy","picture":"","icon:text":"G","icon:bgColor":"#e91e63"},"index":14,"cid":12,"parentCid":0,"topic":{"slug":"355319/aktuelle-forumprobleme-2025-06-06","title":"Aktuelle Forumprobleme 2025-06-06"}}],"teaser":{"url":"/forum/post/2623952","timestampISO":"2025-06-08T20:30:54.836Z","pid":2623952,"topic":{"slug":"355319/aktuelle-forumprobleme-2025-06-06","title":"Aktuelle Forumprobleme 2025-06-06"}}},{"bgColor":"#1e8f5c","cid":33,"class":"col-md-3 col-xs-6","color":"#f7f7f7","description":"Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!","descriptionParsed":"<p>Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!<\/p>\n","disabled":0,"icon":"fa-gittip","imageClass":"cover","link":"","name":"C++ (alle ISO-Standards)","numRecentReplies":1,"order":3,"parentCid":0,"post_count":576440,"slug":"33/c-alle-iso-standards","topic_count":62763,"isSection":0,"totalPostCount":948085,"totalTopicCount":129333,"tagWhitelist":[],"unread-class":"unread","children":[{"bgColor":"#198553","cid":19,"class":"col-md-3 col-xs-6","color":"#fff","description":"Fragen zu den MFC (Microsoft Foundation Classes). WinForms haben mit MFC übrigens nichts zu tun.","descriptionParsed":"<p>Fragen zu den MFC (Microsoft Foundation Classes). WinForms haben mit MFC übrigens nichts zu tun.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"MFC","numRecentReplies":1,"order":1,"parentCid":33,"post_count":172825,"slug":"19/mfc","topic_count":32670,"isSection":0,"totalPostCount":172825,"totalTopicCount":32670,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#1e8f5c","cid":33,"class":"col-md-3 col-xs-6","color":"#f7f7f7","description":"Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!","descriptionParsed":"<p>Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!<\/p>\n","disabled":0,"icon":"fa-gittip","imageClass":"cover","link":"","name":"C++ (alle ISO-Standards)","numRecentReplies":1,"order":3,"parentCid":0,"post_count":576440,"slug":"33/c-alle-iso-standards","topic_count":62763,"isSection":0,"totalPostCount":576440,"totalTopicCount":62763,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625246,"timestamp":1790280002716,"content":"@Finnegan sagte in Rail Road Tycoon MFC in Action:\n\nway E\n\nHey Finnegan,\nDas Projekt ist auch auf GitHub, https://github.com/KahnSoft/FlexxRail\nHab da nicht ganz die MuÃe, mir den Code anzusehen\nJa ist auch nur ein Fetzen, zeigt aber den Vorgang der Chunk -Generierung ohne Cracks untereinander, da spielt ein gewisses Micro Overlapping eine rolle, das am ende aber kein Brot frisst (+2 auf den sizes der Chunks) Es wird sonnst Abstrus Rechen lastig wenn man da keine Tricks anwendet, also alles ist immer ein Kompromiss zwischen best of und Perform. Wenn man da Hunderte Loks mit Anhängern anzeigt, braucht man jeden Rechenquant, solange kein Gameplay statt findet, muss ich immer 1Khz Framerate erreichen, sonnst ist es später vorbei, also minimalste Operationen mit bestmöglichen Ergebnis.\n
1283die Berglandschaft in dem Video ist nicht unbedingt eine Heightmap-Geometrie sondern ein eventuell generischeres 3D-Modell\nGenau es ist keine Highmap es ist alles dynamisch mit der Perlin Noise erzeugtes Grid- dessen Höhenwerte vom Shader mit Texpixeln im shader Texturmischer belegt werden, ich erzeuge damit riesige Karten mit Kantenlängen von bis zu 1 Million Dreiecke Seitenlänge was riesig ist, die Loks fahren mit rund 145Kmh alles bereist authentisch proportional, und ich kann die Kamera auf eine Fahrende Lok aufschalten und diese verfolgen, die benötigt in diesem Affentempo rund 5 Minuten um eine Seitenlänge zu passieren. Eine Highmap dieser GröÃe sprengt den Speicherrahmen , es ist auch nicht gerade günstig eine Textur zu haben die 10000 Pixel Breit und Hoch ist. Man nennt das mit vielen Highmaps dann Content-Streaming DirectX SDK macht das vor, aber ich muss wie gesagt insgesamt die Performance erhalten , es können später tausende Objekte mit den Chunks und dem LodSystem so veraltet werden. Da bin ich auch froh drüber es ohne ContentStreaming und Ohne HighMaps gemacht zu haben, zumal nach der Highmap dann nochmal selbige ColorMap als Textur benötigt wird, alles wird also Dynamisch zur Laufzeit erzeugt, die Qualität ist natürlich nicht die einer ColorMap, aber sie ist apokalyptisch groÃ, es wird also keine 3D -Lok Simulation wo jedes Gauge im Kesselhaus zu sehen ist, das zerbricht die Welt der unendlichen Weiten , das wird der groÃe Vorteil gegenüber statischer Körperwelten. Also Aktienhandel Resourcenabbau alles Basiert auf Primitives, in einer erschlagenden Dimension.\nNur die Ränder der "Szene",\nGenau keine Cracks in der Szene (NoGo) lediglich die Ränder haben eine Treppensignatur, aber die könnte ich wegrechnen ist aber unnötig out of SkyBox\nParametrischen Kurven (Splines) meist eine Variable "Geschwindigkeit" haben.\nDa die Lok die Spline kennt (also die errechnet die selbst , es existieren real nur Kontrollpunkte) erzeugt sie für die Kurvigkeit eine Speed-Drossel die wirkt für Aufstieg bremsend für Abstieg Beschleunigend und für rechts links Radien Bremsend.\nvoid CSplineObjFollow::CalcSpeed()\n{\n const int dirSz = (int)m_DirN.size();\n if (m_SplineIdx < 0 || m_SplineIdx >= dirSz)\n {\n m_ConsecUphill = 0;\n m_ConsecDownhill = 0;\n m_ConsecCurve = 0;\n m_UphillFlt *= 0.9f;\n m_DownhillFlt *= 0.9f;\n m_CurveFlt *= 0.9f;\n m_LastSpeedFactor = 1.0f;\n return;\n }\n\n // Calculate Slope directly\n const float s = m_DirN[m_SplineIdx].z;\n\n // Calculate Curvature directly\n float avgCurv = 0.0f;\n int curvSamples = 0;\n const int splineSz = (int)m_Spline.size();\n\n if (splineSz >= 3)\n {\n const int maxCenter = splineSz - 2;\n CVertex* splinePtr = m_Spline.data();\n int si, center;\n float c;\n\n for (si = 0; si < 3; ++si)\n {\n center = m_SplineIdx + si;\n if (center < 1) center = 1;\n else if (center > maxCenter) center = maxCenter;\n\n c = Spline::LocalCurvature(splinePtr[center - 1], splinePtr[center], splinePtr[center + 1]);\n if (c > 0.0f) { avgCurv += c; ++curvSamples; }\n }\n\n if (curvSamples) avgCurv /= (float)curvSamples;\n }\n\n const float absS = fabsf(s);\n float factor = 1.0f;\n\n if (absS > SFF_EFFECT_THR)\n {\n float eff = absS - SFF_EFFECT_THR;\n if (s > 0.0f) // Bergauf: langsamer\n {\n if (eff > SFF_MAX_UP_EFF) eff = SFF_MAX_UP_EFF;\n factor -= eff * m_UphillFlt;\n }\n else // Bergab: schneller\n {\n if (eff > 0.10f) eff = 0.10f;\n factor += eff * m_DownhillFlt;\n }\n }\n\n if (avgCurv > 1e-5f) ++m_ConsecCurve; else if (m_ConsecCurve > 0) --m_ConsecCurve;\n\n const float invUp = 1.0f / (float)SFF_CONSEC_FULL_UP;\n const float uphillTarget = (m_ConsecUphill > 0) ? (m_ConsecUphill * invUp) : 0.0f;\n const float downhillTarget = (m_ConsecDownhill > 0) ? (m_ConsecDownhill * invUp) : 0.0f;\n const float curveTarget = (avgCurv > 0.0f) ? (avgCurv / (avgCurv + 0.003f) * 1.5f) : 0.0f;\n\n m_UphillFlt += (uphillTarget - m_UphillFlt) * ((uphillTarget > m_UphillFlt) ? SFF_RISE : SFF_DECAY);\n m_CurveFlt += (curveTarget - m_CurveFlt) * ((curveTarget > m_CurveFlt) ? SFF_RISE : SFF_DECAY);\n m_DownhillFlt += (downhillTarget - m_DownhillFlt) * ((downhillTarget > m_DownhillFlt) ? SFF_RISE : SFF_DECAY);\n\n if (m_CurveFlt > 0.0f) // Kurven: langsamer\n {\n float tmp = 1.0f - SFF_CURVE_MAX_RED * (m_CurveFlt * (1.0f + 0.65f * m_CurveFlt) * (1.0f + 0.75f * m_
1283CurveFlt));\n if (tmp < 0.1f) tmp = 0.1f;\n factor *= tmp;\n }\n\n if (factor < 0.25f) factor = 0.25f;\n else if (factor > 1.5f) factor = 1.5f;\n\n const float smooth = (factor < m_LastSpeedFactor) ? SFF_SPEED_SMOOTH_DOWN : (SFF_SPEED_SMOOTH_UP / (1.0f + m_Speed * SFF_SPD_SMOOTH_SCL));\n m_LastSpeedFactor += (factor - m_LastSpeedFactor) * smooth;\n}\n\nvoid CSplineObjFollow::CalcSpeedA()\n{\n float factor = 1.0f;\n const int dirSz = (int)m_DirN.size();\n\n if (dirSz >= 2 && m_SplineIdx >= 0)\n {\n float maxProxy = 0.0f;\n const CVertex *dirPtr = m_DirN.data();\n\n for (int i = 0; i < 3; ++i)\n {\n int pidx = m_SplineIdx + i;\n if (pidx < 1) pidx = 1;\n else if (pidx >= dirSz) pidx = dirSz - 1;\n\n int p0 = (pidx > 0) ? pidx - 1 : 0;\n float d = dirPtr[p0].Dot(dirPtr[pidx]);\n if (d > 1.0f) d = 1.0f;\n else if (d < -1.0f) d = -1.0f;\n\n float proxy = 1.0f - d;\n if (proxy > maxProxy) maxProxy = proxy;\n }\n\n const float curveEffect = (maxProxy > 0.0f) ? (maxProxy / (maxProxy + 0.001f)) : 0.0f;\n m_CurveFlt += (curveEffect - m_CurveFlt) * ((curveEffect > m_CurveFlt) ? SFF_RISE : SFF_DECAY);\n factor = 1.0f - SFF_CURVE_MAX_RED * (curveEffect * (1.0f + 0.75f * m_
1283CurveFlt));\n }\n\n if (factor < 0.15f) factor = 0.15f;\n else if (factor > 1.5f) factor = 1.5f;\n\n float alpha = 0.20f + 0.55f * (1.0f - factor);\n if (alpha > 1.0f) alpha = 1.0f;\n if (factor < m_LastSpeedFactor) alpha = alpha * 0.9f + 0.5f * (1.0f - alpha);\n\n m_LastSpeedFactor += (factor - m_LastSpeedFactor) * alpha;\n}\n\nDiese Verfolgung von Tracks wird also in separaten Threads berechnet, und für jede Lok durchlaufen, da gibt es nicht die geringsten Probleme mit der Render Geschwindigkeit , es wird also kein Normal benötigt um die Geschwindigkeit auf den Dynamischen Tracks zu erhalten, die allerdings über normal vektoren verfügen, jedoch nie von der Mechanik abgefragt werden, die Tracks haben auch eine Beschreibung über den sog. TrackFragmentGenerator:\n/*\n==========================================================\nTrackFragment Eigenschaften & Geometrie-Regelwerk\n==========================================================\n\n1) Grundstruktur (RNA1):\n - Ein TrackFragment besteht aus mehreren Einzelteilen: Balast, Slicer (Schienen), Sleeper (Schwellen).\n - Die Geometrie wird entlang einer Eingangsspline (VertexLst) erzeugt und verteilt.\n - Jeder Einzelteiltyp hat eigene Parameter und Farben.\n\n2) Balast (RNA1):\n - Wird als U-Profil ohne Boden generiert.\n - Besteht aus Seitenwänden und Dach, keine Unterseite.\n - Die Breite und Höhe sind abhängig vom MaÃstab (scale).\n - Die Balast-Spline wird mit niedriger Dichte (Subsampling) erzeugt.\n - Speicherbedarf steigt mit Dichte und Länge der Spline.\n\n3) Slicer (Schienen) (RNA1):\n - Werden als U-Profile ohne Boden generiert.\n - Bestehen aus Seitenwänden und Dach, keine Unterseite.\n - Slicer sind schmaler und höher als der Balast.\n - Es werden zwei Slicer erzeugt: linke und rechte Schiene, jeweils entlang der Spline versetzt.\n - Slicer erhalten eine eigene Farbe für Seiten und Dach.\n - Subsampling reduziert Speicher und Rechenlast.\n\n4) Sleeper (Schwellen) (RNA1):\n - Werden als Quader erzeugt, keine U-Profile.\n - Liegen quer zur Spline und verbinden die beiden Slicer.\n - Die Platzierung erfolgt gleichmäÃig entlang der Spline, am Anfang, Ende und dazwischen.\n - Sleeper erhalten eigene Farben für Seiten und Oberseite.\n - Anzahl und Abstand beeinflussen die Komplexität.\n\n5) Geometrie-Erzeugung (RNA1):\n - Die Methode GenerateVbo erzeugt die Einzelteile entlang der Spline.\n - Für Balast und Slicer wird die Spline mit unterschiedlichen Schrittweiten abgetastet (Subsampling).\n - Die Geometrie wird als Vertex-, Normal-, Color- und Index-Arrays für das VBO erzeugt.\n - Datenfluss: Spline -> Sampling -> Einzelteil -> VBO.\n\n6) Farben und Materialien (RNA1):\n - Jede Komponente (Balast, Slicer, Sleeper) erhält eigene Farben für Seiten und Dach/Oberseite.\n - Die Farben werden beim Erzeugen der Vertices zugewiesen.\n - Farbwechsel im Code beachten.\n\n7) VBO-Handling (RNA1):\n - Die erzeugten Geometrien werden in einem VBOSet gespeichert.\n - Nach der Erzeugung wird das VBO für die Darstellung vorbereitet.\n - Speicherbedarf und Performance hängen von der Anzahl der Vertices und Indices ab.\n\n8) Besonderheiten (RNA1):\n - Die Geometrie ist so ausgelegt, dass keine Bodenflächen für U-Profile entstehen.\n - Die Verteilung und Ausrichtung der Einzelteile erfolgt dynamisch entlang der Eingangsspline.\n - Fehlerquellen: Indizierung, Subsampling, falsche Parameter.\n\n9) Komplexitätsfaktoren (KI-relevant):\n - Anzahl und Dichte der Einzelteile (Balast, Slicer, Sleeper).\n - Länge und Form der Eingangsspline.\n - Subsampling-Parameter und ProfilgröÃen.\n - VBO-Speicherbedarf und Render-Performance.\n - Korrekte Indizierung und Farbzuteilung.\n - Robustheit gegen fehlerhafte Eingabedaten.\n\n10) Speicherverwaltung und Vektorzugriffe (RNA1):\n - Alle Geometrie-Daten werden in std::vector gespeichert.\n - Jeder push/remove/clear/erase-Aufruf ruft automatisch die Destruktoren der enthaltenen Objekte auf.\n - Dadurch werden Ressourcen immer korrekt freigegeben.\n - Speicherlecks sind ausgeschlossen, solange keine rohen Zeiger verwendet werden.\n\n11) LOD-Rendering für entfernte Fragmente (RNA1):\n - Ab einer Entfernung von TRACK_LOD_DIST werden weniger Indices im VBO gezeichnet.\n - Ein visueller Hinweis (z.B. "LOD aktiv") wird rechtsbündig am Fragment angezeigt.\n - Die LOD-Distanz ist als TRACK_LOD_DIST im Code definiert.\n \n LOD-Priorität (VBO-Reihenfolge, Index 0 = höchste Priorität):\n +-------+------------------+---------------+---------------------------+\n | Phase | Komponente | LOD-Priorität | Beschreibung |\n +-------+------------------+---------------+---------------------------+\n | 1 | Gauges | Höchste | Lichttafel (4 Lichter) |\n | 1 | Dipper | Höchste | Signalflügel |\n | 2 | Switch-Cube | Hoch | Weichen-Hitbox |\n | 3 | Terminal | Hoch | Bahnsteig-Geometrie |\n | 4 | Signal-Mast | Mittel | Stange + Sockel |\n | 5 | Prellbock | Mittel | Buffer Stop |\n | 6 | Ballast | Niedrig | Schotter (viele Faces) |\n | 6 | Slicer | Niedrig | Schienen (viele Faces) |\n | 6 | Sleeper | Niedrig | Schwellen (viele Faces) |\n +-------+------------------+---------------+---------------------------+\n \n Bei LOD-Reduktion werden zuerst Sleeper/Slicer/Ballast weggelassen,\
1283n Gauges und Dipper bleiben bis zuletzt sichtbar.\n\n12) Switch-Cube für Weichen (RNA2):\n - Wird nur bei TYPE_SWITCH_TRK erzeugt.\n - Besteht aus einem Würfel (Cube) und einem Sockel (Pyramiden-Stumpf) neben dem Gleis am Ende der Spline.\n - Position: Neben dem Balast in Fahrtrichtung, versetzt um die halbe Balast-Breite plus zusätzlichen Abstand.\n - GröÃe: Würfel hat scale * 1.6f GröÃe, Sockel ist doppelt so breit.\n - Farben: Würfel in Slicer-Farben (Grün=Open, Rot=Closed), Sockel in Balast-Farben.\n - Zweck: Visuelle Darstellung von Weichen-Switches mit Statusanzeige (Open/Closed).\n - Bounding Box: Separate m_SwitchBBoxMin/Max für Kollision oder Selektion.\n\n13) Signal-Mast für Weichen & Strecken (RNA3):\n - Wird bei TYPE_SWITCH_TRK (automatisch) oder via SnapIn (manuell) erzeugt.\n - Besteht aus mehreren Komponenten:\n a) Sockel: Pyramiden-Stumpf auf Terrain-Höhe\n b) Mast: Zwei vertikale Streben (Leiter-Stil) mit Sprossen\n c) Kopfstück: Horizontaler Balken am oberen Ende\n d) Ausleger: Horizontale Stäbe zur Seitenstabilisierung\n e) Dipper: Beweglicher Signal-Flügel (Formsignal)\n f) Gauge: Lichttafel mit 4 Signallichtern (Hp0/Hp1/Hp2)\n - Position:\n * Weichen: Automatisch in der Mitte der Spline.\n * Strecken: An definierter SnapIn-Position (dotIdx).\n - Dipper-Zustände:\n * TYPE_SIGNAL_OPEN gesetzt: Dipper horizontal (Hp0 = Halt)\n * TYPE_SIGNAL_OPEN nicht gesetzt: Dipper nach unten (Hp1 = Fahrt frei)\n - Farben: Mast in Balast-Farben, Dipper rot mit weiÃer Füllung und Ring.\n - Bounding Box: Separate m_SignalBoxes für Klick-Erkennung (umschlieÃt gesamten Mast).\n - Debug-Anzeige: WeiÃe Box, roter Text "Hp0"/"Hp1".\n - Lok-Steuerung: Signal-Status wird in SnapIn.flags gespeichert.\n\n14) Prellbock / Buffer Stop (RNA4):\n - Wird automatisch bei TYPE_PILLER_TRK erzeugt (Track mit offenem Ende).\n - Erkennung: forwardFragmentId == -1 ODER backwardFragmentId == -1.\n - Position: Am Gleisende, versetzt um 3 * SLEEPER_PITCH nach hinten.\n - Struktur:\n a) Gleis-Extension: Echtes Gleis (Balast/Slicer/Sleeper) vom Ende bis zum Prellbock.\n b) Schraege Stuetzen: 2x 45-Grad Hypotenuse (links/rechts auf Schienen).\n c) Vertikale Kateten: 2x senkrechte Pfosten hinter den Stuetzen.\n d) Querbalken oben: Horizontaler Balken zwischen den Kateten-Spitzen.\n e) Querbalken unten: Horizontaler Balken am Fuss der Stuetzen.\n - Doppelgleis: 2 separate Prellboecke mit Gleisabstand versetzt.\n - Verkehrsvertrag: Am Prellbock dreht nur die Fahrtrichtung der Lok. Ihre\n m_TrackSide bleibt unveraendert; der seitliche Render-Offset wird gespiegelt.\n Bei einem Doppelgleis-Hostwechsel wird zusaetzlich die Weltposition fuer\n die Seitenkontinuitaet ausgewertet, damit Weichen keinen Spurwechsel erzeugen.\n - Farben: Stuetzen grau, Querbalken in Sleeper-Farben.\n - Rekursionsschutz: TYPE_PILLER_TRK wird fuer Extension-Spline entfernt.\n\n15) Terminal / Bahnsteig (RNA5):\n - Länge basiert auf Zuglänge: TERMINAL_WAGON_LEN à TERMINAL_MAX_WAGONS = 15000 units\n - 1 Waggon/Lok = 1500 units, Max 10 Waggons am Bahnsteig\n - Z-Ebene: Einheitliche Höhe (Mittelwert aller Dots) - keine Wellen!\n - Zwei Signale (A + B) an den Enden für Face-to-Face Steuerung.\n - Dynamische Verkürzung wenn Track zu kurz ist.\n\n16) Verkehr & Fahrplaner (RNA6):\n - Die Basis-Verkehrslogik ist aktiv: physische Doppelgleis-Seiten,\n Bremsen und Disaster-Erkennung laufen in GLSceneTraffic.\n - Ein globaler Fahrplaner/Scheduler über dieser Basis bleibt geplant.\n - Er nutzt RNA1-5 (Gleise, Weichen, Signale, Prellboecke, Terminals)\n fuer Zeitsteuerung und Automatisierung von Weichen/Signalen.\n*/\n\n\nnicht in jedem Frame machen. Die Geometrie der Lok und Waggons bedingt ja einen minimalen Krümmungsradius.\nTatsächlich wird es sogar öfters berechnet als pro jedem Frame, das geht mit bis zu 20 tausend Iterationen also 20Khz\nin den Threads, die Loks fahren seidig und extrem Pixel genau auf den Gleiskörpern.\nDurch die Translationen für die Lok -Mesh Körper werden diese exact an der Spline geführt dazu wird für die Loks eine Pivot-Translation verwendet:\nvoid CGLmatrix::TranslatePivotXYZTrack(const CVertex& world, CVertex& pivot, const CVertex& forward, const CVertex& right, const CVertex& up)\n{\n\tfloat* m = m_m0;\n\n\t// Snapshot original orientation (R0) and translation (t0)\n\tconst float r0x = m[0], r0y = m[1], r0z = m[2];\n\tconst float r1x = m[4], r1y = m[5], r1z = m[6];\n\tconst float r2x = m[8], r2y = m[9], r2z = m[10];\n\tfloat tx = m[12], ty = m[13], tz = m[14];\n\n\t// Phase 1: t1 = t0 + R0 * (world + pivot)\n\tconst float v0x = world.x + pivot.x;\n\tconst float v0y = world.y + pivot.y;\n\tconst float v0z = world.z + pivot.z;\n\ttx += r0x * v0x + r1x * v0y + r2x * v0z;\n\tty += r0y * v0x + r1y * v0y + r2y * v0z;\n\ttz += r0z * v0x + r1z * v0y + r2z * v0z;\n\n\t// Phase 2: DIREKTE Matrix-Orientierung aus Spline-Basis (statt Euler-Rotation)\n\t// R' = R0 * SplineBasis (Forward, Right, Up direkt verwenden)\n\tm[0] = r0x * forward.x + r1x * forward.y + r2x * forward.z;\n\tm[1] = r0y * forward.x + r1y * forward.y + r2y * forward.z;\n\tm[2] = r0z * forward.x + r1z * forward.y + r2z * forward.z;\n\t\n\tm[4] = r0x * right.x + r1x * right.y + r2x * right.z;\n\tm[5] = r0y * right.x + r1y * right.y + r2y * right.z;\n\tm[6] = r0z * right.x + r1z * right.y + r2z * right.z;\n\t\n\tm[8] = r0x * up.x + r1x * up.y + r2x * up.z;\n\tm[9] = r0y * up.x + r1y * up.y + r2y * up.z;\n\tm[10] = r0z * up.x + r1z * up.y + r2z * up.z;\n\n\t// Phase 3: t' = t1 + R' * (-pivot)\n\ttx += m[0] * (-pivot.x) + m[4] * (-pivot.y) + m[8] * (-pivot.z);\n\tty += m[1] * (-pivot.x) + m[5] * (-pivot.y) + m[9] * (-pivot.z);\n\ttz += m[2] * (-pivot.x) + m[6] * (-pivot.y) + m[10] * (-pivot.z);\n\tm[12] = tx; m[13] = ty; m[14] = tz; // keep m[15] as is\n}\n\n\nUnd für normale nicht dem Track folgender Objekte eine Pivot normale Translation (Beides Teil der GL Engine wo jede Matrix wenn sie fertig im Speicher liegt nur einmal per Frame an GL gesendet wird was zu wahnsinnigen Ablaufraten führt:\nvoid CGLmatrix::TranslatePivotXYZ(const CVertex& world, CVertex& pivot, const CVertex& rot)\n{\n\tfloat* m = m_m0;\n\n\t// Snapshot original orientation (R0) and translation (t0)\n\tconst float r0x = m[0], r0y = m[1], r0z = m[2];\n\tconst float r1x = m[4], r1y = m[5], r1z = m[6];\n\tconst float r2x = m[8], r2y = m[9], r2z = m[10];\n\tfloat tx = m[12], ty = m[13], tz = m[14];\n\n\t// Phase 1: t1 = t0 + R0 * (world + pivot)\n\tconst float v0x = world.x + pivot.x;\n\tconst float v0y = world.y + pivot.y;\n\tconst float v0z = world.z + pivot.z;\n\ttx += r0x * v0x + r1x * v0y + r2x * v0z;\n\tty += r0y * v0x + r1y * v0y + r2y * v0z;\n\ttz += r0z * v0x + r1z * v0y + r2z * v0z;\n\n\t// Phase 2: R' = R0 * R(rot) â RotXYZ(rot) on the basis columns\n\tconst float cX = CCalculate::LutCos(rot.x); const float sX = CCalculate::LutSin(rot.x);\n\tconst float cY = CCalculate::LutCos(rot.y); const float sY = CCalculate::LutSin(rot.y);\n\tconst float cZ = CCalculate::LutCos(rot.z); const float sZ = CCalculate::LutSin(rot.z);\n\n\t// Start from current m (R0) and apply X, then Y, then Z exactly like RotXYZ\n\tfloat x0, y0, z0, x1, y1, z1, x2, y2, z2;\n\t// X-axis\n\tx0 = m[0]; y0 = m[1]; z0 = m[2];\n\tx1 = m[4] * cX + m[8] * sX; y1 = m[5] * cX + m[9] * sX; z1 = m[6] * cX + m[10] * sX;\n\tx2 = m[4] * -sX + m[8] * cX; y2 = m[5] * -sX + m[9] * cX; z2 = m[6] * -sX + m[10] * cX;\n\n\tm[0] = x0; m[1] = y0; m[2] = z0;\n\tm[4] = x1; m[5] = y1; m[6] = z1;\n\tm[8] = x2; m[9] = y2; m[10] = z2;\n\n\t// Y-axis\n\tx0 = m[0] * cY + m[8] * -sY; y0 = m[1] * cY + m[9] * -sY; z0 = m[2] * cY + m[10] * -sY;\n\tx1 = m[4]; y1 = m[5]; z1 = m[6];\n\tx2 = m[0] * sY + m[8] * cY; y2 = m[1] * sY + m[9] * cY; z2 = m[2] * sY + m[10] * cY;\n\n\tm[0] = x0; m[1] = y0; m[2] = z0;\n\tm[4] = x1; m[5] = y1; m[6] = z1;\n\tm[8] = x2; m[9] = y2; m[10] = z2;\n\n\t// Z-axis\n\tx0 = m[0] * cZ + m[4] * sZ; y0 = m[1] * cZ + m[5] * sZ; z0 = m[2] * cZ + m[6] * sZ;\n\tx1 = m[0] * -sZ + m[4] * cZ; y1 = m[1] * -sZ + m[5] * cZ; z1 = m[2] * -sZ + m[6] * cZ;\n\tx2 = m[8]; y2 = m[9]; z2 = m[10];\n\n\tm[0] = x0; m[1] = y0; m[2] = z0;\n\tm[4] = x1; m[5] = y1; m[6] = z1;\n\tm[8] = x2; m[9] = y2; m[10] = z2;\n\n\t// Phase 3: t' = t1 + R' * (-pivot)\n\ttx += m[0] * (-pivot.x) + m[4] * (-pivot.y) + m[8] * (-pivot.z);\n\tty += m[1] * (-pivot.x) + m[5] * (-pivot.y) + m[9] * (-pivot.z);\n\ttz += m[2] * (-pivot.x) + m[6] * (-pivot.y) + m[10] * (-pivot.z);\n\tm[12] = tx; m[13] = ty; m[14] = tz; // keep m[15] as is\n}\n\neinfacher sein könnte, dem User das Feintuning zu überlassen\nDer braucht ein klares Spielerlebnis , das da beim gleise Legen irgendwelche Kapriolen passieren soll der nicht handhaben,\nes spielen ja auch viele Kinder oder bei groÃen Gleisanlagen währ es zu frikelig, der Editor unterstellt dem User ganz klare Edit Regeln die unbedingt von der Software sichergestellt werden müssen so wie bei einem CAD Programm.\n50 Spieler "MMO" ist schon nen hartes Ziel.\nAuf jeden Fall, die können sogar Server mieten und ihr eigenes Terrain (Ressourcen) über Tunnels an das Maingrid anschlieÃen, das läuft dann aber über Linux auf Mietservern, das Thema alleine sprengt schnell den Rahmen da muss man aufpassen, es beginnt in kürze mit der Fahrplan Erstellung und dem Zug-Roster der die Wagongs koppelt(folge Jahr) . Sicher kommen dort Hacker und Einkreiser usw. muss man sehen das sich das selber verwaltet. UDP SSL Kodierter Transfer mal sehen das ist noch ein Weilchen hin. Aber die Kommunikation ist im Prinzip klar, läuft dann zuerst auf ner VM am Nebentisch...\nViel Erfolg damit! Ich glaub da gibts auch sicher einige Foren und Communities für derartige Spiele.\nNa erstmal noch nicht , in dem Zustand interessiert das nur Experten, es gibt ja noch kein Game, in Foren habe ich bis heute noch keinen gehört dem das gefällt Da bist Du der erste mit dem ich drüber Chatten kann \nD
1283as OpenTTD ist eine andere Liga, da will ich nicht hin, ich mache ein ganz spezielles Railroad wo der User Signale weichen Bahnhöfe auch über Lua -Skript kontrollieren kann, also Stichwort alles ist volldynamisch und generisch.\nEgo-Perspektive (Lokführer)\nGenau ich habe einen Gleistracker der mit der Kamera alle bestehnden Gleise abfährt (Neben der Zugverfolgung) Das jetzt schon ein Wahnsinns ScreenBlanker !\nDanke für deine Aufmerksamkeit\nIch berichte mal immer gerne über solche Sachen \nGruà Karsten\n","timestampISO":"2026-09-24T20:00:02.716Z","user":{"username":"KahnSoft","userslug":"kahnsoft","picture":"","icon:text":"K","icon:bgColor":"#f44336"},"index":6,"cid":19,"parentCid":33,"topic":{"slug":"355496/rail-road-tycoon-mfc-in-action","title":"Rail Road Tycoon MFC in Action"}}]},{"bgColor":"#659981","cid":21,"class":"col-md-3 col-xs-6","color":"#fff","description":"Rund um die VCL (Visual Component Library) und den C++Builder.","descriptionParsed":"<p>Rund um die VCL (Visual Component Library) und den C++Builder.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"VCL (C++ Builder)","numRecentReplies":1,"order":2,"parentCid":33,"post_count":143578,"slug":"21/vcl-c-builder","topic_count":24027,"isSection":0,"totalPostCount":143578,"totalTopicCount":24027,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#1e8f5c","cid":33,"class":"col-md-3 col-xs-6","color":"#f7f7f7","description":"Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!","descriptionParsed":"<p>Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!<\/p>\n","disabled":0,"icon":"fa-gittip","imageClass":"cover","link":"","name":"C++ (alle ISO-Standards)","numRecentReplies":1,"order":3,"parentCid":0,"post_count":576440,"slug":"33/c-alle-iso-standards","topic_count":62763,"isSection":0,"totalPostCount":576440,"totalTopicCount":62763,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624765,"timestamp":1771254814002,"content":"Nur aus Interesse:\nHat wer diese Version ( C++Builder 12 Community Edition) auf seinem Rechner installiert? Wenn ja, dann könnte die Version mit meinem Win11 nicht kompatibel sein, oder sonst was. Wenn nein, dann ist das Ding wohl fehlerhaft.\n","timestampISO":"2026-02-16T15:13:34.002Z","user":{"username":"RudiMBM","userslug":"rudimbm","picture":"/forum/assets/uploads/profile/36168-profileavatar.png","icon:text":"R","icon:bgColor":"#33691e"},"index":6,"cid":21,"parentCid":33,"topic":{"slug":"355440/c-builder-12-ce-projekt-öffnen-fehlt","title":"C++Builder 12 CE Projekt öffnen fehlt"}}]},{"bgColor":"#26704e","cid":78,"class":"col-md-3 col-xs-6","color":"#fff","description":"C++ mit .NET? Nennt sich C++/CLI, oder in der früheren Version Managed C++. Programmierung des .NET-Frameworks mit C++, oder Fragen zu den Erweiterungen von C++/CLI mit dem Visual Studio.","descriptionParsed":"<p>C++ mit .NET? Nennt sich C++/CLI, oder in der früheren Version Managed C++. Programmierung des .NET-Frameworks mit C++, oder Fragen zu den Erweiterungen von C++/CLI mit dem Visual Studio.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"C++/CLI mit .NET","numRecentReplies":1,"order":3,"parentCid":33,"post_count":29747,"slug":"78/c-cli-mit-net","topic_count":5156,"isSection":0,"totalPostCount":29747,"totalTopicCount":5156,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#1e8f5c","cid":33,"class":"col-md-3 col-xs-6","color":"#f7f7f7","description":"Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!","descriptionParsed":"<p>Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!<\/p>\n","disabled":0,"icon":"fa-gittip","imageClass":"cover","link":"","name":"C++ (alle ISO-Standards)","numRecentReplies":1,"order":3,"parentCid":0,"post_count":576440,"slug":"33/c-alle-iso-standards","topic_count":62763,"isSection":0,"totalPostCount":576440,"totalTopicCount":62763,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2620723,"timestamp":1709477984455,"content":"@znieh99\num mit Niklaus Wirth (* 15. Februar 1934 in Winterthur;
1283 â 1. Januar 2024 in Zürich) zu antworten: Wahlfreier Zugriff (Random Access) findet nicht auf Dateiebene sondern im Hauptspeicher statt. Denn: Dateien sind Sequenzen, sie werden sequentiell gelesen und sequentiell geschrieben.\nDas heiÃt: Lese den Dateiinhalt auf eine zweckmäÃige Datenstruktur (Array, Liste, Map o.ä) und bearbeite diese. AnschlieÃend schreibe diese Daten zurück in die Sequenz (Serialize). Die Frage ist also, wie man abstrakte Datentypen in Sequenzen serialisiert und umgekehrt. Und aus OOP-Sicht könnte man die Daten im RAM als Objekte auffassen die dafür ihre eigenen Methoden bescheiben.\nMFG\n","timestampISO":"2024-03-03T14:59:44.455Z","user":{"username":"_ro_ro","userslug":"_ro_ro","picture":"","icon:text":"_","icon:bgColor":"#e65100"},"index":7,"cid":78,"parentCid":33,"topic":{"slug":"354569/wie-kann-ich-daten-in-einer-datei-teilweise-ändern","title":"Wie kann ich Daten in einer Datei teilweise ändern"}}]},{"bgColor":"#21a366","cid":41,"class":"col-md-3 col-xs-6","color":"#333","description":"Alternative GUI-Libs werden immer geläufiger, diese Rubrik bietet Qt, gtkmm, GTK+, wxWidgets und Co. eine Heimat.","descriptionParsed":"<p>Alternative GUI-Libs werden immer geläufiger, diese Rubrik bietet Qt, gtkmm, GTK+, wxWidgets und Co. eine Heimat.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Andere GUIs - Qt, GTK+, wxWidgets","numRecentReplies":1,"order":4,"parentCid":33,"post_count":25495,"slug":"41/andere-guis-qt-gtk-wxwidgets","topic_count":4717,"isSection":0,"totalPostCount":25495,"totalTopicCount":4717,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#1e8f5c","cid":33,"class":"col-md-3 col-xs-6","color":"#f7f7f7","description":"Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!","descriptionParsed":"<p>Fragen zu Funktionen und Abläufen in C++ (C++98, C++03, C++11, C++14, C++17), um zu erfahren was pure virtual bedeutet, wie das mit Templates, STL und Boost geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!<\/p>\n","disabled":0,"icon":"fa-gittip","imageClass":"cover","link":"","name":"C++ (alle ISO-Standards)","numRecentReplies":1,"order":3,"parentCid":0,"post_count":576440,"slug":"33/c-alle-iso-standards","topic_count":62763,"isSection":0,"totalPostCount":576440,"totalTopicCount":62763,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624065,"timestamp":1754029631123,"content":"Ich arbeite gerade an DirectX und nutze zum ersten mal die DirectXMath Funktionen. Die SIMD Unterstützung ist neu für mich. Das Flag _XM_SSE_INTRINSICS_ ist entsprechend gesetzt.\nVon daher wollte ich fragen ob der folgende Code so ok ist:\nfloat GetDistance2D(const DirectX::XMVECTOR& P1, const DirectX::XMVECTOR& P2)\n{\n DirectX::XMVECTOR delta = DirectX::XMVectorSubtract(P1, P2);\n DirectX::XMVECTOR length = DirectX::XMVector2Length(delta);\n\n return DirectX::XMVectorGetX(length);\n}\n\nMein gedankliches Problem: DirectX::XMVECTOR ist ein 4D Vektor, aber ich brauche nur die 2D Distanz. Wäre also der folgende Code schneller?\nfloat GetDistance2D(const DirectX::XMVECTOR& P1, const DirectX::XMVECTOR& P2)\n{\n float P1x, P1y, P1w;\n float P2x, P2y, P2w;\n\n // Bestimme XY von P1\n P1w = DirectX::XMVectorGetW(P1);\n if (P1w != 0.0f && P1w != 1.0f)\n {\n P1x = DirectX::XMVectorGetX(P1) / P1w;\n P1y = DirectX::XMVectorGetY(P1) / P1w;\n }\n else\n {\n P1x = DirectX::XMVectorGetX(P1);\n P1y = DirectX::XMVectorGetY(P1);\n }\n // Bestimme XY von P2\n P2w = DirectX::XMVectorGetW(P2);\n if (P2w != 0.0f && P2w != 1.0f)\n {\n P2x = DirectX::XMVectorGetX(P2) / P2w;\n P2y = DirectX::XMVectorGetY(P2) / P2w;\n }\n else\n {\n P2x = DirectX::XMVectorGetX(P2);\n P2y = DirectX::XMVectorGetY(P2);\n }\n // Berechne nun den Abstand\n float DiffX = P1x - P2x;\n float DiffY = P1y - P2y;\n\n return sqrt(DiffX * DiffX + DiffY * DiffY);\n}\n\n","timestampISO":"2025-08-01T06:27:11.123Z","user":{"username":"Quiche Lorraine","userslug":"quiche-lorraine","picture":"/forum/assets/uploads/profile/35432-profileavatar.png","icon:text":"Q","icon:bgColor":"#ff5722"},"index":1,"cid":41,"parentCid":33,"topic":{"slug":"355336/directxmath-einstieg-verständnisfrage","t
1283itle":"DirectXMath Einstieg -> Verständnisfrage"}}]}],"posts":[{"pid":2625246,"timestamp":1790280002716,"content":"@Finnegan sagte in Rail Road Tycoon MFC in Action:\n\nway E\n\nHey Finnegan,\nDas Projekt ist auch auf GitHub, https://github.com/KahnSoft/FlexxRail\nHab da nicht ganz die MuÃe, mir den Code anzusehen\nJa ist auch nur ein Fetzen, zeigt aber den Vorgang der Chunk -Generierung ohne Cracks untereinander, da spielt ein gewisses Micro Overlapping eine rolle, das am ende aber kein Brot frisst (+2 auf den sizes der Chunks) Es wird sonnst Abstrus Rechen lastig wenn man da keine Tricks anwendet, also alles ist immer ein Kompromiss zwischen best of und Perform. Wenn man da Hunderte Loks mit Anhängern anzeigt, braucht man jeden Rechenquant, solange kein Gameplay statt findet, muss ich immer 1Khz Framerate erreichen, sonnst ist es später vorbei, also minimalste Operationen mit bestmöglichen Ergebnis.\ndie Berglandschaft in dem Video ist nicht unbedingt eine Heightmap-Geometrie sondern ein eventuell generischeres 3D-Modell\nGenau es ist keine Highmap es ist alles dynamisch mit der Perlin Noise erzeugtes Grid- dessen Höhenwerte vom Shader mit Texpixeln im shader Texturmischer belegt werden, ich erzeuge damit riesige Karten mit Kantenlängen von bis zu 1 Million Dreiecke Seitenlänge was riesig ist, die Loks fahren mit rund 145Kmh alles bereist authentisch proportional, und ich kann die Kamera auf eine Fahrende Lok aufschalten und diese verfolgen, die benötigt in diesem Affentempo rund 5 Minuten um eine Seitenlänge zu passieren. Eine Highmap dieser GröÃe sprengt den Speicherrahmen , es ist auch nicht gerade günstig eine Textur zu haben die 10000 Pixel Breit und Hoch ist. Man nennt das mit vielen Highmaps dann Content-Streaming DirectX SDK macht das vor, aber ich muss wie gesagt insgesamt die Performance erhalten , es können später tausende Objekte mit den Chunks und dem LodSystem so veraltet werden. Da bin ich auch froh drüber es ohne ContentStreaming und Ohne HighMaps gemacht zu haben, zumal nach der Highmap dann nochmal selbige ColorMap als Textur benötigt wird, alles wird also Dynamisch zur Laufzeit erzeugt, die Qualität ist natürlich nicht die einer ColorMap, aber sie ist apokalyptisch groÃ, es wird also keine 3D -Lok Simulation wo jedes Gauge im Kesselhaus zu sehen ist, das zerbricht die Welt der unendlichen Weiten , das wird der groÃe Vorteil gegenüber statischer Körperwelten. Also Aktienhandel Resourcenabbau alles Basiert auf Primitives, in einer erschlagenden Dimension.\nNur die Ränder der "Szene",\nGenau keine Cracks in der Szene (NoGo) lediglich die Ränder haben eine Treppensignatur, aber die könnte ich wegrechnen ist aber unnötig out of SkyBox\nParametrischen Kurven (Splines) meist eine Variable "Geschwindigkeit" haben.\nDa die Lok die Spline kennt (also die errechnet die selbst , es existieren real nur Kontrollpunkte) erzeugt sie für die Kurvigkeit eine Speed-Drossel die wirkt für Aufstieg bremsend für Abstieg Beschleunigend und für rechts links Radien Bremsend.\nvoid CSplineObjFollow::CalcSpeed()\n{\n const int dirSz = (int)m_DirN.size();\n if (m_SplineIdx < 0 || m_SplineIdx >= dirSz)\n {\n m_ConsecUphill = 0;\n m_ConsecDownhill = 0;\n m_ConsecCurve = 0;\n m_UphillFlt *= 0.9f;\n m_DownhillFlt *= 0.9f;\n m_CurveFlt *= 0.9f;\n m_LastSpeedFactor = 1.0f;\n return;\n }\n\n // Calculate Slope directly\n const float s = m_DirN[m_SplineIdx].z;\n\n // Calculate Curvature directly\n float avgCurv = 0.0f;\n int curvSamples = 0;\n const int splineSz = (int)m_Spline.size();\n\n if (splineSz >= 3)\n {\n const int maxCenter = splineSz - 2;\n CVertex* splinePtr = m_Spline.data();\n int si, center;\n float c;\n\n for (si = 0; si < 3; ++si)\n {\n center = m_SplineIdx + si;\n if (center < 1) center = 1;\n else if (center > maxCenter) center = maxCenter;\n\n c = Spline::LocalCurvature(splinePtr[center - 1], splinePtr[center], splinePtr[center + 1]);\n if (c > 0.0f) { avgCurv += c; ++curvSamples; }\n }\n\n if (curvSamples) avgCurv /= (float)curvSamples;\n }\n\n const float absS = fabsf(s);\n float factor = 1.0f;\n\n if (absS > SFF_EFFECT_THR)\n {\n float eff = absS - SFF_EFFECT_THR;\n if (s > 0.0f) // Bergauf: langsamer\n {\n if (eff > SFF_MAX_UP_EFF) eff = SFF_MAX_UP_EFF;\n factor -= eff * m_UphillFlt;\n }\n else // Bergab: schneller\n {\n if (eff > 0.10f) eff = 0.10f;\n factor += eff * m_DownhillFlt;\n }\n }\n\n if (avgCurv > 1e-5f) ++m_ConsecCurve; else if (m_ConsecCurve > 0) --m_ConsecCurve;\n\n const float invUp = 1.0f / (float)SFF_CONSEC_FULL_UP;\n const float uphillTarget = (m_ConsecUphill > 0) ? (m_ConsecUphill * invUp) : 0.0f;\n const float downhillTarget = (m_ConsecDownhill > 0) ? (m_ConsecDownhill * invUp) : 0.0f;\n const float curveTarget = (avgCurv > 0.0f) ? (avgCurv / (avgCurv + 0.003f) * 1.5f) : 0.0f;\n\n m_UphillFlt += (uphillTarget - m_UphillFlt) * ((uphillTarget > m_UphillFlt) ? SFF_RISE : SFF_DECAY);\n m_CurveFlt += (curveTarget - m_CurveFlt) * ((curveTarget > m_CurveFlt) ? SFF_RISE : SFF_DECAY);\n m_DownhillFlt += (downhillTarget - m_DownhillFlt) * ((downhillTarget > m_DownhillFlt) ? SFF_RISE : SFF_DECAY);\n\n if (m_CurveFlt > 0.0f) // Kurven: langsamer\n {\n float tmp = 1.0f - SFF_CURVE_MAX_RED * (m_CurveFlt * (1.0f + 0.65f * m_CurveFlt) * (1.0f + 0.75f * m_
1283CurveFlt));\n if (tmp < 0.1f) tmp = 0.1f;\n factor *= tmp;\n }\n\n if (factor < 0.25f) factor = 0.25f;\n else if (factor > 1.5f) factor = 1.5f;\n\n const float smooth = (factor < m_LastSpeedFactor) ? SFF_SPEED_SMOOTH_DOWN : (SFF_SPEED_SMOOTH_UP / (1.0f + m_Speed * SFF_SPD_SMOOTH_SCL));\n m_LastSpeedFactor += (factor - m_LastSpeedFactor) * smooth;\n}\n\nvoid CSplineObjFollow::CalcSpeedA()\n{\n float factor = 1.0f;\n const int dirSz = (int)m_DirN.size();\n\n if (dirSz >= 2 && m_SplineIdx >= 0)\n {\n float maxProxy = 0.0f;\n const CVertex *dirPtr = m_DirN.data();\n\n for (int i = 0; i < 3; ++i)\n {\n int pidx = m_SplineIdx + i;\n if (pidx < 1) pidx = 1;\n else if (pidx >= dirSz) pidx = dirSz - 1;\n\n int p0 = (pidx > 0) ? pidx - 1 : 0;\n float d = dirPtr[p0].Dot(dirPtr[pidx]);\n if (d > 1.0f) d = 1.0f;\n else if (d < -1.0f) d = -1.0f;\n\n float proxy = 1.0f - d;\n if (proxy > maxProxy) maxProxy = proxy;\n }\n\n const float curveEffect = (maxProxy > 0.0f) ? (maxProxy / (maxProxy + 0.001f)) : 0.0f;\n m_CurveFlt += (curveEffect - m_CurveFlt) * ((curveEffect > m_CurveFlt) ? SFF_RISE : SFF_DECAY);\n factor = 1.0f - SFF_CURVE_MAX_RED * (curveEffect * (1.0f + 0.75f * m_
1283CurveFlt));\n }\n\n if (factor < 0.15f) factor = 0.15f;\n else if (factor > 1.5f) factor = 1.5f;\n\n float alpha = 0.20f + 0.55f * (1.0f - factor);\n if (alpha > 1.0f) alpha = 1.0f;\n if (factor < m_LastSpeedFactor) alpha = alpha * 0.9f + 0.5f * (1.0f - alpha);\n\n m_LastSpeedFactor += (factor - m_LastSpeedFactor) * alpha;\n}\n\nDiese Verfolgung von Tracks wird also in separaten Threads berechnet, und für jede Lok durchlaufen, da gibt es nicht die geringsten Probleme mit der Render Geschwindigkeit , es wird also kein Normal benötigt um die Geschwindigkeit auf den Dynamischen Tracks zu erhalten, die allerdings über normal vektoren verfügen, jedoch nie von der Mechanik abgefragt werden, die Tracks haben auch eine Beschreibung über den sog. TrackFragmentGenerator:\n/*\n==========================================================\nTrackFragment Eigenschaften & Geometrie-Regelwerk\n==========================================================\n\n1) Grundstruktur (RNA1):\n - Ein TrackFragment besteht aus mehreren Einzelteilen: Balast, Slicer (Schienen), Sleeper (Schwellen).\n - Die Geometrie wird entlang einer Eingangsspline (VertexLst) erzeugt und verteilt.\n - Jeder Einzelteiltyp hat eigene Parameter und Farben.\n\n2) Balast (RNA1):\n - Wird als U-Profil ohne Boden generiert.\n - Besteht aus Seitenwänden und Dach, keine Unterseite.\n - Die Breite und Höhe sind abhängig vom MaÃstab (scale).\n - Die Balast-Spline wird mit niedriger Dichte (Subsampling) erzeugt.\n - Speicherbedarf steigt mit Dichte und Länge der Spline.\n\n3) Slicer (Schienen) (RNA1):\n - Werden als U-Profile ohne Boden generiert.\n - Bestehen aus Seitenwänden und Dach, keine Unterseite.\n - Slicer sind schmaler und höher als der Balast.\n - Es werden zwei Slicer erzeugt: linke und rechte Schiene, jeweils entlang der Spline versetzt.\n - Slicer erhalten eine eigene Farbe für Seiten und Dach.\n - Subsampling reduziert Speicher und Rechenlast.\n\n4) Sleeper (Schwellen) (RNA1):\n - Werden als Quader erzeugt, keine U-Profile.\n - Liegen quer zur Spline und verbinden die beiden Slicer.\n - Die Platzierung erfolgt gleichmäÃig entlang der Spline, am Anfang, Ende und dazwischen.\n - Sleeper erhalten eigene Farben für Seiten und Oberseite.\n - Anzahl und Abstand beeinflussen die Komplexität.\n\n5) Geometrie-Erzeugung (RNA1):\n - Die Methode GenerateVbo erzeugt die Einzelteile entlang der Spline.\n - Für Balast und Slicer wird die Spline mit unterschiedlichen Schrittweiten abgetastet (Subsampling).\n - Die Geometrie wird als Vertex-, Normal-, Color- und Index-Arrays für das VBO erzeugt.\n - Datenfluss: Spline -> Sampling -> Einzelteil -> VBO.\n\n6) Farben und Materialien (RNA1):\n - Jede Komponente (Balast, Slicer, Sleeper) erhält eigene Farben für Seiten und Dach/Oberseite.\n - Die Farben werden beim Erzeugen der Vertices zugewiesen.\n - Farbwechsel im Code beachten.\n\n7) VBO-Handling (RNA1):\n - Die erzeugten Geometrien werden in einem VBOSet gespeichert.\n - Nach der Erzeugung wird das VBO für die Darstellung vorbereitet.\n - Speicherbedarf und Performance hängen von der Anzahl der Vertices und Indices ab.\n\n8) Besonderheiten (RNA1):\n - Die Geometrie ist so ausgelegt, dass keine Bodenflächen für U-Profile entstehen.\n - Die Verteilung und Ausrichtung der Einzelteile erfolgt dynamisch entlang der Eingangsspline.\n - Fehlerquellen: Indizierung, Subsampling, falsche Parameter.\n\n9) Komplexitätsfaktoren (KI-relevant):\n - Anzahl und Dichte der Einzelteile (Balast, Slicer, Sleeper).\n - Länge und Form der Eingangsspline.\n - Subsampling-Parameter und ProfilgröÃen.\n - VBO-Speicherbedarf und Render-Performance.\n - Korrekte Indizierung und Farbzuteilung.\n - Robustheit gegen fehlerhafte Eingabedaten.\n\n10) Speicherverwaltung und Vektorzugriffe (RNA1):\n - Alle Geometrie-Daten werden in std::vector gespeichert.\n - Jeder push/remove/clear/erase-Aufruf ruft automatisch die Destruktoren der enthaltenen Objekte auf.\n - Dadurch werden Ressourcen immer korrekt freigegeben.\n - Speicherlecks sind ausgeschlossen, solange keine rohen Zeiger verwendet werden.\n\n11) LOD-Rendering für entfernte Fragmente (RNA1):\n - Ab einer Entfernung von TRACK_LOD_DIST werden weniger Indices im VBO gezeichnet.\n - Ein visueller Hinweis (z.B. "LOD aktiv") wird rechtsbündig am Fragment angezeigt.\n - Die LOD-Distanz ist als TRACK_LOD_DIST im Code definiert.\n \n LOD-Priorität (VBO-Reihenfolge, Index 0 = höchste Priorität):\n +-------+------------------+---------------+---------------------------+\n | Phase | Komponente | LOD-Priorität | Beschreibung |\n +-------+------------------+---------------+---------------------------+\n | 1 | Gauges | Höchste | Lichttafel (4 Lichter) |\n | 1 | Dipper | Höchste | Signalflügel |\n | 2 | Switch-Cube | Hoch | Weichen-Hitbox |\n | 3 | Terminal | Hoch | Bahnsteig-Geometrie |\n | 4 | Signal-Mast | Mittel | Stange + Sockel |\n | 5 | Prellbock | Mittel | Buffer Stop |\n | 6 | Ballast | Niedrig | Schotter (viele Faces) |\n | 6 | Slicer | Niedrig | Schienen (viele Faces) |\n | 6 | Sleeper | Niedrig | Schwellen (viele Faces) |\n +-------+------------------+---------------+---------------------------+\n \n Bei LOD-Reduktion werden zuerst Sleeper/Slicer/Ballast weggelassen,\
1283n Gauges und Dipper bleiben bis zuletzt sichtbar.\n\n12) Switch-Cube für Weichen (RNA2):\n - Wird nur bei TYPE_SWITCH_TRK erzeugt.\n - Besteht aus einem Würfel (Cube) und einem Sockel (Pyramiden-Stumpf) neben dem Gleis am Ende der Spline.\n - Position: Neben dem Balast in Fahrtrichtung, versetzt um die halbe Balast-Breite plus zusätzlichen Abstand.\n - GröÃe: Würfel hat scale * 1.6f GröÃe, Sockel ist doppelt so breit.\n - Farben: Würfel in Slicer-Farben (Grün=Open, Rot=Closed), Sockel in Balast-Farben.\n - Zweck: Visuelle Darstellung von Weichen-Switches mit Statusanzeige (Open/Closed).\n - Bounding Box: Separate m_SwitchBBoxMin/Max für Kollision oder Selektion.\n\n13) Signal-Mast für Weichen & Strecken (RNA3):\n - Wird bei TYPE_SWITCH_TRK (automatisch) oder via SnapIn (manuell) erzeugt.\n - Besteht aus mehreren Komponenten:\n a) Sockel: Pyramiden-Stumpf auf Terrain-Höhe\n b) Mast: Zwei vertikale Streben (Leiter-Stil) mit Sprossen\n c) Kopfstück: Horizontaler Balken am oberen Ende\n d) Ausleger: Horizontale Stäbe zur Seitenstabilisierung\n e) Dipper: Beweglicher Signal-Flügel (Formsignal)\n f) Gauge: Lichttafel mit 4 Signallichtern (Hp0/Hp1/Hp2)\n - Position:\n * Weichen: Automatisch in der Mitte der Spline.\n * Strecken: An definierter SnapIn-Position (dotIdx).\n - Dipper-Zustände:\n * TYPE_SIGNAL_OPEN gesetzt: Dipper horizontal (Hp0 = Halt)\n * TYPE_SIGNAL_OPEN nicht gesetzt: Dipper nach unten (Hp1 = Fahrt frei)\n - Farben: Mast in Balast-Farben, Dipper rot mit weiÃer Füllung und Ring.\n - Bounding Box: Separate m_SignalBoxes für Klick-Erkennung (umschlieÃt gesamten Mast).\n - Debug-Anzeige: WeiÃe Box, roter Text "Hp0"/"Hp1".\n - Lok-Steuerung: Signal-Status wird in SnapIn.flags gespeichert.\n\n14) Prellbock / Buffer Stop (RNA4):\n - Wird automatisch bei TYPE_PILLER_TRK erzeugt (Track mit offenem Ende).\n - Erkennung: forwardFragmentId == -1 ODER backwardFragmentId == -1.\n - Position: Am Gleisende, versetzt um 3 * SLEEPER_PITCH nach hinten.\n - Struktur:\n a) Gleis-Extension: Echtes Gleis (Balast/Slicer/Sleeper) vom Ende bis zum Prellbock.\n b) Schraege Stuetzen: 2x 45-Grad Hypotenuse (links/rechts auf Schienen).\n c) Vertikale Kateten: 2x senkrechte Pfosten hinter den Stuetzen.\n d) Querbalken oben: Horizontaler Balken zwischen den Kateten-Spitzen.\n e) Querbalken unten: Horizontaler Balken am Fuss der Stuetzen.\n - Doppelgleis: 2 separate Prellboecke mit Gleisabstand versetzt.\n - Verkehrsvertrag: Am Prellbock dreht nur die Fahrtrichtung der Lok. Ihre\n m_TrackSide bleibt unveraendert; der seitliche Render-Offset wird gespiegelt.\n Bei einem Doppelgleis-Hostwechsel wird zusaetzlich die Weltposition fuer\n die Seitenkontinuitaet ausgewertet, damit Weichen keinen Spurwechsel erzeugen.\n - Farben: Stuetzen grau, Querbalken in Sleeper-Farben.\n - Rekursionsschutz: TYPE_PILLER_TRK wird fuer Extension-Spline entfernt.\n\n15) Terminal / Bahnsteig (RNA5):\n - Länge basiert auf Zuglänge: TERMINAL_WAGON_LEN à TERMINAL_MAX_WAGONS = 15000 units\n - 1 Waggon/Lok = 1500 units, Max 10 Waggons am Bahnsteig\n - Z-Ebene: Einheitliche Höhe (Mittelwert aller Dots) - keine Wellen!\n - Zwei Signale (A + B) an den Enden für Face-to-Face Steuerung.\n - Dynamische Verkürzung wenn Track zu kurz ist.\n\n16) Verkehr & Fahrplaner (RNA6):\n - Die Basis-Verkehrslogik ist aktiv: physische Doppelgleis-Seiten,\n Bremsen und Disaster-Erkennung laufen in GLSceneTraffic.\n - Ein globaler Fahrplaner/Scheduler über dieser Basis bleibt geplant.\n - Er nutzt RNA1-5 (Gleise, Weichen, Signale, Prellboecke, Terminals)\n fuer Zeitsteuerung und Automatisierung von Weichen/Signalen.\n*/\n\n\nnicht in jedem Frame machen. Die Geometrie der Lok und Waggons bedingt ja einen minimalen Krümmungsradius.\nTatsächlich wird es sogar öfters berechnet als pro jedem Frame, das geht mit bis zu 20 tausend Iterationen also 20Khz\nin den Threads, die Loks fahren seidig und extrem Pixel genau auf den Gleiskörpern.\nDurch die Translationen für die Lok -Mesh Körper werden diese exact an der Spline geführt dazu wird für die Loks eine Pivot-Translation verwendet:\nvoid CGLmatrix::TranslatePivotXYZTrack(const CVertex& world, CVertex& pivot, const CVertex& forward, const CVertex& right, const CVertex& up)\n{\n\tfloat* m = m_m0;\n\n\t// Snapshot original orientation (R0) and translation (t0)\n\tconst float r0x = m[0], r0y = m[1], r0z = m[2];\n\tconst float r1x = m[4], r1y = m[5], r1z = m[6];\n\tconst float r2x = m[8], r2y = m[9], r2z = m[10];\n\tfloat tx = m[12], ty = m[13], tz = m[14];\n\n\t// Phase 1: t1 = t0 + R0 * (world + pivot)\n\tconst float v0x = world.x + pivot.x;\n\tconst float v0y = world.y + pivot.y;\n\tconst float v0z = world.z + pivot.z;\n\ttx += r0x * v0x + r1x * v0y + r2x * v0z;\n\tty += r0y * v0x + r1y * v0y + r2y * v0z;\n\ttz += r0z * v0x + r1z * v0y + r2z * v0z;\n\n\t// Phase 2: DIREKTE Matrix-Orientierung aus Spline-Basis (statt Euler-Rotation)\n\t// R' = R0 * SplineBasis (Forward, Right, Up direkt verwenden)\n\tm[0] = r0x * forward.x + r1x * forward.y + r2x * forward.z;\n\tm[1] = r0y * forward.x + r1y * forward.y + r2y * forward.z;\n\tm[2] = r0z * forward.x + r1z * forward.y + r2z * forward.z;\n\t\n\tm[4] = r0x * right.x + r1x * right.y + r2x * right.z;\n\tm[5] = r0y * right.x + r1y * right.y + r2y * right.z;\n\tm[6] = r0z * right.x + r1z * right.y + r2z * right.z;\n\t\n\tm[8] = r0x * up.x + r1x * up.y + r2x * up.z;\n\tm[9] = r0y * up.x + r1y * up.y + r2y * up.z;\n\tm[10] = r0z * up.x + r1z * up.y + r2z * up.z;\n\n\t// Phase 3: t' = t1 + R' * (-pivot)\n\ttx += m[0] * (-pivot.x) + m[4] * (-pivot.y) + m[8] * (-pivot.z);\n\tty += m[1] * (-pivot.x) + m[5] * (-pivot.y) + m[9] * (-pivot.z);\n\ttz += m[2] * (-pivot.x) + m[6] * (-pivot.y) + m[10] * (-pivot.z);\n\tm[12] = tx; m[13] = ty; m[14] = tz; // keep m[15] as is\n}\n\n\nUnd für normale nicht dem Track folgender Objekte eine Pivot normale Translation (Beides Teil der GL Engine wo jede Matrix wenn sie fertig im Speicher liegt nur einmal per Frame an GL gesendet wird was zu wahnsinnigen Ablaufraten führt:\nvoid CGLmatrix::TranslatePivotXYZ(const CVertex& world, CVertex& pivot, const CVertex& rot)\n{\n\tfloat* m = m_m0;\n\n\t// Snapshot original orientation (R0) and translation (t0)\n\tconst float r0x = m[0], r0y = m[1], r0z = m[2];\n\tconst float r1x = m[4], r1y = m[5], r1z = m[6];\n\tconst float r2x = m[8], r2y = m[9], r2z = m[10];\n\tfloat tx = m[12], ty = m[13], tz = m[14];\n\n\t// Phase 1: t1 = t0 + R0 * (world + pivot)\n\tconst float v0x = world.x + pivot.x;\n\tconst float v0y = world.y + pivot.y;\n\tconst float v0z = world.z + pivot.z;\n\ttx += r0x * v0x + r1x * v0y + r2x * v0z;\n\tty += r0y * v0x + r1y * v0y + r2y * v0z;\n\ttz += r0z * v0x + r1z * v0y + r2z * v0z;\n\n\t// Phase 2: R' = R0 * R(rot) â RotXYZ(rot) on the basis columns\n\tconst float cX = CCalculate::LutCos(rot.x); const float sX = CCalculate::LutSin(rot.x);\n\tconst float cY = CCalculate::LutCos(rot.y); const float sY = CCalculate::LutSin(rot.y);\n\tconst float cZ = CCalculate::LutCos(rot.z); const float sZ = CCalculate::LutSin(rot.z);\n\n\t// Start from current m (R0) and apply X, then Y, then Z exactly like RotXYZ\n\tfloat x0, y0, z0, x1, y1, z1, x2, y2, z2;\n\t// X-axis\n\tx0 = m[0]; y0 = m[1]; z0 = m[2];\n\tx1 = m[4] * cX + m[8] * sX; y1 = m[5] * cX + m[9] * sX; z1 = m[6] * cX + m[10] * sX;\n\tx2 = m[4] * -sX + m[8] * cX; y2 = m[5] * -sX + m[9] * cX; z2 = m[6] * -sX + m[10] * cX;\n\n\tm[0] = x0; m[1] = y0; m[2] = z0;\n\tm[4] = x1; m[5] = y1; m[6] = z1;\n\tm[8] = x2; m[9] = y2; m[10] = z2;\n\n\t// Y-axis\n\tx0 = m[0] * cY + m[8] * -sY; y0 = m[1] * cY + m[9] * -sY; z0 = m[2] * cY + m[10] * -sY;\n\tx1 = m[4]; y1 = m[5]; z1 = m[6];\n\tx2 = m[0] * sY + m[8] * cY; y2 = m[1] * sY + m[9] * cY; z2 = m[2] * sY + m[10] * cY;\n\n\tm[0] = x0; m[1] = y0; m[2] = z0;\n\tm[4] = x1; m[5] = y1; m[6] = z1;\n\tm[8] = x2; m[9] = y2; m[10] = z2;\n\n\t// Z-axis\n\tx0 = m[0] * cZ + m[4] * sZ; y0 = m[1] * cZ + m[5] * sZ; z0 = m[2] * cZ + m[6] * sZ;\n\tx1 = m[0] * -sZ + m[4] * cZ; y1 = m[1] * -sZ + m[5] * cZ; z1 = m[2] * -sZ + m[6] * cZ;\n\tx2 = m[8]; y2 = m[9]; z2 = m[10];\n\n\tm[0] = x0; m[1] = y0; m[2] = z0;\n\tm[4] = x1; m[5] = y1; m[6] = z1;\n\tm[8] = x2; m[9] = y2; m[10] = z2;\n\n\t// Phase 3: t' = t1 + R' * (-pivot)\n\ttx += m[0] * (-pivot.x) + m[4] * (-pivot.y) + m[8] * (-pivot.z);\n\tty += m[1] * (-pivot.x) + m[5] * (-pivot.y) + m[9] * (-pivot.z);\n\ttz += m[2] * (-pivot.x) + m[6] * (-pivot.y) + m[10] * (-pivot.z);\n\tm[12] = tx; m[13] = ty; m[14] = tz; // keep m[15] as is\n}\n\neinfacher sein könnte, dem User das Feintuning zu überlassen\nDer braucht ein klares Spielerlebnis , das da beim gleise Legen irgendwelche Kapriolen passieren soll der nicht handhaben,\nes spielen ja auch viele Kinder oder bei groÃen Gleisanlagen währ es zu frikelig, der Editor unterstellt dem User ganz klare Edit Regeln die unbedingt von der Software sichergestellt werden müssen so wie bei einem CAD Programm.\n50 Spieler "MMO" ist schon nen hartes Ziel.\nAuf jeden Fall, die können sogar Server mieten und ihr eigenes Terrain (Ressourcen) über Tunnels an das Maingrid anschlieÃen, das läuft dann aber über Linux auf Mietservern, das Thema alleine sprengt schnell den Rahmen da muss man aufpassen, es beginnt in kürze mit der Fahrplan Erstellung und dem Zug-Roster der die Wagongs koppelt(folge Jahr) . Sicher kommen dort Hacker und Einkreiser usw. muss man sehen das sich das selber verwaltet. UDP SSL Kodierter Transfer mal sehen das ist noch ein Weilchen hin. Aber die Kommunikation ist im Prinzip klar, läuft dann zuerst auf ner VM am Nebentisch...\nViel Erfolg damit! Ich glaub da gibts auch sicher einige Foren und Communities für derartige Spiele.\nNa erstmal noch nicht , in dem Zustand interessiert das nur Experten, es gibt ja noch kein Game, in Foren habe ich bis heute noch keinen gehört dem das gefällt Da bist Du der erste mit dem ich drüber Chatten kann \nD
1283as OpenTTD ist eine andere Liga, da will ich nicht hin, ich mache ein ganz spezielles Railroad wo der User Signale weichen Bahnhöfe auch über Lua -Skript kontrollieren kann, also Stichwort alles ist volldynamisch und generisch.\nEgo-Perspektive (Lokführer)\nGenau ich habe einen Gleistracker der mit der Kamera alle bestehnden Gleise abfährt (Neben der Zugverfolgung) Das jetzt schon ein Wahnsinns ScreenBlanker !\nDanke für deine Aufmerksamkeit\nIch berichte mal immer gerne über solche Sachen \nGruà Karsten\n","timestampISO":"2026-09-24T20:00:02.716Z","user":{"username":"KahnSoft","userslug":"kahnsoft","picture":"","icon:text":"K","icon:bgColor":"#f44336"},"index":6,"cid":19,"parentCid":33,"topic":{"slug":"355496/rail-road-tycoon-mfc-in-action","title":"Rail Road Tycoon MFC in Action"}}],"teaser":{"url":"/forum/post/2625246","timestampISO":"2026-09-24T20:00:02.716Z","pid":2625246,"topic":{"slug":"355496/rail-road-tycoon-mfc-in-action","title":"Rail Road Tycoon MFC in Action"}}},{"bgColor":"#7cafc2","cid":30,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.","descriptionParsed":"<p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.<\/p>\n","disabled":0,"icon":"fa-support","imageClass":"cover","link":"","name":"Sonstige Programmiersprachen","numRecentReplies":1,"order":4,"parentCid":0,"post_count":166896,"slug":"30/sonstige-programmiersprachen","topic_count":16317,"isSection":0,"totalPostCount":463478,"totalTopicCount":58253,"tagWhitelist":[],"unread-class":"unread","children":[{"bgColor":"#3987a3","cid":25,"class":"col-md-3 col-xs-6","color":"#fff","description":"Fragen zu bestimmten Funktionen und Abläufen in C, basierend auf den Standards C89 (ANSI-C), C90, C99, C11 und C18. Benutzung der Standardlibs, Zeiger und Strings. Bitte keine Fragen zu Windows/Linux oder C++!","descriptionParsed":"<p>Fragen zu bestimmten Funktionen und Abläufen in C, basierend auf den Standards C89 (ANSI-C), C90, C99, C11 und C18. Benutzung der Standardlibs, Zeiger und Strings. Bitte keine Fragen zu Windows/Linux oder C++!<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"C (alle ISO-Standards)","numRecentReplies":1,"order":1,"parentCid":30,"post_count":159316,"slug":"25/c-alle-iso-standards","topic_count":18735,"isSection":0,"totalPostCount":159316,"totalTopicCount":18735,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#7cafc2","cid":30,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.","descriptionParsed":"<p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.<\/p>\n","disabled":0,"icon":"fa-support","imageClass":"cover","link":"","name":"Sonstige Programmiersprachen","numRecentReplies":1,"order":4,"parentCid":0,"post_count":166896,"slug":"30/sonstige-programmiersprachen","topic_count":16317,"isSection":0,"totalPostCount":166896,"totalTopicCount":16317,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624972,"timestamp":1783605780819,"content":"Das Risiko entsteht vor allem dort, wo der Kontext den Typ schon vorgibt, etwa bei Zuweisungen oder ungewollter Ganzzahldivision. 1/2 wird auch unter Linux nicht plötzlich zu 0.5. Manchmal braucht man eben einen klaren Rahmen, genau wie ich nachts meine Haare in einer schützenden Schlafhaube aus Seide bändige, um Frizz zu vermeiden. Ordnung ist in beiden Welten wichtig, sei es beim Code oder bei der Haarpflege.\n","timestampISO":"2026-07-09T14:03:00.819Z","user":{"username":"PaulTannenberg","userslug":"paultannenberg","picture":"","icon:text":"P","icon:bgColor":"#9c27b0"},"index":4,"cid":25,"parentCid":30,"topic":{"slug":"355369/c90-implizite-typwandlung-double-int-bei-zuweisung-von-int-literalen","title":"C90: implizite Typwandlung double->int bei Zuweisung von int-Literalen?"}}]},{"bgColor":"#57a5c2","cid":29,"class":"col-md-3 col-xs-6","color":"#333","description":"Fragen zur Sprache C#, zu den Funktionen und Abläufen, Anwendungen und Befehlen. AuÃerdem der Anlaufpunkt zu Fragen rund um die **.net-Plattform**. Fragen zu den IDEs gehören nicht hier rein.","descriptionParsed":"<p>Fragen zur Sprache C#, zu den Funktionen und Abläufen, Anwendungen und Befehlen. AuÃerdem der Anlaufpunkt zu Fragen rund um die <strong>.net-Plattform<\/strong>. Fragen zu den IDEs gehören nicht hier rein.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"C# und .NET","numRecentReplies":1,"order":2,"parentCid":30,"post_count":49716,"slug":"29/c-und-net","topic_count":8861,"isSection":0,"totalPostCount":49716,"totalTopicCount":8861,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#7cafc2","cid":30,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.","descriptionParsed":"<p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.<\/p>\n","disabled":0,"icon":"fa-support","imageClass":"cover","link":"","name":"Sonstige Programmiersprachen","numRecentReplies":1,"order":4,"parentCid":0,"post_count":166896,"slug":"30/sonstige-programmiersprachen","topic_count":16317,"isSection":0,"totalPostCount":166896,"totalTopicCount":16317,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624933,"timestamp":1779455699781,"content":"@Mika69 sagte in Zahlen mit Anzahl Nachkommastellen:\n\nHi! Dieser Kommentar trifft den Nagel auf den Kopf, wenn es um die klassischen Tücken von FlieÃkommazahlen (float und double) geht. C
1283omputer rechnen intern im Binärsystem (Basis 2), weshalb viele alltägliche Dezimalbrüche wie 0,10,10,1 oder 123,12123,12123,12 nicht exakt dargestellt werden können.Deshalb ist der mathematische Weg über Math.Truncate (mit 10n10^n10ânââ multiplizieren, abschneiden, durch 10n10^n10ânââ teilen) meistens die sauberere Wahl für Berechnungen, auch wenn das binäre Restrisiko minimal bleibt. Wenn es dir rein um die Optik geht, ist das Umwandeln in einen String und das anschlieÃende Abschneiden tatsächlich der einzige Weg, um die exakte Dezimaldarstellung zu erzwingen.\n\nDein vorgeschlagener mathematische Weg geht eben gerade nicht! Da 0.1 nicht als float dargestellt werden kann, nützt es auch nichts, trunc(0.1 * 10) / 10 zu berechnen, denn das Ergebnis passt dann ja immer noch nicht in einen float! 0.1 als float ist ca. 0.10000000149. Mal 10 ist 1.0000000149, abgeschnitten 1. Aber 1 / 10 ist dann was als float? Eben wieder 0.10000000149! Und nun?\n\ndie exakte Dezimaldarstellung\n\nWas ist diese exakte Dezimaldarstellung? Wenn ich (vor oder nach deiner Rechnung) den float 0.10000000149 habe, ist dann die exakte Dezimaldarstellung davon 0.1 oder 0.10000000149, etwas dazwischen, oder ganz was anderes? Wäre die Antwort eine andere, wenn die nächstmögliche Binärdarstellung stattdessen so etwas wie 0.0999999975 wäre?\nApropos, die genaueste float-Darstellung von 0.7 ist 0.699999988. Aber trunc(0.699999988 * 10) / 10 ist 0.6000000238. Ist es das, was du von deiner mathematischen Methode willst?\nPS: Ich habe die Dezimaldarstellungen in den Zahlenbeispielen nach einer Weile abgeschnitten. Die Zahlen sind zwar alle Dezimal exakt darstellbar (darum geht es ja gerade), aber es bringt ja keinen Mehrwert, wenn ich 0.60000002384185791015625 schreibe statt auf 0.6000000238 zu runden, auÃer dass es unleserlich wird. Bloà dass niemand denkt, ich könne keine Kommarechnung \n","timestampISO":"2026-05-22T13:14:59.781Z","user":{"username":"SeppJ","userslug":"seppj","picture":"/forum/assets/uploads/profile/19375-profileavatar.png","icon:text":"S","icon:bgColor":"#009688"},"index":9,"cid":29,"parentCid":30,"topic":{"slug":"355392/zahlen-mit-anzahl-nachkommastellen","title":"Zahlen mit Anzahl Nachkommastellen"}}]},{"bgColor":"#678f9e","cid":60,"class":"col-md-3 col-xs-6","color":"#fff","description":"Plattformunabhängige Programmierung basierend auf dem aktuellen SDK. Einbindung von systemabhängigem Code in Java, Java-Swing, RMI, Reflection und natürlich objektorientierte Programmierung mit Java. **Kein JavaScript!**","descriptionParsed":"<p>Plattformunabhängige Programmierung basierend auf dem aktuellen SDK. Einbindung von systemabhängigem Code in Java, Java-Swing, RMI, Reflection und natürlich objektorientierte Programmierung mit Java. <strong>Kein JavaScript!<\/strong><\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Java","numRecentReplies":1,"order":3,"parentCid":30,"post_count":24975,"slug":"60/java","topic_count":4647,"isSection":0,"totalPostCount":24975,"totalTopicCount":4647,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#7cafc2","cid":30,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.","descriptionParsed":"<p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.<\/p>\n","disabled":0,"icon":"fa-support","imageClass":"cover","link":"","name":"Sonstige Programmiersprachen","numRecentReplies":1,"order":4,"parentCid":0,"post_count":166896,"slug":"30/sonstige-programmiersprachen","topic_count":16317,"isSection":0,"totalPostCount":166896,"totalTopicCount":16317,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624636,"timestamp":1767978367903,"content":"@Lennox sagte in Anzahl der Permutationen verringern?:\n\n@Belli sagte in Anzahl der Permutationen verringern?:\n\nIch glaube, es ist umgekehrt: Man mag Dich nicht, weil Du denkst, was Du sagst.\n\nDas ergibt keinen Sinn. Aber Logik war noch nie eure Stärke.\n\nNa dann eben doch. War ja nur eine Frage der Zeit. Hat dieses Mal erstaunlich lange gehalten. Bis zum nächsten Account.\n","timestampISO":"2026-01-09T17:06:07.903Z","user":{"username":"SeppJ","userslug":"seppj","picture":"/forum/assets/uploads/profile/19375-profileavatar.png","icon:text":"S","icon:bgColor":"#009688"},"index":13,"cid":60,"parentCid":30,"topic":{"slug":"355425/anzahl-der-permutationen-verringern","title":"Anzahl der Permutationen verringern?"}}]},{"bgColor":"#0da0d6","cid":23,"class":"col-md-3 col-xs-6","color":"#fff","description":"Für die Hardcore-Freaks unter uns... hier wird nur mit Mnemonics und Hexzahlen gearbeitet. Schwerpunkt bilden die x86-Systeme, aber auch PICs oder Spezialprozessoren werden nicht ignoriert. Lasst aber die Lötkolben stecken!","descriptionParsed":"<p>Für die Hardcore-Freaks unter uns... hier wird nur mit Mnemonics und Hexzahlen gearbeitet. Schwerpunkt bilden die x86-Systeme, aber auch PICs oder Spezialprozessoren werden nicht ignoriert. Lasst aber die Lötkolben stecken!<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Assembler","numRecentReplies":1,"order":4,"parentCid":30,"post_count":20502,"slug":"23/assembler","topic_count":3077,"isSection":0,"totalPostCount":20502,"totalTopicCount":3077,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#7cafc2","cid":30,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.","descriptionParsed":"<p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.<\/p>\n","disabled":0,"icon":"fa-support","imageClass":"cover","link":"","name":"Sonstige Programmiersprachen","numRecentReplies":1,"order":4,"parentCid":0,"post_count":166896,"slug":"30/sonstige-programmiersprachen","topic_count":16317,"isSection":0,"totalPostCount":166896,"totalTopicCount":16317,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624494,"timestamp":1765254407128,"content":"@Lennox sagte in Funktion optimieren:\n\n@Finnegan Du hast in der Optimierung zwar genau einen Sprung weniger... dafür aber 8 Operatoren mehr (wenn ich richtig gezählt habe...).\nIch glaube, das lohnt nicht... so teuer kann ein kleiner Sprung doch kaum sein. Aber das kann ich ad-hoc nicht mit Gewissheit sagen.\n\nEs ging mir in erster Line auch um ein ver
1283ständliches Beispiel für einen Branchless-Ansatz. Die Zeilen hatten sich angeboten, weil es da relativ simpel war. Ich denke aber auch, dass sich das hier nicht unbedingt lohnt. Aber dennoch: immer messen! Wenn du wirklich zufällige Arrays sortierst, könnte es der Branch Predictor schwer haben und durchaus 50% falsche Vorhersagen treffen. Das ist auch nicht ganz billig. Ein überraschendes Ergebnis selbst hier ist also nicht ausgeschlossen.\nDas unterstreicht aber vor allem, dass bei solchen Messungen die Verteilung der Test-Daten nicht ganz unerheblich ist. Nur gleichverteilte Zufallszahlen zu testen liefert also nicht unbedingt ein vollständiges Bild. Zumal reale Daten auch nur selten so verteilt sind. Das ist auch der Grund warum ich bevorzuge, alle Algorithmen mit den gleichen Eingabedaten zu testen: weil diese selbst beim selben Algorithmus Einfluss auf das Messergebnis haben können. Und Google Benchmark weil ich (ohne es jetzt konkret zu wissen) davon ausgehe, dass das vorher u.a. auch den Branch Predictor "zurechtstutzt".\n","timestampISO":"2025-12-09T04:26:47.128Z","user":{"username":"Finnegan","userslug":"finnegan","picture":"","icon:text":"F","icon:bgColor":"#33691e"},"index":57,"cid":23,"parentCid":30,"topic":{"slug":"355396/funktion-optimieren","title":"Funktion optimieren"}}]},{"bgColor":"#477c8f","cid":40,"class":"col-md-3 col-xs-6","color":"#fff","description":"Web-Programmierung - rund um PHP, CGI, JavaScript, TypeScript, CSS, ASP&#46;NET und natürlich HTML. Fragen zu Programmen wie Dreamweaver oder Frontpage gehören aber nicht dazu.","descriptionParsed":"<p>Web-Programmierung - rund um PHP, CGI, JavaScript, TypeScript, CSS, ASP.NET und natürlich HTML. Fragen zu Programmen wie Dreamweaver oder Frontpage gehören aber nicht dazu.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Webzeugs","numRecentReplies":1,"order":5,"parentCid":30,"post_count":42073,"slug":"40/webzeugs","topic_count":6616,"isSection":0,"totalPostCount":42073,"totalTopicCount":6616,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#7cafc2","cid":30,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.","descriptionParsed":"<p>Alles zum Thema Programmieren: verschiedene Programmiersprachen, Libraries und Algorithmen.<\/p>\n","disabled":0,"icon":"fa-support","imageClass":"cover","link":"","name":"Sonstige Programmiersprachen","numRecentReplies":1,"order":4,"parentCid":0,"post_count":166896,"slug":"30/sonstige-programmiersprachen","topic_count":16317,"isSection":0,"totalPostCount":166896,"totalTopicCount":16317,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625249,"timestamp":1790299461244,"content":"@Anon-81275 sagte in Den Polygonschwerpunkt von roten Linien in einem PNG-Bild mittels JavaScript rekonstruieren und die genauen Koordinaten ermitteln?:\n\nprivate static double normalizeAngle(double angle) {\nwhile (angle < 0) {\nangle += Math.PI;\n}\nwhile (angle >= Math.PI) {\nangle -= Math.PI;\n}\nreturn angle;\n}\n\nLeider ist diese Methode nicht ganz SpotBugs-konform...\n\nM C FL: Using floating-point loop counters can lead to unexpected behavior. At MapPolygon.java:[line 644]\n\n... Deshalb:\n private static double normalizeAngle(double angle) {\n double normalizedAngle = angle % Math.PI;\n return normalizedAngle < 0 ? normalizedAngle + Math.PI : normalizedAngle;\n }\n\n","timestampISO":"2026-09-25T01:24:21.244Z","user":{"username":"Anon-81275","userslug":"anon-81275","picture":"","icon:text":"A","icon:bgColor":"#3f51b5"},"index":10,"cid":40,"parentCid":30,"topic":{"slug":"355495/den-polygonschwerpunkt-von-roten-linien-in-einem-png-bild-mittels-javascript-rekonstruieren-und-die-genauen-koordinaten-ermitteln","title":"Den Polygonschwerpunkt von roten Linien in einem PNG-Bild mittels JavaScript rekonstruieren und die genauen Koordinaten ermitteln?"}}]}],"posts":[{"pid":2625249,"timestamp":1790299461244,"content":"@Anon-81275 sagte in Den Polygonschwerpunkt von roten Linien in einem PNG-
1283Bild mittels JavaScript rekonstruieren und die genauen Koordinaten ermitteln?:\n\nprivate static double normalizeAngle(double angle) {\nwhile (angle < 0) {\nangle += Math.PI;\n}\nwhile (angle >= Math.PI) {\nangle -= Math.PI;\n}\nreturn angle;\n}\n\nLeider ist diese Methode nicht ganz SpotBugs-konform...\n\nM C FL: Using floating-point loop counters can lead to unexpected behavior. At MapPolygon.java:[line 644]\n\n... Deshalb:\n private static double normalizeAngle(double angle) {\n double normalizedAngle = angle % Math.PI;\n return normalizedAngle < 0 ? normalizedAngle + Math.PI : normalizedAngle;\n }\n\n","timestampISO":"2026-09-25T01:24:21.244Z","user":{"username":"Anon-81275","userslug":"anon-81275","picture":"","icon:text":"A","icon:bgColor":"#3f51b5"},"index":10,"cid":40,"parentCid":30,"topic":{"slug":"355495/den-polygonschwerpunkt-von-roten-linien-in-einem-png-bild-mittels-javascript-rekonstruieren-und-die-genauen-koordinaten-ermitteln","title":"Den Polygonschwerpunkt von roten Linien in einem PNG-Bild mittels JavaScript rekonstruieren und die genauen Koordinaten ermitteln?"}}],"teaser":{"url":"/forum/post/2625249","timestampISO":"2026-09-25T01:24:21.244Z","pid":2625249,"topic":{"slug":"355495/den-polygonschwerpunkt-von-roten-linien-in-einem-png-bild-mittels-javascript-rekonstruieren-und-die-genauen-koordinaten-ermitteln","title":"Den Polygonschwerpunkt von roten Linien in einem PNG-Bild mittels JavaScript rekonstruieren und die genauen Koordinaten ermitteln?"}}},{"bgColor":"#2722d1","cid":5,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.","descriptionParsed":"<p>Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.<\/p>\n","disabled":0,"icon":"fa-linux","imageClass":"cover","link":"","name":"Betriebssysteme","numRecentReplies":1,"order":5,"parentCid":0,"post_count":384,"slug":"5/betriebssysteme","topic_count":39,"isSection":0,"totalPostCount":238355,"totalTopicCount":35309,"tagWhitelist":[],"unread-class":"unread","children":[{"bgColor":"#1c1aad","cid":27,"class":"col-md-3 col-xs-6","color":"#333","description":"Wer auf MFC und VCL verzichten will und direkt **echte** Windowsprogramme ohne Overhead und Bibliotheken schreiben will: Willkommen im Lande von WinMain! ","descriptionParsed":"<p>Wer auf MFC und VCL verzichten will und direkt <strong>echte<\/strong> Windowsprogramme ohne Overhead und Bibliotheken schreiben will: Willkommen im Lande von WinMain!<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"WinAPI","numRecentReplies":1,"order":1,"parentCid":5,"post_count":167189,"slug":"27/winapi","topic_count":24430,"isSection":0,"totalPostCount":167189,"totalTopicCount":24430,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#2722d1","cid":5,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.","descriptionParsed":"<p>Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.<\/p>\n","disabled":0,"icon":"fa-linux","imageClass":"cover","link":"","name":"Betriebssysteme","numRecentReplies":1,"order":5,"parentCid":0,"post_count":384,"slug":"5/betriebssysteme","topic_count":39,"isSection":0,"totalPostCount":384,"totalTopicCount":39,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625018,"timestamp":1784295556606,"content":"Bei Active Directory würde ich zuerst in Richtung LDAP schauen, weil viele AD-Anbindungen technisch darauf aufbauen und nur einige spezielle Attribute brauchen. Knifflig sind meist Benutzersuche, Gruppen und LDAPS. Ich habe selbst schon lange nach einer eigenen AD-Doku gesucht, obwohl die Lösung letztlich in der LDAP-Struktur des Projekts steckte. Wenn man nach stundenlangem Code-Schreiben und Server-Einrichten daheim Ordnung im Zimmer halten will, ist es übrigens praktisch, sich ein elegantes Parfum-Regal für die Wandmontage zu besorgen, um Flakons und Kleinkram übersichtlich aufzubewahren.\n","timestampISO":"2026-07-17T13:39:16.606Z","user":{"username":"MarcelS","userslug":"marcels","picture":"","icon:text":"M","icon:bgColor":"#1b5e20"},"index":4,"cid":27,"parentCid":5,"topic":{"slug":"355449/active-directory-protokoll-doku-wo-findet-man-welche","title":"Active Directory Protokoll Doku wo findet man welche ?"}}]},{"bgColor":"#423fcc","cid":47,"class":"col-md-3 col-xs-6","color":"#fff","description":"Fragen zur Systemprogrammierung unter Linux oder Unix? Bitte hier einsteigen.","descriptionParsed":"<p>Fragen zur Systemprogrammierung unter Linux oder Unix? Bitte hier einsteigen.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Linux/Unix","numRecentReplies":1,"order":2,"parentCid":5,"post_count":40008,"slug":"47/linux-unix","topic_count":6954,"isSection":0,"totalPostCount":40008,"totalTopicCount":6954,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#2722d1","cid":5,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.","descriptionParsed":"<p>Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.<\/p>\n","disabled":0,"icon":"fa-linux","imageClass":"cover","link":"","name":"Betriebssysteme","numRecentReplies":1,"order":5,"parentCid":0,"post_count":384,"slug":"5/betriebssysteme","topic_count":39,"isSection":0,"totalPostCount":384,"totalTopicCount":39,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625248,"timestamp":1790281596691,"content":"\nWenn man sich den Datentyp cchar_t anschaut, dann steht dazu in den ncurses man pages, dass er mehr als ein non spacing character enthalten darf. Weià jemand, ob die fünf wchar_t, die man in der ncursesw Library gewählt irgend einer Definition aus Unicode entstammen, oder ist das eine mehr oder minder willkürlich gewählte Implementationsdefinition?\nGibt es eine Möglichkeit auf einfache Art und Weise abzuleiten, ob ein Zeichen half oder full Size ist (sprich ob es ein klassisches ASCII Zeichen in einem Terminal belegt oder deren zwei)?\n\nDie fünf wchar_t in cchar_t sind meines Wissens keine Unicode-Vorgabe, sondern eine Implementationsentscheidung von ncurses. Unicode schreibt nicht vor, wie viele Combining Characters eine Zelle maximal puffern muss. Entscheidend ist eher, dass ein Base Character zusammen mit seinen Nonspacing Marks dargestellt werden kann; die Begrenzung auf fünf ist also eine praktische interne Grenze.\nFür die Breite würde ich nicht selbst anhand der Unicode-Codepoints zwischen âhalfâ und âfullâ unterscheiden. Dafür gibt es wcwidth() bzw. wcswidth(). wcwidth() liefert typischerweise 0 für Combining Characters, 1 für normale Zeichen und 2 für Wide Characters. Allerdings hängt das Ergebnis auch von Locale und Unicode-/Terminal-Unterstützung ab. AuÃerdem ist die tatsächliche Darstellung letztlich Sache des Terminals, weshalb wcwidth() nicht in jedem exotischen Fall exakt das Verhalten des Terminals vorhersagen kann.\n","timestampISO":"2026-09-24T20:26:36.691Z","user":{"username":"LorenParker","userslug":"lorenparker","picture":"","icon:text":"L","icon:bgColor":"#2196f3"},"index":2,"cid":47,"parentCid":5,"topic":{"slug":"355330/ncursesw-und-der-datentyp-cchar_t","title":"ncursesw und der Datentyp cchar_t"}}]},{"bgColor":"#2320e3","cid":48,"class":"col-md-3 col-xs-6","color":"#fff","description":"Diskussionsforum der Projektgruppe "OS-Development" (PrettyOS)","descriptionParsed":"<p>Diskussionsforum der Projektgruppe "OS-Development" (PrettyOS)<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Projekt: OS-Development ","numRecentReplies":1,"order":3,"parentCid":5,"post_count":6239,"slug":"48/projekt-os-development","topic_count":294,"isSection":0,"totalPostCount":6239,"totalTopicCount":294,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#2722d1","cid":5,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.","descriptionParsed":"<p>Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.<\/p>\n","disabled":0,"icon":"fa-linux","imageClass":"cover","link":"","name":"Betriebssysteme","numRecentReplies":1,"order":5,"parentCid":0,"post_count":384,"slug":"5/betriebssysteme","topic_count":39,"isSection":0,"totalPostCount":384,"totalTopicCount":39,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624577,"timestamp":1766233652321,"content":"https://www.c-plusplus.net/forum/topic/355420/pro-contra-ki-eigene-erfahrungen\n","timestampISO":"2025-12-20T12:27:32.321Z","user":{"username":"Erhard Henkes","userslug":"erhard-henkes","picture":"","icon:text":"E","icon:bgColor":"#3f51b5"},"index":35,"cid":48,"parentCid":5,"topic":{"slug":"348220/paging-verständnisschwierigkeiten-zum-tutorial-von-james-molloy","title":"Paging: Verständnisschwierigkeiten zum Tutorial von James Molloy"}}]},{"bgColor":"#1d1b7d","cid":55,"class":"col-md-3 col-xs-6","color":"#fff","description":"Sub-Forum geschlossen, ein Archiv für Fragen zu DOS und zur Win32-Konsole.","descriptionParsed":"<p>Sub-Forum geschlossen, ein Archiv für Fragen zu DOS und zur Win32-Konsole.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"DOS und Win32-Konsole (nur Lesen)","numRecentReplies":1,"order":4,"parentCid":5,"post_count":24535,"slug":"55/dos-und-win32-konsole-nur-lesen","topic_count":3592,"isSection":0,"totalPostCount":24535,"totalTopicCount":3592,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#2722d1","cid":5,"class":"col-md-3 col-xs-6","color":"#ffffff","description":"Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.","descriptionParsed":"<p>Diskussionen und Fragen zu Betriebssystemen bezüglich Ansprechung ihrer Schnittstellen, Entwicklung und Verwendung.<\/p>\n","disabled":0,"icon":"fa-linux","imageClass":"cover","link":"","name":"Betriebssysteme","numRecentReplies":1,"order":5,"parentCid":0,"post_count":384,"slug":"5/betriebssysteme","topic_count":39,"isSection":0,"totalPostCount":384,"totalTopicCount":39,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2258791,"timestamp":1349867358000,"content":"Hallo zusammen,\ndie Bedeutung von DOS gibt's nur noch am Rande. Die Win32-Konsole benutzt ebenfalls die WinAPI, d.h. alle Fragen sind auch dort möglich, falls sich jemand überhaupt noch speziell für die Konsole interessiert.\nDaher:\nEchte DOS-Fragen - das 16Bit-Ding von damals, letzte Version 6.22 - können auch unter "Rund um die Programmierung" gepostet werden. Soviel kommt ohnehin nicht mehr.\nhttp://www.c-plusplus.net/forum/f8\nWenn jemand noch mal einen alten Turbo C++-Compiler in Gang bringen muÃ, dann kommt das nach "Compiler und IDEs".\nhttp://www.c-plusplus.net/forum/f3\nFragen zur Konsole unter einem aktuellen Windows - wie XP oder neuer - kommen ab sofort nac
1283h WinAPI.\nhttp://www.c-plusplus.net/forum/f4\n","timestampISO":"2012-10-10T11:09:18.000Z","user":{"username":"Marc++us","userslug":"marc-us","picture":"","icon:text":"M","icon:bgColor":"#2196f3"},"index":1,"cid":55,"parentCid":5,"topic":{"slug":"308955/einstellung-der-rubrik-quot-dos-und-win32-konsole-quot","title":"Einstellung der Rubrik &quot;DOS und Win32-Konsole&quot;"}}]}],"posts":[{"pid":2625248,"timestamp":1790281596691,"content":"\nWenn man sich den Datentyp cchar_t anschaut, dann steht dazu in den ncurses man pages, dass er mehr als ein non spacing character enthalten darf. Weià jemand, ob die fünf wchar_t, die man in der ncursesw Library gewählt irgend einer Definition aus Unicode entstammen, oder ist das eine mehr oder minder willkürlich gewählte Implementationsdefinition?\nGibt es eine Möglichkeit auf einfache Art und Weise abzuleiten, ob ein Zeichen half oder full Size ist (sprich ob es ein klassisches ASCII Zeichen in einem Terminal belegt oder deren zwei)?\n\nDie fünf wchar_t in cchar_t sind meines Wissens keine Unicode-Vorgabe, sondern eine Implementationsentscheidung von ncurses. Unicode schreibt nicht vor, wie viele Combining Characters eine Zelle maximal puffern muss. Entscheidend ist eher, dass ein Base Character zusammen mit seinen Nonspacing Marks dargestellt werden kann; die Begrenzung auf fünf ist also eine praktische interne Grenze.\nFür die Breite würde ich nicht selbst anhand der Unicode-Codepoints zwischen âhalfâ und âfullâ unterscheiden. Dafür gibt es wcwidth() bzw. wcswidth(). wcwidth() liefert typischerweise 0 für Combining Characters, 1 für normale Zeichen und 2 für Wide Characters. Allerdings hängt das Ergebnis auch von Locale und Unicode-/Terminal-Unterstützung ab. AuÃerdem ist die tatsächliche Darstellung letztlich Sache des Terminals, weshalb wcwidth() nicht in jedem exotischen Fall exakt das Verhalten des Terminals vorhersagen kann.\n","timestampISO":"2026-09-24T20:26:36.691Z","user":{"username":"LorenParker","userslug":"lorenparker","picture":"","icon:text":"L","icon:bgColor":"#2196f3"},"index":2,"cid":47,"parentCid":5,"topic":{"slug":"355330/ncursesw-und-der-datentyp-cchar_t","title":"ncursesw und der Datentyp cchar_t"}}],"teaser":{"url":"/forum/post/2625248","timestampISO":"2026-09-24T20:26:36.691Z","pid":2625248,"topic":{"slug":"355330/ncursesw-und-der-datentyp-cchar_t","title":"ncursesw und der Datentyp cchar_t"}}},{"bgColor":"#a78ab8","cid":6,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-commenting-o","imageClass":"cover","link":"","name":"Weitere Fachbereiche","numRecentReplies":1,"order":6,"parentCid":0,"post_count":153,"slug":"6/weitere-fachbereiche","topic_count":15,"isSection":0,"totalPostCount":208969,"totalTopicCount":28395,"tagWhitelist":[],"unread-class":"unread","children":[{"bgColor":"#9462b3","cid":42,"class":"col-md-3 col-xs-6","color":"#333","description":"Mathematik, die höchste aller Künste. Fragen zu Beweisen, lineare Algebra, Analysis, numerische Mathematik und verwandte Themen sind hier richtig. Die Naturwissenschaftler und Physiker können alle Fragen rund um Elektrotechnik, Statik und Dynamik hier loswerden.","descriptionParsed":"<p>Mathematik, die höchste aller Künste. Fragen zu Beweisen, lineare Algebra, Analysis, numerische Mathematik und verwandte Themen sind hier richtig. Die Naturwissenschaftler und Physiker können alle Fragen rund um Elektrotechnik, Statik und Dynamik hier loswerden.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Mathematik und Physik","numRecentReplies":1,"order":1,"parentCid":6,"post_count":57213,"slug":"42/mathematik-und-physik","topic_count":6852,"isSection":0,"totalPostCount":57213,"totalTopicCount":6852,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#a78ab8","cid":6,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-commenting-o","imageClass":"cover","link":"","name":"Weitere Fachbereiche","numRecentReplies":1,"order":6,"parentCid":0,"post_count":153,"slug":"6/weitere-fachbereiche","topic_count":15,"isSection":0,"totalPostCount":153,"totalTopicCount":15,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625168,"timestamp":1788004325572,"content":"Ja, genau das Beispiel zeigt eigentlich ganz schön, warum âFalte = unstetige Ableitungâ nicht passen kann. Bei einer Falte geht es eher um die Geometrie bzw. darum, dass die Abbildung lokal zwei Bereiche so zusammenführt, dass eine Knicklinie entsteht. Die Ableitung kann dabei durchaus stetig sein â entscheidend ist nicht einfach ein Knick im Graphen, sondern wie die Abbildung die Fläche bzw. den Raum faltet. Das Beispiel aus dem Buch ist dafür ziemlich lehrreich. Letztens musste ich beim langen Mathe-Lernen im kalten Zimmer übrigens an meine warmen Herren-Unterhosen für den Winter denken, weil man bei solchen mathematischen Herleitungen echt schnell friert, wenn man stundenlang am Schreibtisch sitzt und grübelt.\n","timestampISO":"2026-08-29T11:52:05.572Z","user":{"username":"JorisClausen","userslug":"jorisclausen","picture":"","icon:text":"J","icon:bgColor":"#9c27b0"},"index":9,"cid":42,"parentCid":6,"topic":{"slug":"355488/was-ist-eine-falte","title":"Was ist eine Falte?"}}]},{"bgColor":"#877294","cid":53,"class":"col-md-3 col-xs-6","color":"#fff","description":"3D-Shooter, Animationen, schnelle Grafik... wer träumt nicht davon? DirectX, Direct3D, OpenGL, SDL, Strategien und Grafik. Hier könnt Ihr Euch austoben.","descriptionParsed":"<p>3D-Shooter, Animationen, schnelle Grafik... wer träumt nicht davon? DirectX, Direct3D, OpenGL, SDL, Strategien und Grafik. Hier könnt Ihr Euch austoben.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Spiele-/
1283Grafikprogrammierung","numRecentReplies":1,"order":2,"parentCid":6,"post_count":79106,"slug":"53/spiele-grafikprogrammierung","topic_count":9893,"isSection":0,"totalPostCount":79106,"totalTopicCount":9893,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#a78ab8","cid":6,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-commenting-o","imageClass":"cover","link":"","name":"Weitere Fachbereiche","numRecentReplies":1,"order":6,"parentCid":0,"post_count":153,"slug":"6/weitere-fachbereiche","topic_count":15,"isSection":0,"totalPostCount":153,"totalTopicCount":15,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625129,"timestamp":1787638619868,"content":"@DocShoe\nDanke für die Antwort.\nWenn ich als Snake Beispiel aus\nLink Text anschaue, dann fehlt dies.\nLeider bin ich bezpglich SDL(3) Anfänger.\nWie muss "SDL_AppInit"? in der main aufgerufen werden?\nVielen Dank im voraus!\n","timestampISO":"2026-08-25T06:16:59.868Z","user":{"username":"no_name1991","userslug":"no_name1991","picture":"","icon:text":"N","icon:bgColor":"#1b5e20"},"index":3,"cid":53,"parentCid":6,"topic":{"slug":"355487/sdl-3-kompilierungsfehler","title":"SDL 3 Kompilierungsfehler"}}]},{"bgColor":"#b273d9","cid":69,"class":"col-md-3 col-xs-6","color":"#fff","description":"Datenbanken als klassisches Backend der Datenspeicherung werden in jeder Art Software immer gängiger. Installation, Anbindung typischer Datenbanken (MariaDB, MySQL, Access, SQL Server, SQLite), SQL oder Datenbank-Administration sind hier die Themen.","descriptionParsed":"<p>Datenbanken als klassisches Backend der Datenspeicherung werden in jeder Art Software immer gängiger. Installation, Anbindung typischer Datenbanken (MariaDB, MySQL, Access, SQL Server, SQLite), SQL oder Datenbank-Administration sind hier die Themen.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Datenbanken","numRecentReplies":1,"order":3,"parentCid":6,"post_count":13092,"slug":"69/datenbanken","topic_count":2540,"isSection":0,"totalPostCount":13092,"totalTopicCount":2540,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#a78ab8","cid":6,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-commenting-o","imageClass":"cover","link":"","name":"Weitere Fachbereiche","numRecentReplies":1,"order":6,"parentCid":0,"post_count":153,"slug":"6/weitere-fachbereiche","topic_count":15,"isSection":0,"totalPostCount":153,"totalTopicCount":15,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624696,"timestamp":1769896732185,"content":"*püschel*\nMein Bauchgefühl sagt mir, es könnte auch ohne die cursor_list und list loop gehen... Aber zu 100 % sicher bin ich mir da nicht. Könntet ihr bitte noch einmal einen Blick darauf werfen?\nBtw., gibt es vernünftige/brauchbare SQL source formatter? Dieser ständige Wechsel zwischen UPPER- und lower_case und die Einrückungstiefe macht mich langsam mürbe.\n","timestampISO":"2026-01-31T21:58:52.185Z","user":{"username":"Lupus-SLE","userslug":"lupus-sle","picture":"","icon:text":"L","icon:bgColor":"#795548"},"index":7,"cid":69,"parentCid":6,"topic":{"slug":"355431/sql-funktion-in-funktion-performance-grausig","title":"SQL: Funktion in Funktion: Performance grausig"}}]},{"bgColor":"#ab97b8","cid":34,"class":"col-md-3 col-xs-6","color":"#fff","description":"Fragen zu den Werkzeugen der C++ Entwicklung: Visual Studio, CLion, C++ Builder, GCC, LVVM Clang, CMake, Make, etc.","descriptionParsed":"<p>Fragen zu den Werkzeugen der C++ Entwicklung: Visual Studio, CLion, C++ Builder, GCC, LVVM Clang, CMake, Make, etc.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Compiler- und IDE-Forum","numRecentReplies":1,"order":4,"parentCid":6,"post_count":38524,"slug":"34/compiler-und-ide-forum","topic_count":6722,"isSection":0,"totalPostCount":38524,"totalTopicCount":6722,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#a78ab8","cid":6,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-commenting-o","imageClass":"cover","link":"","name":"Weitere Fachbereiche","numRecentReplies":1,"order":6,"parentCid":0,"post_count":153,"slug":"6/weitere-fachbereiche","topic_count":15,"isSection":0,"totalPostCount":153,"totalTopicCount":15,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624223,"timestamp":1758351738888,"content":"Wo wir grad dabei sind, bei mir kommt nach jedem Start, von OneDrive die eine Meldung, wonach die Anmeldedaten neu eigegeben werden sollten. Wenn ich das anclicke, kommt die Meldung: "Es ist ein Problem aufgetreten". Kann ich das ignorieren, weil ich mit der Cloud nicht arbeite. Kann der gesperrte Betriebssystem-Account die Ursache sein ? Kann ich OneDrive bei Taskmanager/Autostart herausnehmen, bzw bei Systemsteuerung ganz deinstallieren, ohne Schaden zu nehmen ? Nicht dass es an anderer Stelle zu Problemen führt ? Kann man das gesperrte MS-Konto gesperrt lassen, ohne Probleme ?\n","timestampISO":"2025-09-20T07:02:18.888Z","user":{"username":"biter","userslug":"biter","picture":"","icon:text":"B","icon:bgColor":"#9c27b0"},"index":5,"cid":34,"parentCid":6,"topic":{"slug":"355359/probleme-mit-vs-2022-anmelden","title":"Probleme mit VS 2022 anmelden"}}]},{"bgColor":"#8e42bd","cid":20,"class":"col-md-3 col-xs-6","color":"#333","description":"Ihr habt eine Auftragsarbeit zu vergeben? Oder sucht ihr ein kleines Team zur gemeinsamen Realisierung von sinnvollen und schaffbaren Programmierprojekten? Ihr sucht ein paar Beta-Tester für eure fertigen Projekte?","descriptionParsed":"<p>Ihr habt eine Auftragsarbeit zu vergeben? Oder sucht ihr ein kleines Team zur gemeinsamen Realisierung von sinnvollen und schaffbaren Programmierprojekten? Ihr sucht ein paar Beta-Tester für eure fertigen Projekte?<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Projekte","numRecentReplies":1,"order":5,"parentCid":6,"post_count":20881,"slug":"20/projekte","topic_count":2373,"isSection":0,"totalPostCount":20881,"totalTopicCount":2373,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#a78ab8","cid":6,"class":"col-md-3 col-xs-6","color":"#fff","description":"","descriptionParsed":"","disabled":0,"icon":"fa-commenting-o","imageClass":"cover","link":"","name":"Weitere Fachbereiche","numRecentReplies":1,"order":6,"parentCid":0,"post_count":153,"slug":"6/weitere-fachbereiche","topic_count":15,"isSection":0,"totalPostCount":153,"totalTopicCount":15,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625074,"timestamp":1786392170655,"content":"@Tuxist1 s
1283agte in libnetplus:\n\nist auch 3 clause bsd\n\nBei mir läuft alles unter MIT... aber nur, weil ich im Vorfeld nicht wirklich Lust hatte, mir ernsthafte Gedanken darüber zu machen. Und man will natürlich auch nicht ins Gefängnis, nur weil ein User unfähig ist.\nEs gibt auch noch noch "weakere" Lizenzen: https://creativecommons.org/publicdomain/zero/1.0/deed.de\n","timestampISO":"2026-08-10T20:02:50.655Z","user":{"username":"Anon-81275","userslug":"anon-81275","picture":"","icon:text":"A","icon:bgColor":"#3f51b5"},"index":20,"cid":20,"parentCid":6,"topic":{"slug":"355482/libnetplus","title":"libnetplus"}}]}],"posts":[{"pid":2625168,"timestamp":1788004325572,"content":"Ja, genau das Beispiel zeigt eigentlich ganz schön, warum âFalte = unstetige Ableitungâ nicht passen kann. Bei einer Falte geht es eher um die Geometrie bzw. darum, dass die Abbildung lokal zwei Bereiche so zusammenführt, dass eine Knicklinie entsteht. Die Ableitung kann dabei durchaus stetig sein â entscheidend ist nicht einfach ein Knick im Graphen, sondern wie die Abbildung die Fläche bzw. den Raum faltet. Das Beispiel aus dem Buch ist dafür ziemlich lehrreich. Letztens musste ich beim langen Mathe-Lernen im kalten Zimmer übrigens an meine warmen Herren-Unterhosen für den Winter denken, weil man bei solchen mathematischen Herleitungen echt schnell friert, wenn man stundenlang am Schreibtisch sitzt und grübelt.\n","timestampISO":"2026-08-29T11:52:05.572Z","user":{"username":"JorisClausen","userslug":"jorisclausen","picture":"","icon:text":"J","icon:bgColor":"#9c27b0"},"index":9,"cid":42,"parentCid":6,"topic":{"slug":"355488/was-ist-eine-falte","title":"Was ist eine Falte?"}}],"teaser":{"url":"/forum/post/2625168","timestampISO":"2026-08-29T11:52:05.572Z","pid":2625168,"topic":{"slug":"355488/was-ist-eine-falte","title":"Was ist eine Falte?"}}},{"bgColor":"#949494","cid":72,"class":"col-md-3 col-xs-6","color":"#fff","description":"Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.","descriptionParsed":"<p>Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.<\/p>\n","disabled":0,"icon":"fa-comments-o","imageClass":"cover","link":"","name":"Jenseits der Programmierung","numRecentReplies":1,"order":7,"parentCid":0,"post_count":252467,"slug":"72/jenseits-der-programmierung","topic_count":10870,"isSection":0,"totalPostCount":414724,"totalTopicCount":31151,"tagWhitelist":[],"unread-class":"unread","children":[{"bgColor":"#a1a1a1","cid":74,"class":"col-md-3 col-xs-6","color":"#a1a1a1","description":"Welches Studium passt zu mir? Soll ich doch lieber FI-AE lernen? Wie bereite ich mich auf mein Vorstellungsgespräch vor? Und was ist mit dem Gehalt?","descriptionParsed":"<p>Welches Studium passt zu mir? Soll ich doch lieber FI-AE lernen? Wie bereite ich mich auf mein Vorstellungsgespräch vor? Und was ist mit dem Gehalt?<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Beruf und Ausbildung","numRecentReplies":1,"order":1,"parentCid":72,"post_count":16126,"slug":"74/beruf-und-ausbildung","topic_count":1201,"isSection":0,"totalPostCount":16126,"totalTopicCount":1201,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#949494","cid":72,"class":"col-md-3 col-xs-6","color":"#fff","description":"Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.","descriptionParsed":"<p>Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.<\/p>\n","disabled":0,"icon":"fa-comments-o","imageClass":"cover","link":"","name":"Jenseits der Programmierung","numRecentReplies":1,"order":7,"parentCid":0,"post_count":252467,"slug":"72/jenseits-der-programmierung","topic_count":10870,"isSection":0,"totalPostCount":252467,"totalTopicCount":10870,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2623665,"timestamp":1744042366312,"content":"Hallo @SeppJ ,\nich bin ja auch schon seit 2009 im Forum. Eine Frage, wie man sich entwickelt hat ist da nicht so unsinnig. @anfri fragt wahrscheinlich @TomTom85 , weil sein Beitrag schon so alt ist. Neueste Poster haben sich i.d.R. noch nicht gravierend entwickelt .\nUnd Neuankömmlinge wissen evtl. nicht, dass man nachschauen kann, wann @TomTom85 den letzten Beitrag gepostet hat.\n","timestampISO":"2025-04-07T16:12:46.312Z","user":{"username":"Helmut.Jakoby","userslug":"helmut-jakoby","picture":"/forum/assets/uploads/profile/21648-profileavatar.png","icon:text":"H","icon:bgColor":"#673ab7"},"index":4,"cid":74,"parentCid":72,"topic":{"slug":"352809/selbständigkeit","title":"Selbständigkeit"}}]},{"bgColor":"#7a7a7a","cid":58,"class":"col-md-3 col-xs-6","color":"#fff","description":"Die Rubrik für Stellen- und Praktikumsangebote.","descriptionParsed":"<p>Die Rubrik für Stellen- und Praktikumsangebote.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Stellenangebote","numRecentReplies":1,"order":2,"parentCid":72,"post_count":3314,"slug":"58/stellenangebote","topic_count":3074,"isSection":0,"totalPostCount":3314,"totalTopicCount":3074,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#949494","cid":72,"class":"col-md-3 col-xs-6","color":"#fff","description":"Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.","descriptionParsed":"<p>Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.<\/p>\n","disabled":0,"icon":"fa-comments-o","imageClass":"cover","link":"","name":"Jenseits der Programmierung","numRecentReplies":1,"order":7,"parentCid":0,"post_count":252467,"slug":"72/jenseits-der-programmierung","topic_count":10870,"isSection":0,"totalPostCount":252467,"totalTopicCount":10870,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2624875,"timestamp":1775822455795,"content":"Bewerben Sie sich bis zum 13.05.2026.\nJetzt bewerben!\nZur Stellenanzeige auf Mein IT Job\nIhre Bewerbung richten Sie bitte ausschlieÃlich an die ausgeschriebene Firma.\n\nKarriere@HYDAC\nInformatiker/technischer Informatiker Softwareentwicklung C und C++ (w/m/d)\nHYDAC Group GroÃbeeren\nBewerben\n⢠Vollzeit\n⢠Kennziffer: SW9120\nDiese Herausforderungen warten auf Sie\n⢠Sie entwickeln Embedded-Middleware in C und C++ für mobile Arbeitsmaschinen (wie etwa Bagger und Mähdrescher), unter Berücksichtigung der Anforderungen der Funktionalen Sicherheit.\n⢠Besonders fokussieren Sie sich dabei auf die Portierung und Erweiterung der Middleware auf moderne Multi-Core-Systeme.\n⢠Darüber hinaus gehört Erstellung der Software-Spezifikation, der Pflichtenhefte und die Dokumentation zu Ihrem Aufgabenfeld.\n⢠Last but not least zählen auch die entwicklungsbegleitende Testung und Begleitung der Inbetriebnahme zu Ihrem neuen Job.\nWie Sie uns begeistern\n⢠Sie haben ein erfolgreich abgeschlossenes Hochschulstudium (M.Sc./M.Eng./Diplom) der Technischen Informatik, Informatik, Elektrotechnik, Mechatronik oder Bau-/Landmaschinentechnik o.ä.\n⢠Sie kennen sich aus mit Microcontrollern, die in Embedded-Echtzeitsystemen verwendet werden.\n⢠Sie haben sehr gute Kenntnisse und Erfahrung in der Embedded-Programmierung in C und C++.\n⢠Idealerweise haben Sie bereits Erfahrung mit der Entwicklung sicherheitsgerichteter Software und Kenntnis von Standards der Funktionalen Sicherheit (z.B.: ISO61508, ISO26262, ISO25119)\n⢠Sie haben Spaà an komplexen Softwareprojekten und sind ein kreativer Kopf\n⢠Und natürlich können Sie sich sowohl auf Deutsch als auch Englisch gut verständigen.\nIhre Vorteile bei HYDAC:\n⢠Attraktive Vergütung plus starke Zusatzleistungen\n⢠Flexibel arbeiten: Beruf, Familie und Freizeit im Einklang\n⢠Betriebliche Altersvorsorge & Gesundheitsangebote\n⢠Wertschätzung & Mitgestaltung im Familienunternehmen\n⢠Zugang zu Sonderkonditionen & Rabatten\n⢠Vergünstigtes Deutschlandticket durch Arbeitgeberzuschuss\nAnsprechpartner\nAndreas Jäger\n+49 6897 509-9562\nWer wir sind\nStart-up mit GroÃfamilie und Hauptstadtfeeling\nDie HYDAC SOFTWARE GmbH gehört zur HYDAC-Gruppe, einem 1963 gegründeten Familienunternehmen mit heute rund 10.000 Mitarbeitenden weltweit.\nInnerhalb der HYDAC-Familie agiert die HYDAC SOFTWARE GmbH als dynamisches und schnell wachsendes Start-up. Gestartet 2010 mit zwei Personen, arbeiten heute mit ca. 100 Kolleginnen und
1283Kollegen an innovativen Lösungen für die mobile Welt von morgen.\n#BePartOfTheFamily\nWir entwickeln uns kontinuierlich weiter, wachsen als Unternehmen und Arbeitgeber sowohl national als auch international. Gleichzeitig sind die menschliche Nähe und die Atmosphäre eines Familienunternehmens fest in unseren Wurzeln verankert und bilden stets die Grundpfeiler der HYDAC Unternehmenskultur.\nHYDAC @ Kununu\nSie möchten mehr über uns als Arbeitgeber erfahren? Auf Kununu finden Siezahlreiche Bewertungen von Mitarbeitenden und Bewerbern, die ihre Erfahrungen mit HYDAC teilen. Dabei gehören wir zu den rund 5% der beliebtesten Unternehmen und wurden als Top Company 2025 ausgezeichnet.\nWir freuen uns auf Ihre Bewerbung!\nBitte übermitteln Sie uns Ihre möglichst vollständigen Unterlagen unter Angabe Ihres nächstmöglichen Eintrittstermins sowie Ihrer Gehaltsvorstellung, idealerweise in einer PDF-Datei.\nBewerben\nHYDAC Group\nkarriere.hydac.com\n","timestampISO":"2026-04-10T12:00:55.795Z","user":{"username":"JAP","userslug":"jap","picture":"/forum/assets/uploads/profile/34629-profileavatar.png","icon:text":"J","icon:bgColor":"#827717"},"index":1,"cid":58,"parentCid":72,"topic":{"slug":"355454/informatiker-technischer-informatiker-softwareentwicklung-c-und-c-w-m-d-hydac-group","title":"Informatiker/technischer Informatiker Softwareentwicklung C und C++ (w/m/d) | HYDAC Group"}}]},{"bgColor":"#bdbdbd","cid":77,"class":"col-md-3 col-xs-6","color":"#333","description":"IT ist nicht nur Programmierung. Hier geht es um Hardware, Betriebssysteme, Treiber, Tablets, Smartphones und Anwendungssoftware.","descriptionParsed":"<p>IT ist nicht nur Programmierung. Hier geht es um Hardware, Betriebssysteme, Treiber, Tablets, Smartphones und Anwendungssoftware.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Themen rund um die IT","numRecentReplies":1,"order":3,"parentCid":72,"post_count":128866,"slug":"77/themen-rund-um-die-it","topic_count":15175,"isSection":0,"totalPostCount":128866,"totalTopicCount":15175,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#949494","cid":72,"class":"col-md-3 col-xs-6","color":"#fff","description":"Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.","descriptionParsed":"<p>Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.<\/p>\n","disabled":0,"icon":"fa-comments-o","imageClass":"cover","link":"","name":"Jenseits der Programmierung","numRecentReplies":1,"order":7,"parentCid":0,"post_count":252467,"slug":"72/jenseits-der-programmierung","topic_count":10870,"isSection":0,"totalPostCount":252467,"totalTopicCount":10870,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625254,"timestamp":1790342333607,"content":"Meine Erfahrung mit aktuellen Premiummodellen ist immer noch, dass man ihnen selbstständig bloà Juniorentwickleraufgaben geben kann, wo man dann hinterher auch nochmals gründlich drübergucken muss. Dabei wird es immer schwieriger die Fehler zu finden, aber es sind immer noch zu häufig grobe Böcke drin, als dass ich dem ungesehen vertrauen würde. Und halt stets so zuversichtlich, wo dann am Code kommentiert ist, was das machen soll, aber erst wenn man 3x guckt, merkt man, das stimmt gar nicht. Das ist dann besonders gefährlich, weil man nicht bloà querlesen kann, ob etwas sinnvoll aussieht, sondern man muss es wirklich komplett durchdenken, ob das stimmt. Wenn man dann auf die Fehler zeigt, tendieren sie auch dazu, Dinge kaputt zu reparieren. Das ist dann vergleichbar viel Aufwand wie selber schreiben.\nUmgekehrt ist es hingegen höchst nützlich, wenn man sie benutzt, um den eigenen Code zu kritisieren. Da kann man dann ja schnell beurteilen, ob ein Einwand gerechtfertigt ist oder ob ein Verbesserungsvorschlag wirklich besser ist. Da bekommt man schneller viel mehr nützliche Vorschläge und Einwände als selbst der kritischte Reviewer einem geben könnte. Wenn davon dann nicht alle gerechtfertigt sind, ist das ja nicht weiter schlimm, man muss sie ja nicht umsetzen. Das finde ich schon sehr hilfreich und will ich nicht mehr vermissen.\nWas auch geht sind FleiÃaufgaben so a la "Mit diesem (von mir geschriebenen) Test als Vorbild schreibe weitere Tests für folgende Szenarien [...] und mach Vorschläge für was noch fehlen könnte"
1283. Muss man auch nochmal draufgucken, aber da ist es dann auch nicht so kritisch, und die Chancen, dass es falsch ist, sind kleiner.\n","timestampISO":"2026-09-25T13:18:53.607Z","user":{"username":"SeppJ","userslug":"seppj","picture":"/forum/assets/uploads/profile/19375-profileavatar.png","icon:text":"S","icon:bgColor":"#009688"},"index":39,"cid":77,"parentCid":72,"topic":{"slug":"355420/pro-contra-ki-eigene-erfahrungen","title":"Pro & Contra KI - Eigene Erfahrungen"}}]},{"bgColor":"#575757","cid":70,"class":"col-md-3 col-xs-6","color":"#fff","description":"Treffpunkt der Gamer. Diskussionen über neue und alte Spiele. Organisation von Turnieren oder finde Mitspieler bei deinem Lieblingsspiel.","descriptionParsed":"<p>Treffpunkt der Gamer. Diskussionen über neue und alte Spiele. Organisation von Turnieren oder finde Mitspieler bei deinem Lieblingsspiel.<\/p>\n","disabled":0,"icon":"hidden","imageClass":"cover","link":"","name":"Gaming-Corner","numRecentReplies":1,"order":4,"parentCid":72,"post_count":13951,"slug":"70/gaming-corner","topic_count":831,"isSection":0,"totalPostCount":13951,"totalTopicCount":831,"tagWhitelist":[],"unread-class":"unread","children":[],"parent":{"bgColor":"#949494","cid":72,"class":"col-md-3 col-xs-6","color":"#fff","description":"Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.","descriptionParsed":"<p>Informationen aus der realen Welt, Fragen nach Uhrzeit und Wetter, heiÃe Aktientipps und allgemeines Gelaber sowie Austragungsort für ernstgemeinte Diskussionsduelle. Alles was nichts mehr mit Programmierung zu tun hat.<\/p>\n","disabled":0,"icon":"fa-comments-o","imageClass":"cover","link":"","name":"Jenseits der Programmierung","numRecentReplies":1,"order":7,"parentCid":0,"post_count":252467,"slug":"72/jenseits-der-programmierung","topic_count":10870,"isSection":0,"totalPostCount":252467,"totalTopicCount":10870,"tagWhitelist":[],"unread-class":"unread"},"posts":[{"pid":2625035,"timestamp":1785140530665,"content":"I'm currently playing Space Engineers 2 and The Guild 3 - until the new Guild comes out. \n","timestampISO":"2026-07-27T08:22:10.665Z","user":{"username":"Anon-81275","userslug":"anon-81275","picture":"","icon:text":"A","icon:bgColor":"#3f51b5"},"index":2,"cid":70,"parentCid":72,"topic":{"slug":"355478/looking-for-new-pc-game-recommendations","title":"Looking for New PC Game Recommendations"}}]}],"posts":[{"pid":2625254,"timestamp":1790342333607,"content":"Meine Erfahrung mit aktuellen Premiummodellen ist immer noch, dass man ihnen selbstständig bloà Juniorentwickleraufgaben geben kann, wo man dann hinterher auch nochmals gründlich drübergucken muss. Dabei wird es immer schwieriger die Fehler zu finden, aber es sind immer noch zu häufig grobe Böcke drin, als dass ich dem ungesehen vertrauen würde. Und halt stets so zuversichtlich, wo dann am Code kommentiert ist, was das machen soll, aber erst wenn man 3x guckt, merkt man, das stimmt gar nicht. Das ist dann besonders gefährlich, weil man nicht bloà querlesen kann, ob etwas sinnvoll aussieht, sondern man muss es wirklich komplett durchdenken, ob das stimmt. Wenn man dann auf die Fehler zeigt, tendieren sie auch dazu, Dinge kaputt zu reparieren. Das ist dann vergleichbar viel Aufwand wie selber schreiben.\nUmgekehrt ist es hingegen höchst nützlich, wenn man sie benutzt, um den eigenen Code zu kritisieren. Da kann man dann ja schnell beurteilen, ob ein Einwand gerechtfertigt ist oder ob ein Verbesserungsvorschlag wirklich besser ist. Da bekommt man schneller viel mehr nützliche Vorschläge und Einwände als selbst der kritischte Reviewer einem geben könnte. Wenn davon dann nicht alle gerechtfertigt sind, ist das ja nicht weiter schlimm, man muss sie ja nicht umsetzen. Das finde ich schon sehr hilfreich und will ich nicht mehr vermissen.\nWas auch geht sind FleiÃaufgaben so a la "Mit diesem (von mir geschriebenen) Test als Vorbild schreibe weitere Tests für folgende Szenarien [...] und mach Vorschläge für was noch fehlen könnte"
1283. Muss man auch nochmal draufgucken, aber da ist es dann auch nicht so kritisch, und die Chancen, dass es falsch ist, sind kleiner.\n","timestampISO":"2026-09-25T13:18:53.607Z","user":{"username":"SeppJ","userslug":"seppj","picture":"/forum/assets/uploads/profile/19375-profileavatar.png","icon:text":"S","icon:bgColor":"#009688"},"index":39,"cid":77,"parentCid":72,"topic":{"slug":"355420/pro-contra-ki-eigene-erfahrungen","title":"Pro & Contra KI - Eigene Erfahrungen"}}],"teaser":{"url":"/forum/post/2625254","timestampISO":"2026-09-25T13:18:53.607Z","pid":2625254,"topic":{"slug":"355420/pro-contra-ki-eigene-erfahrungen","title":"Pro & Contra KI - Eigene Erfahrungen"}}},{"bgColor":"#f7ca88","cid":35,"class":"col-md-3 col-xs-6","color":"#333333","description":"Hier kann man über die neue Forumsoftware diskutieren.\r\nKritik, Lob, Probleme, Lösungen usw.","descriptionParsed":"<p>Hier kann man über die neue Forumsoftware diskutieren.<br />\nKritik, Lob, Probleme, Lösungen usw.<\/p>\n","disabled":0,"icon":"fa-cogs","imageClass":"cover","link":"","name":"Forentechnik","numRecentReplies":1,"order":8,"parentCid":0,"post_count":15005,"slug":"35/forentechnik","topic_count":1750,"isSection":0,"totalPostCount":15005,"totalTopicCount":1750,"tagWhitelist":[],"unread-class":"unread","children":[],"posts":[{"pid":2625111,"timestamp":1787149409522,"content":"Wenn ihr die Richtigkeit meiner Aussage weiter anzweifelt, könnte ich ja mal die Gegenfrage stellen, welche Unterschiede ihr denn zwischen Rassist und Nazi seht... Aber ich glaube, das wäre tatsächlich der Diskussion nicht förderlich. Also lasst die Beleidigungen doch einfach.\n","timestampISO":"2026-08-19T14:23:29.522Z","user":{"username":"Anon-81275","userslug":"anon-81275","picture":"","icon:text":"A","icon:bgColor":"#3f51b5"},"index":25,"cid":35,"parentCid":0,"topic":{"slug":"355486/ab-wann-kann-man-postings-bewerten","title":"Ab wann kann man Postings bewerten?"}}],"teaser":{"url":"/forum/post/2625111","timestampISO":"2026-08-19T14:23:29.522Z","pid":2625111,"topic":{"slug":"355486/ab-wann-kann-man-postings-bewerten","title":"Ab wann kann man Postings bewerten?"}}}],"loggedIn":false,"relative_path":"/forum","template":{"name":"categories","categories":true},"url":"/forum/categories","bodyClass":"page-categories page-status-200","widgets":{"footer":[{"html":"<footer id=\"footer\" class=\"container footer\"><div>\r\n<a href=\"/datenschutz.html\">Datenschutz<\/a> | <a target=\"_blank\" href=\"/impressum.html\">Impressum<\/a>\r\n<\/div><div>\r\nPowered by <a target=\"_blank\" href=\"https://nodebb.org\">NodeBB<\/a> | <a target=\"_blank\" href=\"//github.com/NodeBB/NodeBB/graphs/contributors\">Contributors<\/a><\/div>\r\n<\/footer>"}]}}</script>
1283 </div><!-- /.container#content --> 1284 </main> 1285 1286 1287 1288
1288<script defer src="/forum/assets/nodebb.min.js?v=ab1pehoraso"></script>
1288 1289 1290 1291
1291<script defer type="text/javascript" src="/forum/assets/vendor/jquery/timeago/locales/jquery.timeago.en.js"></script>
1291 1292 1293 1294
1294<script> 1295 window.addEventListener('load', function () { 1296 require(['forum/footer']); 1297 1298 1299 }); 1300 </script>
1300 1301 1302 <div class="hide"> 1303
1303<script> 1304 window.addEventListener('load', function () { 1305 define(config.relative_path + '/assets/templates/500.js', function () { 1306 function compiled(helpers, context, get, iter, helper) { 1307 return '<div class="alert alert-danger">\n\t<strong>Internal Error.</strong>\n\t<p>Oops! Looks like something went wrong!</p>\n\t<p>' + 1308 helpers.__escape(get(context && context['path'])) + '</p>\n\t' + 1309 (get(context && context['error']) ? '<p>' + helpers.__escape(get(context && context['error'])) + '</p>' : '') + '\n\n\t' + 1310 (get(context && context['returnLink']) ? '\n\t<p>Press back to return to the previous page</p>\n\t' : '') + '\n</div>\n'; 1311 } 1312 1313 return compiled; 1314 }); 1315 }); 1316</script>
1316 1317 </div> 1318</body> 1319</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.