void find_quads(uint *vertex, uint *ref, uint ref_length, uint *edge, uint edge_length) { uint i, j, k, prev, next; ref_length *= 4; for(i = 0; i < ref_length; i++) { for(j = 0; j < GlobalSurfaceCreate.list_length[0]; j++) { if(ref[i] == GlobalSurfaceCreate.list[0][j].vertex && GlobalSurfaceCreate.list[0][j].vertex != vertex[0] && (GlobalSurfaceCreate.list[0][j].primitive != i / 4 || GlobalSurfaceCreate.list[0][j].polygon != TRUE)) { if(ref[(i / 4) * 4 + 3] != ~0u) { prev = (i / 4) * 4 + ((i + 3) % 4); next = (i / 4) * 4 + ((i + 1) % 4); for(k = 0; k < GlobalSurfaceCreate.list_length[1]; k++) { if(ref[prev] == GlobalSurfaceCreate.list[1][k].vertex && GlobalSurfaceCreate.list[1][k].vertex != vertex[1] && (GlobalSurfaceCreate.list[1][k].primitive != i / 4 || GlobalSurfaceCreate.list[1][k].polygon != TRUE)) create_polygon(vertex, k, j, 0, 1); if(ref[next] == GlobalSurfaceCreate.list[1][k].vertex && GlobalSurfaceCreate.list[1][k].vertex != vertex[1] && (GlobalSurfaceCreate.list[1][k].primitive != i / 4 || GlobalSurfaceCreate.list[1][k].polygon != TRUE)) create_polygon(vertex, k, j, 1, 0); } } else { prev = (i / 4) * 4 + (((i % 4)+ 2) % 3); next = (i / 4) * 4 + (((i % 4)+ 1) % 3); for(k = 0; k < GlobalSurfaceCreate.list_length[1]; k++) { if(ref[prev] == GlobalSurfaceCreate.list[1][k].vertex && GlobalSurfaceCreate.list[1][k].vertex != vertex[1] && (GlobalSurfaceCreate.list[1][k].primitive != i / 4 || GlobalSurfaceCreate.list[1][k].polygon != TRUE)) create_polygon(vertex, k, j, 0, 1); if(ref[next] == GlobalSurfaceCreate.list[1][k].vertex && GlobalSurfaceCreate.list[1][k].vertex != vertex[1] && (GlobalSurfaceCreate.list[1][k].primitive != i / 4 || GlobalSurfaceCreate.list[1][k].polygon != TRUE)) create_polygon(vertex, k, j, 1, 0); } } } } } edge_length *= 2; for(i = 0; i < edge_length; i++) for(j = 0; j < GlobalSurfaceCreate.list_length[0]; j++) if(edge[i] == GlobalSurfaceCreate.list[0][j].vertex) for(k = 0; k < GlobalSurfaceCreate.list_length[1]; k++) if(edge[i + (1 - (i % 2) * 2)] == GlobalSurfaceCreate.list[1][k].vertex) create_polygon(vertex, k, j, 0, 0); }
polygon_type create_polygon(const osmium::Way& way, use_nodes un=use_nodes::unique, direction dir = direction::forward) { try { return create_polygon(way.nodes(), un, dir); } catch (osmium::geometry_error& e) { e.set_id("way", way.id()); throw; } }
void ShZshapeManager::create_shape(const char* content) { if (content == "cube") { create_cube(); } if (content == "cylinder") { create_cylinder(); } if (content == "pipe") { create_pipe(); } if (content == "cone") { create_cone(); } if (content == "circle") { create_circle(); } if (content == "ring") { create_ring(); } if (content == "pyramid") { create_pyramid(); } if (content == "triangle") { create_triangle(); } if (content == "rectangle") { create_rectangle(); } if (content == "polygon") { create_polygon(); } if (content == "multigonalStar") { create_multigonalStar(); } }
void find_triangles(uint *vertex) { uint i, j; for(i = 0; i < GlobalSurfaceCreate.list_length[0]; i++) for(j = 0; j < GlobalSurfaceCreate.list_length[1]; j++) if(GlobalSurfaceCreate.list[0][i].vertex == GlobalSurfaceCreate.list[1][j].vertex) create_polygon(vertex, j, i, 0, 0); }
void ShZshapeManager::create_shape(const char* content, GLdouble positionX, GLdouble positionY, GLdouble positionZ, GLint edges_angles, GLdouble r) { if (content == "polygon") { create_polygon(positionX, positionY, positionZ, edges_angles, r); } if (content == "multigonalStar") { create_multigonalStar(positionX, positionY, positionZ, edges_angles, r); } }
result_type operator()(T0 geom_type, T1 & coord, T2 & arcs, T3 & props) const { switch (geom_type) { case 1: //Point return create_point()(coord, props); case 2: //LineString return create_line_string()(arcs, props); case 3: //Polygon return create_polygon()(arcs, props); case 4: //MultiPoint return create_multi_point()(coord, props); case 5: //MultiLineString return create_multi_line_string()(arcs, props); case 6: //MultiPolygon return create_multi_polygon()(arcs, props); default: break; } return mapnik::topojson::geometry(); //empty }
int export_areas_single(struct Map_info *In, int field, int donocat, OGRFeatureDefnH Ogr_featuredefn,OGRLayerH Ogr_layer, struct field_info *Fi, dbDriver *driver, int ncol, int *colctype, const char **colname, int doatt, int nocat, int *n_noatt, int *n_nocat) { int i, j; int centroid, cat, area, n_areas; int n_exported; struct line_pnts *Points; struct line_cats *Cats; OGRGeometryH Ogr_geometry; OGRFeatureH Ogr_feature; Points = Vect_new_line_struct(); Cats = Vect_new_cats_struct(); n_exported = 0; n_areas = Vect_get_num_areas(In); for (i = 1; i <= n_areas; i++) { G_percent(i, n_areas, 5); /* get centroid's category */ centroid = Vect_get_area_centroid(In, i); cat = -1; if (centroid > 0) { Vect_read_line(In, NULL, Cats, centroid); Vect_cat_get(Cats, field, &cat); } G_debug(3, "area = %d centroid = %d ncats = %d", i, centroid, Cats->n_cats); if (cat < 0 && !donocat) { (*n_nocat)++; continue; /* skip areas without category, do not export * not labeled */ } /* find correspoding area */ area = Vect_get_centroid_area(In, centroid); if (area == 0) continue; /* create polygon from area */ Ogr_geometry = create_polygon(In, area, Points); /* add feature */ Ogr_feature = OGR_F_Create(Ogr_featuredefn); OGR_F_SetGeometry(Ogr_feature, Ogr_geometry); /* output one feature for each category */ for (j = -1; j < Cats->n_cats; j++) { if (j == -1) { if (cat >= 0) continue; /* cat(s) exists */ (*n_nocat)++; } else { if (Cats->field[j] == field) cat = Cats->cat[j]; else continue; } mk_att(cat, Fi, driver, ncol, colctype, colname, doatt, nocat, Ogr_feature, n_noatt); OGR_L_CreateFeature(Ogr_layer, Ogr_feature); n_exported++; } OGR_G_DestroyGeometry(Ogr_geometry); OGR_F_Destroy(Ogr_feature); } Vect_destroy_line_struct(Points); Vect_destroy_cats_struct(Cats); return n_exported; }
int export_areas_multi(struct Map_info *In, int field, int donocat, OGRFeatureDefnH Ogr_featuredefn,OGRLayerH Ogr_layer, struct field_info *Fi, dbDriver *driver, int ncol, int *colctype, const char **colname, int doatt, int nocat, int *n_noatt, int *n_nocat) { int i, n_exported, area; int cat, ncats_field, line, type, findex, ipart; struct line_pnts *Points; struct line_cats *Cats; struct ilist *cat_list, *line_list, *lcats; OGRGeometryH Ogr_geometry, Ogr_geometry_part; OGRFeatureH Ogr_feature; OGRwkbGeometryType wkbtype, wkbtype_part; Points = Vect_new_line_struct(); Cats = Vect_new_cats_struct(); cat_list = Vect_new_list(); line_list = Vect_new_list(); lcats = Vect_new_list(); n_exported = 0; /* check if category index is available for given field */ findex = Vect_cidx_get_field_index(In, field); if (findex == -1) G_fatal_error(_("Unable to export multi-features. No category index for layer %d."), field); /* determine type */ wkbtype_part = wkbPolygon; wkbtype = get_multi_wkbtype(wkbtype_part); ncats_field = Vect_cidx_get_unique_cats_by_index(In, findex, cat_list); G_debug(1, "n_cats = %d for layer %d", ncats_field, field); if (donocat) G_message(_("Exporting features with category...")); for (i = 0; i < cat_list->n_values; i++) { G_percent(i, cat_list->n_values - 1, 5); cat = cat_list->value[i]; /* find all centroids with given category */ Vect_cidx_find_all(In, field, GV_CENTROID, cat, line_list); /* create multi-feature */ Ogr_geometry = OGR_G_CreateGeometry(wkbtype); /* build simple features geometry, go through all parts */ for (ipart = 0; ipart < line_list->n_values; ipart++) { line = line_list->value[ipart]; G_debug(3, "cat=%d, line=%d -> part=%d", cat, line, ipart); /* get centroid's category */ Vect_read_line(In, NULL, Cats, line); /* check for category consistency */ Vect_field_cat_get(Cats, field, lcats); if (!Vect_val_in_list(lcats, cat)) G_fatal_error(_("Unable to create multi-feature. " "Category %d not found in line %d, field %d"), cat, line, field); /* find correspoding area */ area = Vect_get_centroid_area(In, line); if (area == 0) continue; /* create polygon from area */ Ogr_geometry_part = create_polygon(In, area, Points); /* add part */ OGR_G_AddGeometryDirectly(Ogr_geometry, Ogr_geometry_part); } if (!OGR_G_IsEmpty(Ogr_geometry)) { /* write multi-feature */ Ogr_feature = OGR_F_Create(Ogr_featuredefn); OGR_F_SetGeometry(Ogr_feature, Ogr_geometry); mk_att(cat, Fi, driver, ncol, colctype, colname, doatt, nocat, Ogr_feature, n_noatt); OGR_L_CreateFeature(Ogr_layer, Ogr_feature); OGR_F_Destroy(Ogr_feature); n_exported++; } else { /* skip empty features */ G_debug(3, "multi-feature is empty -> skipped"); } OGR_G_DestroyGeometry(Ogr_geometry); } if (donocat) G_message(_("Exporting features without category...")); /* check lines without category, if -c flag is given write them as * one multi-feature */ Ogr_geometry = OGR_G_CreateGeometry(wkbtype); Vect_rewind(In); Vect_set_constraint_type(In, GV_CENTROID); while(TRUE) { type = Vect_read_next_line(In, NULL, Cats); if (type < 0) break; /* get centroid's category */ Vect_cat_get(Cats, field, &cat); if (cat > 0) continue; /* skip features with category */ if (cat < 0 && !donocat) { (*n_nocat)++; continue; /* skip lines without category, do not export * not labeled */ } /* find correspoding area */ line = Vect_get_next_line_id(In); area = Vect_get_centroid_area(In, line); if (area == 0) continue; /* create polygon from area */ Ogr_geometry_part = create_polygon(In, area, Points); /* add part */ OGR_G_AddGeometryDirectly(Ogr_geometry, Ogr_geometry_part); (*n_nocat)++; } if (!OGR_G_IsEmpty(Ogr_geometry)) { /* write multi-feature */ Ogr_feature = OGR_F_Create(Ogr_featuredefn); OGR_F_SetGeometry(Ogr_feature, Ogr_geometry); mk_att(cat, Fi, driver, ncol, colctype, colname, doatt, nocat, Ogr_feature, n_noatt); OGR_L_CreateFeature(Ogr_layer, Ogr_feature); OGR_F_Destroy(Ogr_feature); n_exported++; } else { /* skip empty features */ G_debug(3, "multi-feature is empty -> skipped"); } OGR_G_DestroyGeometry(Ogr_geometry); Vect_destroy_line_struct(Points); Vect_destroy_cats_struct(Cats); Vect_destroy_list(cat_list); Vect_destroy_list(line_list); Vect_destroy_list(lcats); return n_exported; }