Sử dụng chức năng smooth.spline (Fit một Smoothing Spline)
mx=path.w.missing$x
my=path.w.missing$y
s<-smooth.spline(mx,my)
plot(mx,my)
lines(s) #draw the estimated path
predict(s,1:10) #And now you can generate all the points on the estimated path
> predict(s,1:10)
$x
[1] 1 2 3 4 5 6 7 8 9 10
$y
[1] 2.418294 2.904019 3.389744 3.875469 4.361195 4.846920 5.332645 5.818370 6.304095 6.789820
Và bạn có thể sử dụng mô hình tuyến tính để phù hợp với nó.
> summary(lm(my~mx))
Call:
lm(formula = my ~ mx)
Residuals:
Min 1Q Median 3Q Max
-12.772 -8.642 3.112 5.831 17.237
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -12.60098 3.46583 -3.636 0.000444 ***
mx 0.56579 0.02138 26.469 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.896 on 98 degrees of freedom
Multiple R-squared: 0.8773, Adjusted R-squared: 0.876
F-statistic: 700.6 on 1 and 98 DF, p-value: < 2.2e-16
như bạn có thể thấy, p < 0.05, vì vậy mx của tôi và có thể phù hợp như một dòng:
my=-12.60098+0.56579*mx
ggplot2 có thể vẽ đường này một cách dễ dàng:
d=data.frame(mx,my)
library(ggplot2)
ggplot(d,aes(mx,my))+geom_point()+geom_smooth(method="lm")
giả sử rằng một dòng là Ax+By+C=0
và điểm là (X0,Y0)
, Trỏ chuột tới dòng khoảng cách:
|AX0+BY0+C|/√(A²+B²)
như vậy trong trường hợp này, 0,56579 * mx-my-12,60098 = 0, A = 0,56579, B = -1, C = -12,60098, thật dễ dàng để tính toán khoảng cách từ chỉ vào dòng và tìm điểm gần nhất với đường thẳng.
Hơn nữa, nếu bạn muốn tìm điểm gần nhất, loại bỏ các √ mẫu (A² + B²) sẽ không ảnh hưởng đến các loại, vì vậy, việc tối ưu hóa công thức:
|AX0+BY0+C|
quả
> for(i in 1:2503501){
+ temp=abs(centers[[1]][i]*0.56579-centers[[2]][i]-12.60098)
+ if(m>temp){
+ m=temp
+ pos=i
+ }
+ }
> m
[1] 2.523392e-05
> pos
[1] 638133
Sử dụng Rcpp để tăng tốc chương trình "kiểm tra.cpp"
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int closest(NumericVector a, NumericVector b) {
int length = a.size();
double temp,m=10000;
int pos=0;
for(int i=0;i<length;i++){
temp=a[i]*0.56579-b[i]-12.60098;
if(temp>=0){
if(m>temp){m=temp;pos=i;}
}else{
if(m>-temp){m=-temp;pos=i;}
}
}
return pos+1;
}
quả (các Rcpp chi phí khoảng 2 giây):
> sourceCpp("test.cpp")
> closest(centers[[1]],centers[[2]])
[1] 974698
> abs(centers[[1]][974698]*0.56579-centers[[2]][974698]-12.60098)
[1] 0.0002597022
Bạn có nghĩa là để tìm tất cả các điểm nằm trên con đường trong một ngưỡng nhất định? –
Chia đường dẫn thành các đoạn đường. Đối với mỗi phân khúc, hãy xác định điểm gần nhất. Lặp lại các phân đoạn bằng cách sử dụng một số phiên bản áp dụng. Có thể dễ hiểu nhất nếu bạn xoay phân đoạn thành ngang hoặc dọc sao cho khoảng cách tới các điểm chỉ là tọa độ y (hoặc x). –
Nếu đưa ra một ngưỡng là cách duy nhất có thể thì vui lòng giới thiệu một giá trị ngưỡng cho vấn đề ... nhưng lý tưởng là không ... –