1
0
Fork 0

no more Point2d - use SGVec2d.

This commit is contained in:
2012-10-11 20:57:53 -04:00
parent 531ec93b29
commit 59e2f22050
9 changed files with 92 additions and 159 deletions

View file

@ -33,26 +33,13 @@
#define TG_MAX_AREA_TYPES 128
//#include <string>
//#include <vector>
//#include <simgear/compiler.h>
//#include <simgear/bucket/newbucket.hxx>
//#include <simgear/misc/sg_path.hxx>
//#include <simgear/debug/logstream.hxx>
#include <Array/array.hxx>
//#include <Polygon/superpoly.hxx>
//#include <Polygon/texparams.hxx>
#include <Geometry/tg_nodes.hxx>
#include <landcover/landcover.hxx>
#include "tglandclass.hxx"
//#include "priorities.hxx"
#define FIND_SLIVERS (0)
#define FIND_SLIVERS (1)
#define USE_ACCUMULATOR (1)

View file

@ -37,7 +37,7 @@ bool TGConstruct::ClipLandclassPolys( void ) {
poly_list slivers;
int i, j;
Point3D p;
point2d min, max;
SGVec2d min, max;
bool debug_area, debug_shape;
static int accum_idx = 0;
@ -46,10 +46,10 @@ bool TGConstruct::ClipLandclassPolys( void ) {
#endif
// Get clip bounds
min.x = bucket.get_center_lon() - 0.5 * bucket.get_width();
min.y = bucket.get_center_lat() - 0.5 * bucket.get_height();
max.x = bucket.get_center_lon() + 0.5 * bucket.get_width();
max.y = bucket.get_center_lat() + 0.5 * bucket.get_height();
min.x() = bucket.get_center_lon() - 0.5 * bucket.get_width();
min.y() = bucket.get_center_lat() - 0.5 * bucket.get_height();
max.x() = bucket.get_center_lon() + 0.5 * bucket.get_width();
max.y() = bucket.get_center_lat() + 0.5 * bucket.get_height();
#if USE_ACCUMULATOR
@ -62,19 +62,19 @@ bool TGConstruct::ClipLandclassPolys( void ) {
// set up clipping tile : and remember to add the nodes!
safety_base.erase();
p = Point3D(min.x, min.y, -9999.0);
p = Point3D(min.x(), min.y(), -9999.0);
safety_base.add_node( 0, p );
nodes.unique_add( p );
p = Point3D(max.x, min.y, -9999.0);
p = Point3D(max.x(), min.y(), -9999.0);
safety_base.add_node( 0, p );
nodes.unique_add( p );
p = Point3D(max.x, max.y, -9999.0);
p = Point3D(max.x(), max.y(), -9999.0);
safety_base.add_node( 0, p );
nodes.unique_add( p );
p = Point3D(min.x, max.y, -9999.0);
p = Point3D(min.x(), max.y(), -9999.0);
safety_base.add_node( 0, p );
nodes.unique_add( p );

View file

@ -1,23 +0,0 @@
/**
* Simple 2d point class where members can be accessed as x, dist, or lon
* and y, theta, or lat
*/
#ifndef TG_POINT2D_HXX
#define TG_POINT2D_HXX
class point2d {
public:
union {
double x;
double dist;
double lon;
};
union {
double y;
double theta;
double lat;
};
};
#endif // TG_POINT2D_HXX

View file

@ -40,7 +40,6 @@
#include <poly2tri/interface.h>
#include "polygon.hxx"
#include "point2d.hxx"
using std::endl;
using std::cout;
@ -153,34 +152,24 @@ void TGPolygon::set_elevations( double elev ) {
}
}
// Calculate theta of angle (a, b, c)
double tgPolygonCalcAngle(point2d a, point2d b, point2d c) {
point2d u, v;
double udist, vdist, uv_dot, tmp;
double tgPolygonCalcAngle(SGVec2d a, SGVec2d b, SGVec2d c) {
SGVec2d u, v;
double udist, vdist, uv_dot;
// u . v = ||u|| * ||v|| * cos(theta)
u.x = b.x - a.x;
u.y = b.y - a.y;
udist = sqrt( u.x * u.x + u.y * u.y );
// printf("udist = %.6f\n", udist);
u = b-a;
udist = dist(a,b);
v.x = b.x - c.x;
v.y = b.y - c.y;
vdist = sqrt( v.x * v.x + v.y * v.y );
// printf("vdist = %.6f\n", vdist);
v = b-c;
vdist = dist(b,c);
uv_dot = u.x * v.x + u.y * v.y;
// printf("uv_dot = %.6f\n", uv_dot);
uv_dot = dot(u,v);
tmp = uv_dot / (udist * vdist);
// printf("tmp = %.6f\n", tmp);
return acos(tmp);
return acos(uv_dot / (udist * vdist));
}
// return the perimeter of a contour (assumes simple polygons,
// i.e. non-self intersecting.)
//
@ -208,43 +197,42 @@ double TGPolygon::minangle_contour( const int contour ) {
point_list c = poly[contour];
int size = c.size();
int p1_index, p2_index, p3_index;
point2d p1, p2, p3;
SGVec2d p1, p2, p3;
double angle;
double min_angle = 2.0 * SGD_PI;
for ( int i = 0; i < size; ++i ) {
p1_index = i - 1;
if ( p1_index < 0 ) {
p1_index += size;
}
p1_index = i - 1;
if ( p1_index < 0 ) {
p1_index += size;
}
p2_index = i;
p2_index = i;
p3_index = i + 1;
if ( p3_index >= size ) {
p3_index -= size;
}
p3_index = i + 1;
if ( p3_index >= size ) {
p3_index -= size;
}
p1.x = c[p1_index].x();
p1.y = c[p1_index].y();
p1.x() = c[p1_index].x();
p1.y() = c[p1_index].y();
p2.x = c[p2_index].x();
p2.y = c[p2_index].y();
p2.x() = c[p2_index].x();
p2.y() = c[p2_index].y();
p3.x = c[p3_index].x();
p3.y = c[p3_index].y();
p3.x() = c[p3_index].x();
p3.y() = c[p3_index].y();
angle = tgPolygonCalcAngle( p1, p2, p3 );
angle = tgPolygonCalcAngle( p1, p2, p3 );
if ( angle < min_angle ) {
min_angle = angle;
}
if ( angle < min_angle ) {
min_angle = angle;
}
}
return min_angle;
}
// return true if contour A is inside countour B
bool TGPolygon::is_inside( int a, int b ) const {
// make polygons from each specified contour
@ -284,10 +272,10 @@ bool TGPolygon::is_inside( int a, int b ) const {
// shift every point in the polygon by lon, lat
void TGPolygon::shift( double lon, double lat ) {
for ( int i = 0; i < (int)poly.size(); ++i ) {
for ( int j = 0; j < (int)poly[i].size(); ++j ) {
poly[i][j].setx( poly[i][j].x() + lon );
poly[i][j].sety( poly[i][j].y() + lat );
}
for ( int j = 0; j < (int)poly[i].size(); ++j ) {
poly[i][j].setx( poly[i][j].x() + lon );
poly[i][j].sety( poly[i][j].y() + lat );
}
}
}
@ -299,10 +287,10 @@ void TGPolygon::write( const std::string& file ) const {
fprintf(fp, "%ld\n", poly.size());
for ( int i = 0; i < (int)poly.size(); ++i ) {
fprintf(fp, "%ld\n", poly[i].size());
for ( int j = 0; j < (int)poly[i].size(); ++j ) {
fprintf(fp, "%.6f %.6f\n", poly[i][j].x(), poly[i][j].y());
}
fprintf(fp, "%.6f %.6f\n", poly[i][0].x(), poly[i][0].y());
for ( int j = 0; j < (int)poly[i].size(); ++j ) {
fprintf(fp, "%.6f %.6f\n", poly[i][j].x(), poly[i][j].y());
}
fprintf(fp, "%.6f %.6f\n", poly[i][0].x(), poly[i][0].y());
}
fclose(fp);

View file

@ -38,8 +38,6 @@
#include <string>
#include <vector>
#include "point2d.hxx"
// forward declaration
class TGPolygon;
@ -220,7 +218,7 @@ typedef poly_list::const_iterator const_poly_list_iterator;
// Calculate theta of angle (a, b, c)
double tgPolygonCalcAngle(point2d a, point2d b, point2d c);
double tgPolygonCalcAngle(SGVec2d a, SGVec2d b, SGVec2d c);
// canonify the polygon winding, outer contour must be anti-clockwise,

View file

@ -36,7 +36,6 @@
#include <simgear/misc/sg_dir.hxx>
#include <HGT/hgt.hxx>
#include <Polygon/point2d.hxx>
#include <stdlib.h>
@ -75,41 +74,37 @@ int main(int argc, char **argv) {
hgt.load();
hgt.close();
point2d min, max;
min.x = hgt.get_originx() / 3600.0 + SG_HALF_BUCKET_SPAN;
min.y = hgt.get_originy() / 3600.0 + SG_HALF_BUCKET_SPAN;
SGBucket b_min( min.x, min.y );
SGVec2d min, max;
min.x() = hgt.get_originx() / 3600.0 + SG_HALF_BUCKET_SPAN;
min.y() = hgt.get_originy() / 3600.0 + SG_HALF_BUCKET_SPAN;
SGBucket b_min( min.x(), min.y() );
max.x = (hgt.get_originx() + hgt.get_cols() * hgt.get_col_step()) / 3600.0
- SG_HALF_BUCKET_SPAN;
max.y = (hgt.get_originy() + hgt.get_rows() * hgt.get_row_step()) / 3600.0
- SG_HALF_BUCKET_SPAN;
SGBucket b_max( max.x, max.y );
max.x() = (hgt.get_originx() + hgt.get_cols() * hgt.get_col_step()) / 3600.0 - SG_HALF_BUCKET_SPAN;
max.y() = (hgt.get_originy() + hgt.get_rows() * hgt.get_row_step()) / 3600.0 - SG_HALF_BUCKET_SPAN;
SGBucket b_max( max.x(), max.y() );
if ( b_min == b_max ) {
hgt.write_area( work_dir, b_min );
hgt.write_area( work_dir, b_min );
} else {
SGBucket b_cur;
int dx, dy, i, j;
SGBucket b_cur;
int dx, dy, i, j;
sgBucketDiff(b_min, b_max, &dx, &dy);
cout << "HGT file spans tile boundaries (ok)" << endl;
cout << " dx = " << dx << " dy = " << dy << endl;
sgBucketDiff(b_min, b_max, &dx, &dy);
cout << "HGT file spans tile boundaries (ok)" << endl;
cout << " dx = " << dx << " dy = " << dy << endl;
if ( (dx > 20) || (dy > 20) ) {
cout << "somethings really wrong!!!!" << endl;
exit(-1);
}
if ( (dx > 20) || (dy > 20) ) {
cout << "somethings really wrong!!!!" << endl;
exit(-1);
}
for ( j = 0; j <= dy; j++ ) {
for ( i = 0; i <= dx; i++ ) {
b_cur = sgBucketOffset(min.x, min.y, i, j);
hgt.write_area( work_dir, b_cur );
}
}
for ( j = 0; j <= dy; j++ ) {
for ( i = 0; i <= dx; i++ ) {
b_cur = sgBucketOffset(min.x(), min.y(), i, j);
hgt.write_area( work_dir, b_cur );
}
}
}
return 0;
}
}

View file

@ -43,13 +43,8 @@
#include <simgear/misc/sg_dir.hxx>
#include <boost/foreach.hpp>
#include <tiffio.h>
#include <Polygon/point2d.hxx>
#include <zlib.h>
#include <Lib/HGT/srtmbase.hxx>
using std::cout;
@ -351,16 +346,14 @@ int main(int argc, char **argv) {
hgt.load();
hgt.close();
point2d min, max;
min.x = hgt.get_originx() / 3600.0 + SG_HALF_BUCKET_SPAN;
min.y = hgt.get_originy() / 3600.0 + SG_HALF_BUCKET_SPAN;
SGBucket b_min( min.x, min.y );
SGVec2d min, max;
min.x() = hgt.get_originx() / 3600.0 + SG_HALF_BUCKET_SPAN;
min.y() = hgt.get_originy() / 3600.0 + SG_HALF_BUCKET_SPAN;
SGBucket b_min( min.x(), min.y() );
max.x = (hgt.get_originx() + hgt.get_cols() * hgt.get_col_step()) / 3600.0
- SG_HALF_BUCKET_SPAN;
max.y = (hgt.get_originy() + hgt.get_rows() * hgt.get_row_step()) / 3600.0
- SG_HALF_BUCKET_SPAN;
SGBucket b_max( max.x, max.y );
max.x() = (hgt.get_originx() + hgt.get_cols() * hgt.get_col_step()) / 3600.0 - SG_HALF_BUCKET_SPAN;
max.y() = (hgt.get_originy() + hgt.get_rows() * hgt.get_row_step()) / 3600.0 - SG_HALF_BUCKET_SPAN;
SGBucket b_max( max.x(), max.y() );
if ( b_min == b_max ) {
hgt.write_area( work_dir, b_min );
@ -379,11 +372,11 @@ int main(int argc, char **argv) {
for ( j = 0; j <= dy; j++ ) {
for ( i = 0; i <= dx; i++ ) {
b_cur = sgBucketOffset(min.x, min.y, i, j);
b_cur = sgBucketOffset(min.x(), min.y(), i, j);
hgt.write_area( work_dir, b_cur );
}
}
}
return 0;
}
}

View file

@ -34,8 +34,6 @@
#include <simgear/debug/logstream.hxx>
#include <Array/array.hxx>
#include <Polygon/point2d.hxx>
#include <stdlib.h>
using std::cout;
@ -62,14 +60,14 @@ int main(int argc, char **argv) {
int lat_arcsec = (int)(lat_deg * 3600.0);
int res = 1;
point2d min, max;
min.x = lon_deg + SG_HALF_BUCKET_SPAN;
min.y = lat_deg + SG_HALF_BUCKET_SPAN;
SGBucket b_min( min.x, min.y );
SGVec2d min, max;
min.x() = lon_deg + SG_HALF_BUCKET_SPAN;
min.y() = lat_deg + SG_HALF_BUCKET_SPAN;
SGBucket b_min( min.x(), min.y() );
max.x = lon_deg + 1 - SG_HALF_BUCKET_SPAN;
max.y = lat_deg + 1 - SG_HALF_BUCKET_SPAN;
SGBucket b_max( max.x, max.y );
max.x() = lon_deg + 1 - SG_HALF_BUCKET_SPAN;
max.y() = lat_deg + 1 - SG_HALF_BUCKET_SPAN;
SGBucket b_max( max.x(), max.y() );
SGBucket b_cur;
int dx, dy, i, j;
@ -84,7 +82,7 @@ int main(int argc, char **argv) {
for ( j = 0; j <= dy; j++ ) {
for ( i = 0; i <= dx; i++ ) {
b_cur = sgBucketOffset(min.x, min.y, i, j);
b_cur = sgBucketOffset(min.x(), min.y(), i, j);
string file = work_dir + "/";
file += b_cur.gen_base_path() + "/";
file += b_cur.gen_index_str();
@ -112,8 +110,8 @@ int main(int argc, char **argv) {
gzFile fp;
if ( (fp = gzopen( out_file.c_str(), "wb9" )) == NULL ) {
cout << "ERROR: cannot open " << out_file << " for writing!" << endl;
exit(-1);
cout << "ERROR: cannot open " << out_file << " for writing!" << endl;
exit(-1);
}
gzprintf( fp, "%d\n", (int)(3600 / res) + 1);
@ -126,6 +124,4 @@ int main(int argc, char **argv) {
gzclose(fp);
return 0;
}
}

View file

@ -45,7 +45,6 @@
#include <simgear/misc/sg_dir.hxx>
#include <Polygon/polygon.hxx>
#include <Polygon/point2d.hxx>
#include <ogrsf_frmts.h>