2013-07-17 9 views
7

Ho due poligoni con i loro vertici memorizzati come coordinate doppie. Mi piacerebbe trovare l'area intersecante di questi poligoni, quindi guardo allo Clipper library (versione C++). Il problema è che Clipper funziona solo con i numeri interi (usa il tipo Long).Conversione di coordinate poligonali da doppio a lungo per l'uso con la libreria Clipper

C'è un modo in cui posso tranquillamente trasformare entrambi i miei poligoni con lo stesso fattore di scala, convertire le loro coordinate in Longs, eseguire l'algoritmo di Intersection con Clipper e ridimensionare il poligono di intersezione risultante con lo stesso fattore e convertirlo tornare a un doppio senza troppa perdita di precisione?

Non riesco a capire come farlo.

risposta

6

è possibile utilizzare un semplice moltiplicatore per la conversione tra i due:

/* Using power-of-two because it is exactly representable and makes 
the scaling operation (not the rounding!) lossless. The value 1024 
preserves roughly three decimal digits. */ 
double const scale = 1024.0; 

// representable range 
double const min_value = std::numeric_limits<long>::min()/scale; 
double const max_value = std::numeric_limits<long>::max()/scale; 

long 
to_long(double v) 
{ 
    if(v < 0) 
    { 
     if(v < min_value) 
      throw out_of_range(); 
     return static_cast<long>(v * scale - 0.5); 
    } 
    else 
    { 
     if(v > max_value) 
      throw out_of_range(); 
     return static_cast<long>(v * scale + 0.5); 
    } 
} 

Si noti che il più grande a fare la scala, più alto sarà il precisione sarà, ma abbassa anche la gamma. In pratica, converte un numero in virgola mobile in un numero in virgola fissa.

Infine, dovresti essere in grado di individuare il codice per calcolare le intersezioni tra i segmenti di linea usando la matematica in virgola mobile facilmente, quindi mi chiedo perché vuoi usare esattamente Clipper.

+0

Ho bisogno di ottenere l'area di intersezione di due poligoni come un nuovo poligono. In alcuni casi, questi poligoni possono avere "buchi" o possono essere concavi. Clipper dovrebbe gestire tutti quei casi limite. Grazie per l'aiuto! – tommaisey

+1

"scala" - sembra che non sia usato per ridimensionare il doppio? – Ross

+0

Bella cattura. : ^) –

Problemi correlati