Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (Faza 1 - locală)
- pentru fiecare poligon din structura
- calcul normală la suprafaţă // vector poligon_normală
- calcul arie // vector poligon_arie = magnitudine(poligon_normală) / 2
- calcul normală normalizată // vector poligon_nn
- // alocare clasa poligonului
- dacă magnitudine(componenta poligon_nn în plan XY) < NORMA_MAX_XY_POLIGON
- clasificare 'orizontal'
- altfel dacă magnitudine(componenta poligon_nn pe axa Z) < NORMA_MAX_Z_POLIGON
- clasificare 'vertical'
- altfel
- clasificare 'altfel'
- // Chiar dacă am clasificat fiecare poligon, ne lipseşte o perspectivă
- // de ansamblu asupra întregii suprafeţe. O protuberantă (eroare de
- // reconstrucţie) poate apărea într-o suprafaţă altfel plană, sau, viceversa,
- // un mic poligon întâmplător orizontal poate apărea în vârful unui copac
- (Faza 2 - eliminare poligoane HV eronate)
- pentru fiecare poligon clasificat 'orizontal'
- set_poligoane_adiacente = colectarea t uturor poligoanelor adiacente
- într-o fereastră dacă ...
- ... magnitudine(componenta poligon_nn în plan XY) < NORMA_XY_IGNORA
- // Acest prag NORM_IGNORE este important deoarece nu vrem ca poligoane care se
- // afla în proximitate spaţială dar sunt cel mai probabil opuse semantic
- // (H<>V) să ne influenţeze statistică. Această condiţie ne ajută să:
- // 1. procesăm corect colţurile - aflate, de exemplu, la interfaţa între
- // acoperişurile şi faţadele clădirilor
- // 2. eliminăm poligoane ce apar sub suprafaţa de interes, prezente de-a
- // lungul acesteia
- set_poligoane_adiacente_h = selectarea poligoanelor H dintre cele selectate
- anterior
- // în final compara raportul între două arii:
- // dacă poligonul curent este singurul orizontal într-o suprafaţă predominant
- // oblică el va fi reclasificat
- dacă suma(arie(set_poligoane_adiacente_h)) /
- suma(arie(set_poligoane_adiacente)) > RAPORT_ARIE_F2
- păstrează categoria
- altfel
- reclasificare 'altfel'
- // Aplicăm o procedură similară pentru poligoanele verticale
- pentru fiecare poligon clasificat 'vertical'
- ...
- (Faza 3 - adăugare poligoane HV pe baza contextului)
- // Căutam poligoane O ce ar trebui clasificate că H
- pentru fiecare poligon clasificat 'altfel'
- // Colectam poligoane adiacente similar fazei anterioare
- set_poligoane_adiacente = ...
- set_poligoane_adiacente_h = ...
- // Din nou comparăm două arii, însă pentru a reduce riscul de a clasifica
- // suprafeţe că orizontale / sigure pentru aterizare în mod eronat, introducem
- // încă o comparaţie - un nou prag al inclinaţiei, mai permisiv decât primul,
- // însă nici foarte ridicat
- dacă suma(arie(set_poligoane_adiacente_h)) /
- suma(arie(set_poligoane_adiacente)) > RAPORT_ARIE_F3 && ...
- ... magnitudine(omponenta poligon_nn în plan XY) < NORMA_MAX_XY_F3
- reclasificare 'orizontal'
- altfel
- păstrează categoria
- // Finalmente, repetăm procedura cu un alt set de parametri
- // vizând suprafeţe verticale
- pentru fiecare poligon clasificat 'altfel'
- ...
- Valorile parametrilor sunt următoarele:
- NORMA_MAX_XY_POLIGON = sin(10);
- NORMA_MAX_Z_POLIGON = sin(20);
- NORMA_XY_IGNORA = sin(75);
- NORMA_Z_IGNORA = sin(75);
- FEREASTRA_F2_X = 2;
- FEREASTRA_F2_Y = 2;
- FEREASTRA_F2_Z = 1;
- RAPORT_ARIE_F2 = 0.25;
- FEREASTRA_F3_X = 1;
- FEREASTRA_F3_Y = 1;
- FEREASTRA_F3_Z = 0.5;
Advertisement
Add Comment
Please, Sign In to add comment