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);

}
Example #2
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);
	}

}
Example #6
0
 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
 }
Example #7
0
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;
}
Example #8
0
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;
}