Files
fist/fist_added_functions.cpp
SaraP cbec90699f FIST 6.8 :
- creato il progetto in Visual Studio per compilare come libreria statica
- modifiche al codice originale per integrarlo nelle nostre librerie.
2025-03-04 16:19:35 +01:00

98 lines
4.0 KiB
C++

/*****************************************************************************/
/* */
/* Funzioni aggiunte per integrare fist con le nostre librerie */
/* Le modifiche nelle funzioni già esistenti sono idicate con MODIF */
/* */
/*****************************************************************************/
#include <stdio.h>
#include "defs.h"
#include "header.h"
#define BLOCK_SIZE 16384
//----------------------------------------------------------------------------
void
AddLoopInFace( global_struct *all, int nHoles, boolean bFirstLoop, int nPoints)
{
// versione ottimizzata di HandleFace
vertexdef *vert = &all->c_vertex;
listdef *list = &all->c_list;
int curr_loop = MakeLoopHeader(list) ;
if ( bFirstLoop) {
// se è il primo loop della faccia, inizializzo il numero dei suoi loops
InitFace( list, nHoles + 1) ;
}
// segnaposto per il loop corrente
list_ind loop_placeholder_ind = list->loops[curr_loop] ;
list->list[loop_placeholder_ind].prev = loop_placeholder_ind ;
list->list[loop_placeholder_ind].next = loop_placeholder_ind ;
// il primo vertice del loop corrente è nella posizione successiva al segnaposto
list->loops[curr_loop] = loop_placeholder_ind + 1 ;
// aggiungo i vertici del loop corrente
for ( int i = 0 ; i < nPoints ; i++) {
// recupero indice del vertice
int index = vert->num_vertices - nPoints + i ;
// aggiungo nella lista
if (list->num_list >= list->max_num_list) {
list->max_num_list += BLOCK_SIZE ;
list->list = (list_node*) ReallocateArray(list->memptr, list->list, list->max_num_list, sizeof(list_node), "list:list") ;
}
list_ind ind = list->num_list ;
list->list[ind].index = index ;
list->list[ind].prev = ( i == 0 ? ind + nPoints - 1 : ind - 1) ;
list->list[ind].next = ( i == nPoints - 1 ? ind - nPoints + 1 : ind + 1) ;
list->list[ind].bridge = false ;
list->list[ind].original = index ;
#ifdef PARTITION_FIST
list->list[ind].delete_reflex = false;
#endif
++list->num_list ;
}
return ;
}
//----------------------------------------------------------------------------
void
OptimizeMemoryAllocation( global_struct *all, int nLoops, int nVertices)
{
// alloco correttamente la memoria per alcune strutture di fist per evitare riallocazioni successive e per non occupare memoria
// inutile ( BLOCK_SIZE spesso è esagerato rispetto al caso da trattare)
// c_list
listdef* list = &all->c_list ;
// viene trattata una sola faccia
list->max_num_faces = 1 ;
list->faces = ( int*) ReallocateArray( list->memptr, list->faces, list->max_num_faces, sizeof( int), "list:faces") ;
// numero di loop
list->max_num_loops = nLoops ;
list->loops = ( list_ind*) ReallocateArray( list->memptr, list->loops, list->max_num_loops, sizeof( list_ind), "list:loops") ;
// la lista deve comprendere tutti i vertici, un segnaposto per ogni loop e due punti per ogni brigde
list->max_num_list = nVertices + 3 * nLoops ;
list->list = ( list_node*) ReallocateArray( list->memptr, list->list, list->max_num_list, sizeof( list_node), "list:list") ;
// c_vertex
vertexdef* vertices = &all->c_vertex ;
// 1 solo gruppo
vertices->max_num_groups = 1 ;
vertices->groups = ( int*) ReallocateArray( list->memptr, vertices->groups, vertices->max_num_groups, sizeof( int), "vertex:groups") ;
// numero di vertici
vertices->max_num_vertices = nVertices ;
vertices->vertices = ( vertex*) ReallocateArray( vertices->memptr, vertices->vertices, vertices->max_num_vertices, sizeof( vertex), "vertex:vertices") ;
// c_data
// il numero di punti è il numero di vertici
datadef* data = &all->c_data ;
data->max_num_pnts = nVertices ;
data->points = ( point*) ReallocateArray( data->memptr, data->points, data->max_num_pnts, sizeof( point), "data:points") ;
return ;
}