コード例 #1
0
ファイル: pc_pointlist.c プロジェクト: Remi-C/pointcloud
PCPOINTLIST *
pc_pointlist_from_dimensional(const PCPATCH_DIMENSIONAL *pdl)
{
	PCPOINTLIST *pl;
	PCPATCH_DIMENSIONAL *pdl_uncompressed;
	const PCSCHEMA *schema = pdl->schema;
	int i, j, ndims, npoints;
	assert(pdl);

	pdl_uncompressed = pc_patch_dimensional_decompress(pdl);

	ndims = schema->ndims;
	npoints = pdl->npoints;
	pl = pc_pointlist_make(npoints);

	for ( i = 0; i < npoints; i++ )
	{
		PCPOINT *pt = pc_point_make(schema);
		for ( j = 0; j < ndims; j++ )
		{
			PCDIMENSION *dim = pc_schema_get_dimension(schema, j);

			uint8_t *in = pdl_uncompressed->bytes[j].bytes + dim->size * i;
			uint8_t *out = pt->data + dim->byteoffset;
			memcpy(out, in, dim->size);
		}
		pc_pointlist_add_point(pl, pt);
	}
	pc_patch_dimensional_free(pdl_uncompressed);

	return pl;
}
コード例 #2
0
ファイル: cu_pc_patch.c プロジェクト: Remi-C/pointcloud
/**
* Pivot a pointlist into a dimlist and back.
* Test for data loss or alteration.
*/
static void
test_patch_dimensional()
{
    PCPOINT *pt;
    int i;
    int npts = 10;
    PCPOINTLIST *pl1, *pl2;
    PCPATCH_DIMENSIONAL *pdl;
    PCDIMSTATS *pds;

    pl1 = pc_pointlist_make(npts);

    for ( i = 0; i < npts; i++ )
    {
        pt = pc_point_make(simpleschema);
        pc_point_set_double_by_name(pt, "x", i*2.0);
        pc_point_set_double_by_name(pt, "y", i*1.9);
        pc_point_set_double_by_name(pt, "Z", i*0.34);
        pc_point_set_double_by_name(pt, "intensity", 10);
        pc_pointlist_add_point(pl1, pt);
    }

    pdl = pc_patch_dimensional_from_pointlist(pl1);
    pl2 = pc_pointlist_from_dimensional(pdl);

    for ( i = 0; i < npts; i++ )
    {
        pt = pc_pointlist_get_point(pl2, i);
        double v1, v2, v3, v4;
        pc_point_get_double_by_name(pt, "x", &v1);
        pc_point_get_double_by_name(pt, "y", &v2);
        pc_point_get_double_by_name(pt, "Z", &v3);
        pc_point_get_double_by_name(pt, "intensity", &v4);
        // printf("%g\n", v4);
        CU_ASSERT_DOUBLE_EQUAL(v1, i*2.0, 0.001);
        CU_ASSERT_DOUBLE_EQUAL(v2, i*1.9, 0.001);
        CU_ASSERT_DOUBLE_EQUAL(v3, i*0.34, 0.001);
        CU_ASSERT_DOUBLE_EQUAL(v4, 10, 0.001);
    }

    pds = pc_dimstats_make(simpleschema);
    pc_dimstats_update(pds, pdl);
    pc_dimstats_update(pds, pdl);


    pc_patch_dimensional_free(pdl);
    pc_pointlist_free(pl1);
    pc_pointlist_free(pl2);
    pc_dimstats_free(pds);
}
コード例 #3
0
PCPATCH_UNCOMPRESSED *
pc_patch_uncompressed_from_dimensional(const PCPATCH_DIMENSIONAL *pdl)
{
	int i, j, npoints;
	PCPATCH_UNCOMPRESSED *patch;
	PCPATCH_DIMENSIONAL *pdl_uncompressed;
	const PCSCHEMA *schema;
	uint8_t *buf;

	npoints = pdl->npoints;
	schema = pdl->schema;
	patch = pcalloc(sizeof(PCPATCH_UNCOMPRESSED));
	patch->type = PC_NONE;
	patch->readonly = PC_FALSE;
	patch->schema = schema;
	patch->npoints = npoints;
	patch->maxpoints = npoints;
	patch->bounds = pdl->bounds;
	patch->stats = pc_stats_clone(pdl->stats);
	patch->datasize = schema->size * pdl->npoints;
	patch->data = pcalloc(patch->datasize);
	buf = patch->data;

	/* Can only read from uncompressed dimensions */
	pdl_uncompressed = pc_patch_dimensional_decompress(pdl);

	for ( i = 0; i < npoints; i++ )
	{
		for ( j = 0; j < schema->ndims; j++ )
		{
			PCDIMENSION *dim = pc_schema_get_dimension(schema, j);
			uint8_t *in = pdl_uncompressed->bytes[j].bytes + dim->size * i;
			uint8_t *out = buf + dim->byteoffset;
			memcpy(out, in, dim->size);
		}
		buf += schema->size;
	}

	pc_patch_dimensional_free(pdl_uncompressed);

	return patch;
}
コード例 #4
0
ファイル: cu_pc_patch.c プロジェクト: Remi-C/pointcloud
static void
test_patch_dimensional_compression()
{
    PCPOINT *pt;
    int i;
    int npts = 400;
    PCPOINTLIST *pl1, *pl2;
    PCPATCH_DIMENSIONAL *pch1, *pch2;
    PCDIMSTATS *pds = NULL;
    size_t z1, z2;
    char *str;

    pl1 = pc_pointlist_make(npts);

    for ( i = 0; i < npts; i++ )
    {
        pt = pc_point_make(simpleschema);
        pc_point_set_double_by_name(pt, "x", i*2.0);
        pc_point_set_double_by_name(pt, "y", i*1.9);
        pc_point_set_double_by_name(pt, "Z", i*0.34);
        pc_point_set_double_by_name(pt, "intensity", 10);
        pc_pointlist_add_point(pl1, pt);
    }

    pch1 = pc_patch_dimensional_from_pointlist(pl1);
    z1 = pc_patch_dimensional_serialized_size(pch1);
    // printf("z1 %ld\n", z1);

    pds = pc_dimstats_make(simpleschema);
    pc_dimstats_update(pds, pch1);
    pc_dimstats_update(pds, pch1);
    pch2 = pc_patch_dimensional_compress(pch1, pds);
    z2 = pc_patch_dimensional_serialized_size(pch2);
    // printf("z2 %ld\n", z2);

    str = pc_dimstats_to_string(pds);
    CU_ASSERT_STRING_EQUAL(str, "{\"ndims\":4,\"total_points\":1200,\"total_patches\":3,\"dims\":[{\"total_runs\":1200,\"total_commonbits\":45,\"recommended_compression\":2},{\"total_runs\":1200,\"total_commonbits\":45,\"recommended_compression\":2},{\"total_runs\":1200,\"total_commonbits\":54,\"recommended_compression\":2},{\"total_runs\":3,\"total_commonbits\":48,\"recommended_compression\":1}]}");
    // printf("%s\n", str);
    pcfree(str);

    pl2 = pc_pointlist_from_dimensional(pch2);

    for ( i = 0; i < npts; i++ )
    {
        pt = pc_pointlist_get_point(pl2, i);
        double v1, v2, v3, v4;
        pc_point_get_double_by_name(pt, "x", &v1);
        pc_point_get_double_by_name(pt, "y", &v2);
        pc_point_get_double_by_name(pt, "Z", &v3);
        pc_point_get_double_by_name(pt, "intensity", &v4);
        // printf("%g\n", v4);
        CU_ASSERT_DOUBLE_EQUAL(v1, i*2.0, 0.001);
        CU_ASSERT_DOUBLE_EQUAL(v2, i*1.9, 0.001);
        CU_ASSERT_DOUBLE_EQUAL(v3, i*0.34, 0.001);
        CU_ASSERT_DOUBLE_EQUAL(v4, 10, 0.001);
    }

    pc_patch_dimensional_free(pch1);
    pc_patch_dimensional_free(pch2);
//    pc_patch_dimensional_free(pch3);
    pc_pointlist_free(pl1);
    pc_pointlist_free(pl2);
    if ( pds ) pc_dimstats_free(pds);
}