Tengo una DLL simple haciendo algunos cálculos con los polígonos de Boost Geometry. (En su mayoría, intersecciones y diferencias). Dado que es muy probable que la DLL se llame desde el código C#, y desde Delphi, y quién sabe de dónde más, debería convertir el resultado en matrices que todo pueda manejar.Obtener las coordenadas de los puntos de un polígono de Boost Geometry
ACTUALIZACIÓN: Había simplificado y algo había corregido mi código. El nuevo código se ve completamente diferente, utiliza un enfoque completamente diferente (for_each_point
), y de alguna manera todavía no se compila.
Mi nuevo código:
#include <vector>
#include <boost/range.hpp>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
using namespace boost::geometry;
typedef boost::geometry::model::point
<
double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree>
> spherical_point;
class PointAggregator {
private :
double *x, *y;
int count;
public :
PointAggregator(int size) {
x = (double*) malloc(sizeof(double) * size);
y = (double*) malloc(sizeof(double) * size);
count = 0;
}
~PointAggregator() {
free(x);
free(y);
}
inline void operator()(spherical_point& p) {
x[count] = get<0>(p);
y[count] = get<1>(p);
count++;
}
void GetResult(double *resultX, double *resultY) {
resultX = x;
resultY = y;
}
};
void VectorToArray(std::vector<model::polygon<spherical_point>> resultVector, double x[], double y[], int *count) {
int i = 0;
for (std::vector<model::polygon<spherical_point>>::iterator it = resultVector.begin(); it != resultVector.end(); ++it) {
if (boost::size(*it) >= 2) {
*count = boost::size(*it);
PointAggregator* pa = new PointAggregator(*count);
boost::geometry::for_each_point(*it, *pa);
pa->GetResult(x, y);
delete(pa);
break;
}
}
}
Los errores de compilación actuales son:
- error C2039: 'tipo': no es un miembro de ':: eval_if_c impulsar :: MPL' iterador. HPP 63
- C3203 de error: 'tipo': plantilla de clase no especializado no puede ser utilizado como un argumento de plantilla para parámetro de plantilla 'iterador', contaba con un tipo de bienes difference_type.hpp 25
- error C2955: 'Impulso :: tipo': uso de la plantilla de clase requiere plantilla de lista de argumentos difference_type.hpp 25
- error C2955: 'boost :: iterator_difference': uso de la plantilla de clase requiere plantilla de lista de argumentos difference_type.hpp 26
Los que no parecen tener nada que ver con esta parte del código (mi nombre de archivo es geometry.cpp), pero todo lo demás que usa Boost Geometry está comentado y sigo recibiendo estos errores, así que ...
Here is my bad code that I had previously (edited by sehe)
(Soy nuevo en C++ y Boost, así que tal vez me lo haya perdido me concepto básico al poner código de Internet juntos.) Supongo que no puedo iterar fácilmente a través de un polígono y me perdí la parte no trivial, o que un polígono no puede usarse como un anillo, o las iteraciones son simplemente no de la manera en que pensé que eran, o no tengo idea de qué más puede estar mal. ¿Qué hice mal?
¿Estás obteniendo errores de compilación o estás buscando un error de lógica? ¿Qué es exactamente lo que no funciona para ti? – sbrett
Actualicé mi código. Como no puedo compilar, no sé si estoy haciendo las cosas bien semánticamente, así que estoy buscando cualquier tipo de error que haya cometido. – ytg
La versión de refuerzo que tenía en mi sistema era 1.35, así que actualicé a lo que sea que tengan en el SVN (que pronto será 1,48, creo). Soy capaz de superar los problemas de no tener boost :: geometry y ver exactamente qué tipo de errores está obteniendo, y es complicado, pero no hay tantos. Por lo que puedo decir con solo mirarlo, el método boost :: size definido como parte de lo que creo que es boost_range, no parece saber cómo manejar tu modelo :: polygon. Después de mirar la referencia del rango de impulso, noté que mencionaba funciones requeridas, como range_begin. –
sbrett