- in BeamLib funzione GetSurfTmSortedVertices diventa GetSortedVertices e si passa la Proc direttamente

- in BeamLib aggiunta funzione GetAdjacentIndices per la ricerca degli indici precedente e successivo con circular indexing
This commit is contained in:
luca.mazzoleni
2026-05-12 10:45:26 +02:00
parent 05a8d23f6a
commit 983609397e
2 changed files with 49 additions and 56 deletions
+47 -54
View File
@@ -517,71 +517,64 @@ function BeamLib.GetDirectionFromSCC( nSCC)
end
-------------------------------------------------------------------------------------------------------------
-- Funzione che restituisce una tabella con i punti ai vertici di una trimesh (se almeno 3), in globale
-- ordinati partendo da quello ai valori minimi degli assi e i successivi secondo rotazione attorno a X+
function BeamLib.GetSurfTmSortedVertices( idSurfTm)
-- se più di una faccia si esce subito
if not ( EgtSurfTmFacetCount( idSurfTm) == 1) then
return
end
local VerticesIndex = EgtSurfTmGetAllVertInFacet( idSurfTm, 0)
local nVerticesCount = #VerticesIndex
-- Una faccia deve avere almeno 3 vertici
if nVerticesCount < 3 then
return
end
local Vertices = {}
local nFirstVertex
-- 1. Popolamento tabella Vertices e ricerca del vertice di partenza
local dMinYZ = GEO.INFINITO
for i = 1, nVerticesCount do
Vertices[i] = {}
Vertices[i].ptVertex = EgtSurfTmGetVertex( idSurfTm, VerticesIndex[i], GDB_RT.GLOB)
-- Circular indexing 1 based
Vertices[i].nNextIndex = (i % nVerticesCount) + 1
Vertices[i].nPrevIndex = ((i - 2 + nVerticesCount) % nVerticesCount) + 1
-- il primo punto è quello con il totale di coordinate Y e Z più basso
if( ( Vertices[i].ptVertex:getY() + Vertices[i].ptVertex:getZ()) < dMinYZ) then
nFirstVertex = i
dMinYZ = Vertices[i].ptVertex:getY() + Vertices[i].ptVertex:getZ()
end
end
-- se non trova il punto con Y+Z minima c'è qualcosa che non va: si esce
if not nFirstVertex then
return
end
local vtN = EgtSurfTmFacetNormVersor( idSurfTm, 0, GDB_ID.ROOT)
-- Funzione che restituisce una tabella con i punti ai vertici della tabella, in globale
-- ordinati partendo da quello ai valori minimi degli assi e i successivi secondo rotazione destrorsa X+;
-- solo per Proc a 1 faccia
function BeamLib.GetSortedVertices( Proc)
local PtVerticesSorted = {}
-- 2. Ordinamento in base alla normale X
table.insert( PtVerticesSorted, Vertices[nFirstVertex].ptVertex)
-- se più di una faccia si esce subito
if Proc.nFct > 1 then
return
end
local nCurrentIndex = nFirstVertex
-- Faccia verso destra (avanti nell'indice della mesh)
if vtN:getX() > GEO.EPS_SMALL then
for _ = 1, nVerticesCount - 1 do
nCurrentIndex = Vertices[nCurrentIndex].nNextIndex
table.insert( PtVerticesSorted, Vertices[nCurrentIndex].ptVertex)
local PtVertices = {}
local nFirstIndex
local dMinYZ = GEO.INFINITO
for i = 1, #Proc.Faces[1].Edges do
local Edge = Proc.Faces[1].Edges[i]
table.insert( PtVertices, Edge.ptStart)
if ( Edge.ptStart:getY() + Edge.ptStart:getZ() < dMinYZ) then
nFirstIndex = i
dMinYZ = Edge.ptStart:getY() + Edge.ptStart:getZ()
end
-- Faccia verso sinistra (indietro nell'indice della mesh)
end
table.insert( PtVerticesSorted, PtVertices[nFirstIndex])
local nCurrentIndex = nFirstIndex
-- faccia che guarda verso X+, ordine ok
if Proc.Faces[1].vtN:getX() > GEO.EPS_SMALL then
for _ = 1, #PtVertices - 1 do
_, nCurrentIndex = BeamLib.GetAdjacentIndices( nCurrentIndex, #PtVertices)
table.insert( PtVerticesSorted, PtVertices[nCurrentIndex])
end
-- faccia che guarda verso X-, ordine da invertire
else
for _ = 1, nVerticesCount - 1 do
nCurrentIndex = Vertices[nCurrentIndex].nPrevIndex
table.insert( PtVerticesSorted, Vertices[nCurrentIndex].ptVertex)
for _ = 1, #PtVertices - 1 do
nCurrentIndex = BeamLib.GetAdjacentIndices( nCurrentIndex, #PtVertices)
table.insert( PtVerticesSorted, PtVertices[nCurrentIndex])
end
end
return PtVerticesSorted
end
-------------------------------------------------------------------------------------------------------------
-- restituisce il precedente e prossimo indice 1-based, tenendo conto del massimo indice
function BeamLib.GetAdjacentIndices( nCurrentIndex, nMaxIndex)
local nPreviousIndex, nNextIndex
if ( nCurrentIndex < 1) or ( nCurrentIndex > nMaxIndex) then
return
end
-- circular indexing 1-based
nPreviousIndex = ((nCurrentIndex - 2 + nMaxIndex) % nMaxIndex) + 1
nNextIndex = (nCurrentIndex % nMaxIndex) + 1
return nPreviousIndex, nNextIndex
end
-------------------------------------------------------------------------------------------------------------
-- Funzione per determinare se la faccia ha lati molto corti (trascurabili) ed è quindi approssimabile ad una 3 facce
function BeamLib.Is3EdgesApprox( Proc, idFace, nAddGrpId)