Exemplo n.º 1
0
/* Performs Natural Neighbours interpolation for an array of points.
 *
 * @param nin Number of input points
 * @param pin Array of input points [pin]
 * @param wmin Minimal allowed weight
 * @param nout Number of output points
 * @param pout Array of output points [nout]
 */
void nnpi_interpolate_points(int nin, point pin[], double wmin, int nout, point pout[])
{
    delaunay* d = delaunay_build(nin, pin, 0, NULL, 0, NULL);
    nnpi* nn = nnpi_create(d);
    int seed = 0;
    int i;

    nnpi_setwmin(nn, wmin);

    if (nn_verbose) {
        fprintf(stderr, "xytoi:\n");
        for (i = 0; i < nout; ++i) {
            point* p = &pout[i];

            fprintf(stderr, "(%.7g,%.7g) -> %d\n", p->x, p->y, delaunay_xytoi(d, p, seed));
        }
    }

    for (i = 0; i < nout; ++i)
        nnpi_interpolate_point(nn, &pout[i]);

    if (nn_verbose) {
        fprintf(stderr, "output:\n");
        for (i = 0; i < nout; ++i) {
            point* p = &pout[i];

            fprintf(stderr, "  %d:%15.7g %15.7g %15.7g\n", i, p->x, p->y, p->z);
        }
    }

    nnpi_destroy(nn);
    delaunay_destroy(d);
}
NaturalNeigbourInterpolation::NaturalNeigbourInterpolation(
        QVector<QVector3D> &values) :
    Interpolation(values),
    delaunay_(NULL),
    interpolator_(NULL)
{
    points_.clear();

    for (int i = 0; i < values_.size(); ++i)
    {
        point a;
        a.x = values_[i].x();
        a.y = values_[i].y();
        a.z = values_[i].z();
        points_.append(a);
    }

    delaunay_ = delaunay_build(points_.size(), points_.data(), 0, NULL, 0, NULL);
    interpolator_ = nnpi_create(delaunay_);
    nnpi_setwmin(interpolator_, -DBL_MAX);
}
Exemplo n.º 3
0
/* A version of nnbathy that interpolates output points serially. Can save a
 * bit of memory for large output grids.
 */
int main(int argc, char* argv[])
{
    specs* s = specs_create();
    int nin = 0;
    point* pin = NULL;
    minell* me = NULL;
    point* pout = NULL;
    double k = NaN;
    preader* pr = NULL;
    delaunay* d = NULL;
    void* interpolator = NULL;
    int ndone = 0;

    parse_commandline(argc, argv, s);

    if (s->fin == NULL)
        quit("no input data\n");

    if (!s->generate_points && s->fout == NULL && !s->nointerp)
        quit("no output grid specified\n");

    points_read(s->fin, 3, &nin, &pin);

    if (nin < 3)
        return 0;

    if (s->thin == 1)
        points_thingrid(&nin, &pin, s->nxd, s->nyd);
    else if (s->thin == 2)
        points_thinlin(&nin, &pin, s->rmax);

    if (s->nointerp) {
        points_write(nin, pin);
        specs_destroy(s);
        free(pin);
        return 0;
    }

    if (s->generate_points) {
        points_getrange(nin, pin, s->zoom, &s->xmin, &s->xmax, &s->ymin, &s->ymax);
        pr = preader_create1(s->xmin, s->xmax, s->ymin, s->ymax, s->nx, s->ny);
    } else
        pr = preader_create2(s->fout);

    if (s->invariant) {
        me = minell_build(nin, pin);
        minell_scalepoints(me, nin, pin);
    } else if (s->square)
        k = points_scaletosquare(nin, pin);

    d = delaunay_build(nin, pin, 0, NULL, 0, NULL);

    if (s->linear)
        interpolator = lpi_build(d);
    else {
        interpolator = nnpi_create(d);
        nnpi_setwmin(interpolator, s->wmin);
    }

    while ((pout = preader_getpoint(pr)) != NULL) {
        if (s->invariant)
            minell_scalepoints(me, 1, pout);
        else if (s->square)
            points_scale(1, pout, k);

        if (s->linear)
            lpi_interpolate_point(interpolator, pout);
        else
            nnpi_interpolate_point(interpolator, pout);

        if (s->invariant)
            minell_rescalepoints(me, 1, pout);
        else if (s->square)
            points_scale(1, pout, 1.0 / k);

        points_write(1, pout);
        ndone++;

        if (s->npoints > 0)
            fprintf(stderr, "  %5.2f%% done\r", 100.0 * ndone / s->npoints);
    }
    if (s->npoints > 0)
        fprintf(stderr, "                \r");

    if (me != NULL)
        minell_destroy(me);
    if (s->linear)
        lpi_destroy(interpolator);
    else
        nnpi_destroy(interpolator);
    delaunay_destroy(d);
    preader_destroy(pr);
    specs_destroy(s);
    free(pin);

    return 0;
}