2013-07-17 9 views
7

Mam dwa wielokąty z ich wierzchołkami zapisanymi jako podwójne współrzędne. Chciałbym znaleźć przecinający się obszar tych wielokątów, więc patrzę na Clipper library (wersja C++). Problem polega na tym, że Clipper działa tylko z matematyką całkowitą (używa typu Long).Konwersja współrzędnych wielokątów z Double na Long dla bibliotek Clipper

Czy istnieje sposób, w jaki mogę bezpiecznie przekształcić oba moje wielokąty o tym samym współczynniku skali, przekształcić ich współrzędne na Longs, wykonać algorytm przecięcia z Clipperem i skalować wynikowy wielokąt z powrotem z tym samym współczynnikiem i przekonwertować go z powrotem do Double bez utraty precyzji?

Nie mogę zrozumieć, jak to zrobić.

Odpowiedz

6

Można użyć prostego mnożenia do konwersji między dwoma:

/* 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); 
    } 
} 

Należy pamiętać, że im większa dokonać skali, tym większa precyzja będzie, ale również obniża zasięg. W efekcie konwertuje liczbę zmiennoprzecinkową na liczbę stałoprzecinkową.

Wreszcie, powinieneś być w stanie zlokalizować kod do obliczania skrzyżowań między segmentami liniowymi z łatwością za pomocą matematyki zmiennoprzecinkowej, więc zastanawiam się, dlaczego chcesz użyć dokładnie Clippera.

+0

Potrzebuję uzyskać obszar przecinający się dwóch wielokątów jako nowy wielokąt. W niektórych przypadkach te wielokąty mogą mieć "dziury" lub mogą być wklęsłe. Clipper powinien obsłużyć wszystkie te przypadki brzegowe. Dzięki za pomoc! – tommaisey

+1

"skala" - wydaje się, że nie jest używana do skalowania podwójnego? – Ross

+0

Przyjemny połów. : ^) –

Powiązane problemy