Created a lookup table

This commit is contained in:
Trygve 2024-04-27 18:01:43 +02:00
parent f962a40ade
commit 882764a13d

View File

@ -56,13 +56,33 @@ std::vector<CellMap> vector_cellmap(HeightMap* heightmap, int interval)
std::tuple<double, double> local_to_projected(double* geotransform, int x, int y) std::tuple<double, double> local_to_projected(double* geotransform, int x, int y)
{ {
return { return {
geotransform[1] * x + geotransform[2] * y + geotransform[1] * x + geotransform[2] * y +
geotransform[1] * 0.5 + geotransform[2] * 0.5 + geotransform[0], geotransform[1] * 0.5 + geotransform[2] * 0.5 + geotransform[0],
geotransform[4] * x + geotransform[5] * y + geotransform[4] * x + geotransform[5] * y +
geotransform[4] * 0.5 + geotransform[5] * 0.5 + geotransform[3] geotransform[4] * 0.5 + geotransform[5] * 0.5 + geotransform[3]
}; };
} }
constexpr std::tuple<double, double, double, double> marching_squares_lookup(int mcase)
{
switch (mcase) {
case 1: return {0, 0.5, 0.5, 0};
case 2: return {1, 0.5, 0.5, 0};
case 3: return {0, 0.5, 1, 0};
case 4: return {0.5, 1, 1, 0.5};
case 5: return {0, 0, 0, 0}; //FIXME
case 6: return {0.5, 1, 0.5, 0};
case 7: return {0, 0.5, 0.5, 1};
case 8: return {0, 0.5, 0.5, 1};
case 9: return {0.5, 1, 0.5, 0};
case 10: return {0, 0, 0, 0}; //FIXME
case 11: return {0.5, 1, 1, 0.5};
case 12: return {0, 0.5, 1, 0.5};
case 13: return {0.5, 0, 1, 0.5};
case 14: return {0, 0.5, 0.5, 0};
}
}
void write_output_file(std::vector<CellMap> cellmaps, const char *filepath) void write_output_file(std::vector<CellMap> cellmaps, const char *filepath)
{ {
@ -108,35 +128,41 @@ void write_output_file(std::vector<CellMap> cellmaps, const char *filepath)
for (int j = 0; j < cellmaps.size(); j++) for (int j = 0; j < cellmaps.size(); j++)
{ {
CellMap* cellmap = &cellmaps[j]; CellMap* cellmap = &cellmaps[j];
OGRFeature *feature;
OGRLineString *geometry = new OGRLineString();
feature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
feature->SetField( "Name", j );
for (int i = 0; i < cellmap->height*cellmap->width; i++) for (int i = 0; i < cellmap->height*cellmap->width; i++)
{ {
if (*(cellmap->cells + i) != 0 && *(cellmap->cells + i) != 15) if (*(cellmap->cells + i) != 0 && *(cellmap->cells + i) != 15)
{ {
OGRFeature *feature;
OGRLineString *geometry = new OGRLineString();
feature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
feature->SetField( "Name", j );
int x_raw = i%cellmap->width; int x_raw = i%cellmap->width;
int y_raw = i/cellmap->width; int y_raw = i/cellmap->width;
auto [x, y] = local_to_projected(cellmap->geotransform, x_raw, y_raw); auto [x, y] = local_to_projected(cellmap->geotransform, x_raw, y_raw);
auto [x_bl, y_bl, x_tr, y_tr] = marching_squares_lookup(*(cellmap->cells + i) );
//std::cout << x << ", " << y << " "; //std::cout << x << ", " << y << " ";
geometry->setPoint( geometry->getNumPoints(), x, y ); geometry->setPoint( geometry->getNumPoints(), x+x_tr*0.25, y+y_tr*0.25 );
} geometry->setPoint( geometry->getNumPoints(), x+x_bl*0.25, y+y_bl*0.25 );
if ( feature->SetGeometry(geometry) != OGRERR_NONE)
{
printf( "Failed to set geometry.\n" );
exit( 1 );
}
OGRGeometryFactory::destroyGeometry(geometry);
if( poLayer->CreateFeature( feature ) != OGRERR_NONE )
{
printf( "Failed to create feature in shapefile.\n" );
exit( 1 );
}
OGRFeature::DestroyFeature( feature );
}
} }
if ( feature->SetGeometry(geometry) != OGRERR_NONE)
{
printf( "Failed to set geometry.\n" );
exit( 1 );
}
OGRGeometryFactory::destroyGeometry(geometry);
if( poLayer->CreateFeature( feature ) != OGRERR_NONE )
{
printf( "Failed to create feature in shapefile.\n" );
exit( 1 );
}
OGRFeature::DestroyFeature( feature );
} }
GDALClose( poDS ); GDALClose( poDS );