File: pip2.c

package info (click to toggle)
r-cran-sp 1%3A0.9-66-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 1,696 kB
  • ctags: 123
  • sloc: ansic: 1,475; sh: 6; makefile: 5
file content (89 lines) | stat: -rw-r--r-- 2,439 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# include "sp.h"
# include <Rdefines.h>

#define ROFFSET 1


int pipbb(double pt1, double pt2, double *bbs);

int between(double x, double low, double up); 

SEXP pointsInBox(SEXP lb, SEXP px, SEXP py);

SEXP tList(SEXP nl, SEXP m);


SEXP tList(SEXP nl, SEXP m0) {
    int n=length(nl), m=INTEGER_POINTER(m0)[0], i, ii, j, jj, *k, pc=0;
    SEXP res;
    PROTECT(res = NEW_LIST(m)); pc++;
    k = (int *) R_alloc(m, sizeof(int));
    for (j=0; j<m; j++) k[j] = 0;
    for (i=0; i<n; i++) {
        ii = length(VECTOR_ELT(nl, i));
        if (ii > 0) {
            for (j=0; j<ii; j++) {
                jj = INTEGER_POINTER(VECTOR_ELT(nl, i))[j] - ROFFSET;
                if (jj < 0 || jj >= m) error("invalid indices");
                k[jj]++;
            }
        }
    }
    for (j=0; j<m; j++) SET_VECTOR_ELT(res, j, NEW_INTEGER(k[j]));
    for (j=0; j<m; j++) k[j] = 0;
    for (i=0; i<n; i++) {
        ii = length(VECTOR_ELT(nl, i));
        if (ii > 0) {
            for (j=0; j<ii; j++) {
                jj = INTEGER_POINTER(VECTOR_ELT(nl, i))[j] - ROFFSET;
                INTEGER_POINTER(VECTOR_ELT(res, jj))[k[jj]] = i + ROFFSET;
                k[jj]++;
            }
        }
    }
    UNPROTECT(pc); 
    return(res);
}

SEXP pointsInBox(SEXP lb, SEXP px, SEXP py) {
    int n=length(px), m=length(lb), i, j, jj, *k, sk, pc=0;
    double *x, ppx, ppy;
    SEXP res;
    PROTECT(res = NEW_LIST(n)); pc++;
    x = (double *) R_alloc(m*4, sizeof(double));
    k = (int *) R_alloc(m, sizeof(int));
    for (i=0; i<m; i++) {
        for (j=0; j<4; j++) x[(i*4)+j] = NUMERIC_POINTER(VECTOR_ELT(lb, i))[j];
    }
    for (i=0; i<n; i++) {
        ppx = NUMERIC_POINTER(px)[i];
        ppy = NUMERIC_POINTER(py)[i];
        for (j=0; j<m; j++) k[j] = 0;
        for (j=0; j<m; j++) k[j] = pipbb(ppx, ppy, &x[j*4]);
        sk=0;
        for(j=0; j<m; j++) sk += k[j];
        SET_VECTOR_ELT(res, i, NEW_INTEGER(sk));
        jj=0;
        for(j=0; j<m; j++) {
            if (k[j] == 1) {
                INTEGER_POINTER(VECTOR_ELT(res, i))[jj] = j + ROFFSET;
                jj++;
            }
        }
    }    
    UNPROTECT(pc); 
    return(res);
}

int between(double x, double low, double up) {
	if (x >= low && x <= up) return(1);
	else return(0);
}

int pipbb(double pt1, double pt2, double *bbs) {
	if ((between(pt1, bbs[0], bbs[2]) == 1) && 
		(between(pt2, bbs[1], bbs[3]) == 1)) return(1);
	else return(0);
}