Added a mechanism to dump out the triangle structures for viewing.
Fixed a couple bugs in first pass at triangulation. - needed to explicitely initialize the polygon accumulator in triangle.cxx before each polygon rather than depending on the default behavior. - Fixed a problem with region attribute propagation where I wasn't generating the hole points correctly.
This commit is contained in:
parent
b4a9bde0e9
commit
033af0d05c
3 changed files with 109 additions and 33 deletions
|
@ -166,9 +166,11 @@ main(int argc, char **argv) {
|
||||||
|
|
||||||
string work_base = argv[1];
|
string work_base = argv[1];
|
||||||
|
|
||||||
lon = -146.248360; lat = 61.133950; // PAVD (Valdez, AK)
|
// lon = -146.248360; lat = 61.133950; // PAVD (Valdez, AK)
|
||||||
// lon = -110.664244; lat = 33.352890; // P13
|
// lon = -110.664244; lat = 33.352890; // P13
|
||||||
lon = -89.744682312011719; lat= 29.314495086669922;
|
// lon = -93.211389; lat = 45.145000; // KANE
|
||||||
|
lon = -92.486188; lat = 44.590190; // KRGK
|
||||||
|
// lon = -89.744682312011719; lat= 29.314495086669922;
|
||||||
|
|
||||||
FGBucket b( lon, lat );
|
FGBucket b( lon, lat );
|
||||||
|
|
||||||
|
@ -187,6 +189,14 @@ main(int argc, char **argv) {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.5 1999/03/21 14:02:05 curt
|
||||||
|
// Added a mechanism to dump out the triangle structures for viewing.
|
||||||
|
// Fixed a couple bugs in first pass at triangulation.
|
||||||
|
// - needed to explicitely initialize the polygon accumulator in triangle.cxx
|
||||||
|
// before each polygon rather than depending on the default behavior.
|
||||||
|
// - Fixed a problem with region attribute propagation where I wasn't generating
|
||||||
|
// the hole points correctly.
|
||||||
|
//
|
||||||
// Revision 1.4 1999/03/20 20:32:54 curt
|
// Revision 1.4 1999/03/20 20:32:54 curt
|
||||||
// First mostly successful tile triangulation works. There's plenty of tweaking
|
// First mostly successful tile triangulation works. There's plenty of tweaking
|
||||||
// to do, but we are marching in the right direction.
|
// to do, but we are marching in the right direction.
|
||||||
|
|
|
@ -40,8 +40,14 @@ int
|
||||||
FGTriangle::build( const fitnode_list& fit_list,
|
FGTriangle::build( const fitnode_list& fit_list,
|
||||||
const FGgpcPolyList& gpc_polys )
|
const FGgpcPolyList& gpc_polys )
|
||||||
{
|
{
|
||||||
|
FGTriPoly poly;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
|
// Point3D junkp;
|
||||||
|
// int junkc = 0;
|
||||||
|
// char junkn[256];
|
||||||
|
// FILE *junkfp;
|
||||||
|
|
||||||
// traverse the dem fit list and gpc_polys building a unified node
|
// traverse the dem fit list and gpc_polys building a unified node
|
||||||
// list and converting the polygons so that they reference the
|
// list and converting the polygons so that they reference the
|
||||||
// node list by index (starting at zero) rather than listing the
|
// node list by index (starting at zero) rather than listing the
|
||||||
|
@ -69,8 +75,6 @@ FGTriangle::build( const fitnode_list& fit_list,
|
||||||
cout << "processing a polygon, contours = "
|
cout << "processing a polygon, contours = "
|
||||||
<< gpc_poly->num_contours << endl;
|
<< gpc_poly->num_contours << endl;
|
||||||
|
|
||||||
FGTriPoly poly;
|
|
||||||
|
|
||||||
if (gpc_poly->num_contours <= 0 ) {
|
if (gpc_poly->num_contours <= 0 ) {
|
||||||
cout << "FATAL ERROR! no contours in this polygon" << endl;
|
cout << "FATAL ERROR! no contours in this polygon" << endl;
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
@ -83,14 +87,27 @@ FGTriangle::build( const fitnode_list& fit_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( int j = 0; j < gpc_poly->num_contours; j++ ) {
|
for ( int j = 0; j < gpc_poly->num_contours; j++ ) {
|
||||||
|
|
||||||
|
poly.erase();
|
||||||
|
|
||||||
|
// sprintf(junkn, "g.%d", junkc++);
|
||||||
|
// junkfp = fopen(junkn, "w");
|
||||||
|
|
||||||
for ( int k = 0; k < gpc_poly->contour[j].num_vertices; k++ ) {
|
for ( int k = 0; k < gpc_poly->contour[j].num_vertices; k++ ) {
|
||||||
Point3D p( gpc_poly->contour[j].vertex[k].x,
|
Point3D p( gpc_poly->contour[j].vertex[k].x,
|
||||||
gpc_poly->contour[j].vertex[k].y,
|
gpc_poly->contour[j].vertex[k].y,
|
||||||
0 );
|
0 );
|
||||||
index = trinodes.unique_add( p );
|
index = trinodes.unique_add( p );
|
||||||
|
// junkp = trinodes.get_node( index );
|
||||||
|
// fprintf(junkfp, "%.4f %.4f\n", junkp.x(), junkp.y());
|
||||||
poly.add_node(index);
|
poly.add_node(index);
|
||||||
// cout << index << endl;
|
// cout << index << endl;
|
||||||
}
|
}
|
||||||
|
// fprintf(junkfp, "%.4f %.4f\n",
|
||||||
|
// gpc_poly->contour[j].vertex[0].x,
|
||||||
|
// gpc_poly->contour[j].vertex[0].y);
|
||||||
|
// fclose(junkfp);
|
||||||
|
|
||||||
poly.calc_point_inside( trinodes );
|
poly.calc_point_inside( trinodes );
|
||||||
|
|
||||||
polylist[i].push_back(poly);
|
polylist[i].push_back(poly);
|
||||||
|
@ -108,7 +125,6 @@ FGTriangle::build( const fitnode_list& fit_list,
|
||||||
// traverse the polygon lists and build the segment (edge) list
|
// traverse the polygon lists and build the segment (edge) list
|
||||||
// that is used by the "Triangle" lib.
|
// that is used by the "Triangle" lib.
|
||||||
|
|
||||||
FGTriPoly poly;
|
|
||||||
int i1, i2;
|
int i1, i2;
|
||||||
for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
||||||
cout << "area type = " << i << endl;
|
cout << "area type = " << i << endl;
|
||||||
|
@ -135,6 +151,55 @@ FGTriangle::build( const fitnode_list& fit_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void write_out_data(struct triangulateio *out) {
|
||||||
|
FILE *node = fopen("tile.node", "w");
|
||||||
|
fprintf(node, "%d 2 %d 0\n",
|
||||||
|
out->numberofpoints, out->numberofpointattributes);
|
||||||
|
for (int i = 0; i < out->numberofpoints; i++) {
|
||||||
|
fprintf(node, "%d %.6f %.6f %.2f\n",
|
||||||
|
i, out->pointlist[2*i], out->pointlist[2*i + 1], 0.0);
|
||||||
|
}
|
||||||
|
fclose(node);
|
||||||
|
|
||||||
|
FILE *ele = fopen("tile.ele", "w");
|
||||||
|
fprintf(ele, "%d 3 0\n", out->numberoftriangles);
|
||||||
|
for (int i = 0; i < out->numberoftriangles; i++) {
|
||||||
|
fprintf(ele, "%d ", i);
|
||||||
|
for (int j = 0; j < out->numberofcorners; j++) {
|
||||||
|
fprintf(ele, "%d ", out->trianglelist[i * out->numberofcorners + j]);
|
||||||
|
}
|
||||||
|
for (int j = 0; j < out->numberoftriangleattributes; j++) {
|
||||||
|
fprintf(ele, "%.6f ",
|
||||||
|
out->triangleattributelist[i
|
||||||
|
* out->numberoftriangleattributes
|
||||||
|
+ j]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
fprintf(ele, "\n");
|
||||||
|
}
|
||||||
|
fclose(ele);
|
||||||
|
|
||||||
|
FILE *fp = fopen("tile.poly", "w");
|
||||||
|
fprintf(fp, "0 2 1 0\n");
|
||||||
|
fprintf(fp, "%d 0\n", out->numberofsegments);
|
||||||
|
for (int i = 0; i < out->numberofsegments; ++i) {
|
||||||
|
fprintf(fp, "%d %d %d\n",
|
||||||
|
i, out->segmentlist[2*i], out->segmentlist[2*i + 1]);
|
||||||
|
}
|
||||||
|
fprintf(fp, "%d\n", out->numberofholes);
|
||||||
|
for (int i = 0; i < out->numberofholes; i++) {
|
||||||
|
fprintf(fp, "%d %.6f %.6f\n",
|
||||||
|
i, out->holelist[2*i], out->holelist[2*i + 1]);
|
||||||
|
}
|
||||||
|
fprintf(fp, "%d\n", out->numberofregions);
|
||||||
|
for (int i = 0; i < out->numberofregions; i++) {
|
||||||
|
fprintf(fp, "%d %.6f %.6f %.6f\n",
|
||||||
|
i, out->regionlist[4*i], out->regionlist[4*i + 1],
|
||||||
|
out->regionlist[4*i + 2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// triangulate each of the polygon areas
|
// triangulate each of the polygon areas
|
||||||
int FGTriangle::run_triangulate() {
|
int FGTriangle::run_triangulate() {
|
||||||
FGTriPoly poly;
|
FGTriPoly poly;
|
||||||
|
@ -169,6 +234,9 @@ int FGTriangle::run_triangulate() {
|
||||||
in.pointmarkerlist[i] = 0;
|
in.pointmarkerlist[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// triangle list
|
||||||
|
in.numberoftriangles = 0;
|
||||||
|
|
||||||
// segment list
|
// segment list
|
||||||
triseg_list seg_list = trisegs.get_seg_list();
|
triseg_list seg_list = trisegs.get_seg_list();
|
||||||
in.numberofsegments = seg_list.size();
|
in.numberofsegments = seg_list.size();
|
||||||
|
@ -205,11 +273,11 @@ int FGTriangle::run_triangulate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
in.regionlist = (REAL *) malloc(in.numberofregions * 4 * sizeof(REAL));
|
in.regionlist = (REAL *) malloc(in.numberofregions * 4 * sizeof(REAL));
|
||||||
|
counter = 0;
|
||||||
for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
||||||
tripoly_list_iterator h_current, h_last;
|
tripoly_list_iterator h_current, h_last;
|
||||||
h_current = polylist[(int)AirportIgnoreArea].begin();
|
h_current = polylist[(int)i].begin();
|
||||||
h_last = polylist[(int)AirportIgnoreArea].end();
|
h_last = polylist[(int)i].end();
|
||||||
counter = 0;
|
|
||||||
for ( ; h_current != h_last; ++h_current ) {
|
for ( ; h_current != h_last; ++h_current ) {
|
||||||
poly = *h_current;
|
poly = *h_current;
|
||||||
p = poly.get_point_inside();
|
p = poly.get_point_inside();
|
||||||
|
@ -242,6 +310,9 @@ int FGTriangle::run_triangulate() {
|
||||||
vorout.edgelist = (int *) NULL; // Needed only if -v switch used.
|
vorout.edgelist = (int *) NULL; // Needed only if -v switch used.
|
||||||
vorout.normlist = (REAL *) NULL; // Needed only if -v switch used.
|
vorout.normlist = (REAL *) NULL; // Needed only if -v switch used.
|
||||||
|
|
||||||
|
// TEMPORARY
|
||||||
|
// write_out_data(&in);
|
||||||
|
|
||||||
// Triangulate the points. Switches are chosen to read and write
|
// Triangulate the points. Switches are chosen to read and write
|
||||||
// a PSLG (p), preserve the convex hull (c), number everything
|
// a PSLG (p), preserve the convex hull (c), number everything
|
||||||
// from zero (z), assign a regional attribute to each element (A),
|
// from zero (z), assign a regional attribute to each element (A),
|
||||||
|
@ -250,30 +321,7 @@ int FGTriangle::run_triangulate() {
|
||||||
triangulate("pczAen", &in, &out, &vorout);
|
triangulate("pczAen", &in, &out, &vorout);
|
||||||
|
|
||||||
// TEMPORARY
|
// TEMPORARY
|
||||||
//
|
write_out_data(&out);
|
||||||
|
|
||||||
// Write out the triangulated data to files so we can check
|
|
||||||
// visually that things seem reasonable
|
|
||||||
|
|
||||||
FILE *node = fopen("tile.node", "w");
|
|
||||||
fprintf(node, "%d 2 %d 0\n",
|
|
||||||
out.numberofpoints, out.numberofpointattributes);
|
|
||||||
for (int i = 0; i < out.numberofpoints; i++) {
|
|
||||||
fprintf(node, "%d %.6f %.6f %.2f\n",
|
|
||||||
i, out.pointlist[2*i], out.pointlist[2*i + 1], 0.0);
|
|
||||||
}
|
|
||||||
fclose(node);
|
|
||||||
|
|
||||||
FILE *ele = fopen("tile.ele", "w");
|
|
||||||
fprintf(ele, "%d 3 0\n", out.numberoftriangles);
|
|
||||||
for (int i = 0; i < out.numberoftriangles; i++) {
|
|
||||||
fprintf(ele, "%d ", i);
|
|
||||||
for (int j = 0; j < out.numberofcorners; j++) {
|
|
||||||
fprintf(ele, "%d ", out.trianglelist[i * out.numberofcorners + j]);
|
|
||||||
}
|
|
||||||
fprintf(ele, "\n");
|
|
||||||
}
|
|
||||||
fclose(ele);
|
|
||||||
|
|
||||||
// free mem allocated to the "Triangle" structures
|
// free mem allocated to the "Triangle" structures
|
||||||
free(in.pointlist);
|
free(in.pointlist);
|
||||||
|
@ -301,6 +349,14 @@ int FGTriangle::run_triangulate() {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.8 1999/03/21 14:02:06 curt
|
||||||
|
// Added a mechanism to dump out the triangle structures for viewing.
|
||||||
|
// Fixed a couple bugs in first pass at triangulation.
|
||||||
|
// - needed to explicitely initialize the polygon accumulator in triangle.cxx
|
||||||
|
// before each polygon rather than depending on the default behavior.
|
||||||
|
// - Fixed a problem with region attribute propagation where I wasn't generating
|
||||||
|
// the hole points correctly.
|
||||||
|
//
|
||||||
// Revision 1.7 1999/03/20 20:32:55 curt
|
// Revision 1.7 1999/03/20 20:32:55 curt
|
||||||
// First mostly successful tile triangulation works. There's plenty of tweaking
|
// First mostly successful tile triangulation works. There's plenty of tweaking
|
||||||
// to do, but we are marching in the right direction.
|
// to do, but we are marching in the right direction.
|
||||||
|
|
|
@ -71,6 +71,8 @@ public:
|
||||||
// assigning attribute areas
|
// assigning attribute areas
|
||||||
void calc_point_inside( const FGTriNodes& trinodes );
|
void calc_point_inside( const FGTriNodes& trinodes );
|
||||||
inline Point3D get_point_inside() const { return inside; }
|
inline Point3D get_point_inside() const { return inside; }
|
||||||
|
|
||||||
|
inline void erase() { poly.erase( poly.begin(), poly.end() ); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -78,6 +80,14 @@ public:
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.3 1999/03/21 14:02:07 curt
|
||||||
|
// Added a mechanism to dump out the triangle structures for viewing.
|
||||||
|
// Fixed a couple bugs in first pass at triangulation.
|
||||||
|
// - needed to explicitely initialize the polygon accumulator in triangle.cxx
|
||||||
|
// before each polygon rather than depending on the default behavior.
|
||||||
|
// - Fixed a problem with region attribute propagation where I wasn't generating
|
||||||
|
// the hole points correctly.
|
||||||
|
//
|
||||||
// Revision 1.2 1999/03/20 20:32:58 curt
|
// Revision 1.2 1999/03/20 20:32:58 curt
|
||||||
// First mostly successful tile triangulation works. There's plenty of tweaking
|
// First mostly successful tile triangulation works. There's plenty of tweaking
|
||||||
// to do, but we are marching in the right direction.
|
// to do, but we are marching in the right direction.
|
||||||
|
|
Loading…
Add table
Reference in a new issue