-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcloud2grid.cpp
86 lines (75 loc) · 2.44 KB
/
cloud2grid.cpp
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
#include <Rcpp.h>
#include <math.h>
#include <omp.h>
#include <iostream>
// [[Rcpp::plugins(openmp)]]
using namespace Rcpp;
using namespace std;
// [[Rcpp::export]]
void cloud2grid_(DataFrame df,
NumericMatrix vars,
NumericMatrix vec,
double min_x,
double min_y,
double min_z,
double res_x,
double res_y,
double res_z,
std::vector<double> grid_x,
std::vector<double> grid_y,
std::vector<double> grid_z,
int rx,
int ry,
int rz
){
std::vector<double> x = df[0];
std::vector<double> y = df[1];
std::vector<double> z = df[2];
int n = x.size();
for(int i = 0; i<n;i++){
std::vector<double> p{x[i],y[i],z[i]};
int cx=(int)((p[0]-min_x)/res_x);
int cy=(int)((p[1]-min_y)/res_y);
int cz=(int)((p[2]-min_z)/res_z);
double c1=grid_x[cx];
double c2=grid_y[cy];
double c3=grid_z[cz];
double c11=grid_x[cx+1];
double c22=grid_y[cy+1];
double c33=grid_z[cz+1];
double d[8];
d[0]=sqrt(pow((p[0]-c1),2)+pow((p[1]-c2),2)+pow((p[2]-c3),2));
d[1]=sqrt(pow((p[0]-c1),2)+pow((p[1]-c22),2)+pow((p[2]-c3),2));
d[2]=sqrt(pow((p[0]-c1),2)+pow((p[1]-c22),2)+pow((p[2]-c33),2));
d[3]=sqrt(pow((p[0]-c1),2)+pow((p[1]-c2),2)+pow((p[2]-c33),2));
d[4]=sqrt(pow((p[0]-c11),2)+pow((p[1]-c2),2)+pow((p[2]-c3),2));
d[5]=sqrt(pow((p[0]-c11),2)+pow((p[1]-c22),2)+pow((p[2]-c3),2));
d[6]=sqrt(pow((p[0]-c11),2)+pow((p[1]-c22),2)+pow((p[2]-c33),2));
d[7]=sqrt(pow((p[0]-c11),2)+pow((p[1]-c2),2)+pow((p[2]-c33),2));
double t=1/d[0]+1/d[1]+1/d[2]+1/d[3]+1/d[4]+1/d[5]+1/d[6]+1/d[7];
double w[8];
#pragma omp simd
for(int j=0;j<8;j++){
w[j]=(1/d[j])/t;
}
int index[8];
index[0] = cz*(rx)*(ry)+cx*(ry)+cy;
index[1] = cz*(rx)*(ry)+cx*(ry)+cy+1;
index[2] = (cz+1)*(rx)*(ry)+cx*(ry)+cy+1;
index[3] = (cz+1)*(rx)*(ry)+cx*(ry)+cy;
index[4] = cz*(rx)*(ry)+(cx+1)*(ry)+cy;
index[5] = cz*(rx)*(ry)+(cx+1)*(ry)+cy+1;
index[6] = (cz+1)*(rx)*(ry)+(cx+1)*(ry)+cy+1;
index[7] = (cz+1)*(rx)*(ry)+(cx+1)*(ry)+cy;
#pragma omp simd
for(int j=0;j<8;j++){
vec(index[j],0)+=w[j];
}
#pragma omp simd
for(int c = 1;c<vec.cols();c++){
for(int j=0;j<8;j++){
vec(index[j],c)+=w[j]*vars(i,c-1);
}
}
}
}