标签: interpolation

如何在C++中实现Bézier曲线?

我想实现Bézier曲线.我以前在C#中做过这个,但我对C++库完全不熟悉.我该如何创建二次曲线?

void printQuadCurve(float delta, Vector2f p0, Vector2f p1, Vector2f p2);
Run Code Online (Sandbox Code Playgroud)

显然我们需要使用线性插值,但这是否存在于标准数学库中?如果没有,我在哪里可以找到它?

更新1:

对不起,我忘了提到我正在使用Linux.

c++ math interpolation spline

16
推荐指数
4
解决办法
6万
查看次数

你如何对重新采样的音频数据进行双三次(或其他非线性)插值?

我正在编写一些以不同速度播放WAV文件的代码,因此波浪要么慢,要么低音,要么更快,音高更高.我目前正在使用简单的线性插值,如下所示:

            int newlength = (int)Math.Round(rawdata.Length * lengthMultiplier);
            float[] output = new float[newlength];

            for (int i = 0; i < newlength; i++)
            {
                float realPos = i / lengthMultiplier;
                int iLow = (int)realPos;
                int iHigh = iLow + 1;
                float remainder = realPos - (float)iLow;

                float lowval = 0;
                float highval = 0;
                if ((iLow >= 0) && (iLow < rawdata.Length))
                {
                    lowval = rawdata[iLow];
                }
                if ((iHigh >= 0) && (iHigh < rawdata.Length))
                {
                    highval = rawdata[iHigh];
                }

                output[i] = …
Run Code Online (Sandbox Code Playgroud)

audio interpolation signal-processing resampling bicubic

16
推荐指数
2
解决办法
1万
查看次数

R中的线性插值

我有一个真实数据的数据集,例如看起来像这样:

# Dataset 1 with known data
known <- data.frame(
    x = c(0:6),
    y = c(0, 10, 20, 23, 41, 39, 61)
)

plot (known$x, known$y, type="o")
Run Code Online (Sandbox Code Playgroud)

现在我想问一个问题是"如果原始数据集的所有中间数据点都在周围测量值之间的直线上,那么0.3的Y值是多少?"

 # X values of points to interpolate from known data
 aim <- c(0.3, 0.7, 2.3, 3.3, 4.3, 5.6, 5.9)
Run Code Online (Sandbox Code Playgroud)

如果你看图:我想得到Y​​值,其中ablines与已知数据的线性插值相交

abline(v = aim, col = "#ff0000")
Run Code Online (Sandbox Code Playgroud)

因此,在理想情况下,我将使用我已知的数据创建"linearInterpolationModel",例如

model <- linearInterpol(known)
Run Code Online (Sandbox Code Playgroud)

...然后,我可以询问Y值,例如

model$getEstimation(0.3)
Run Code Online (Sandbox Code Playgroud)

(在这种情况下应该给出"3")

abline(h = 3, col = "#00ff00")
Run Code Online (Sandbox Code Playgroud)

我怎么能意识到这一点?手动我会为每个值做这样的事情:

  1. 什么是最接近的X值较小Xsmall且最接近的X值大于Xlarge当前X值X.
  2. 计算较小X值的相对位置 relPos = (X - …

statistics interpolation r

16
推荐指数
2
解决办法
3万
查看次数

矩形网格上的Python 4D线性插值

我需要在4个维度(纬度,经度,高度和时间)中线性插值温度数据.
点数相当高(360x720x50x8),我需要一种快速的方法来计算数据范围内空间和时间任意点的温度.

我尝试过使用scipy.interpolate.LinearNDInterpolator但是使用Qhull进行三角测量在矩形网格上效率低下并且需要数小时才能完成.

通过阅读此SciPy票证,解决方案似乎是使用标准实现新的nd插值器interp1d来计算更多数据点,然后使用"最近邻居"方法和新数据集.

然而,这需要很长时间(分钟).

有没有一种快速的方法可以在4维的矩形网格上插入数据而无需花费几分钟才能完成?

我想过使用interp1d4次而不计算更高密度的点,但留给用户用坐标调用,但我无法理解如何做到这一点.

否则我会根据自己的需要编写自己的4D内插器吗?

这是我用来测试这个的代码:

使用scipy.interpolate.LinearNDInterpolator:

import numpy as np
from scipy.interpolate import LinearNDInterpolator

lats = np.arange(-90,90.5,0.5)
lons = np.arange(-180,180,0.5)
alts = np.arange(1,1000,21.717)
time = np.arange(8)
data = np.random.rand(len(lats)*len(lons)*len(alts)*len(time)).reshape((len(lats),len(lons),len(alts),len(time)))

coords = np.zeros((len(lats),len(lons),len(alts),len(time),4))
coords[...,0] = lats.reshape((len(lats),1,1,1))
coords[...,1] = lons.reshape((1,len(lons),1,1))
coords[...,2] = alts.reshape((1,1,len(alts),1))
coords[...,3] = time.reshape((1,1,1,len(time)))
coords = coords.reshape((data.size,4))

interpolatedData = LinearNDInterpolator(coords,data)
Run Code Online (Sandbox Code Playgroud)

使用scipy.interpolate.interp1d:

import numpy as np
from scipy.interpolate import LinearNDInterpolator

lats = np.arange(-90,90.5,0.5) …
Run Code Online (Sandbox Code Playgroud)

python interpolation numpy scipy

16
推荐指数
2
解决办法
1万
查看次数

如何在HSV颜色空间中插入色调值?

我正在尝试在HSV颜色空间中插入两种颜色之间以产生平滑的颜色渐变.

我正在使用线性插值,例如:

h = (1 - p) * h1 + p * h2
s = (1 - p) * s1 + p * s2
v = (1 - p) * v1 + p * v2
Run Code Online (Sandbox Code Playgroud)

(其中p是百分比,h1,h2,s1,s2,v1,v2是两种颜色的色调,饱和度和值分量)

这对s和v产生了良好的结果,但对于h则没有.由于色调分量是一个角度,计算需要计算出h1和h2之间的最短距离,然后沿正确的方向(顺时针或逆时针)进行插值.

我应该使用什么公式或算法?


编辑:通过遵循杰克的建议我修改了我的JavaScript渐变功能,它运作良好.对于任何有兴趣的人,这是我最终得到的:

// create gradient from yellow to red to black with 100 steps
var gradient = hsbGradient(100, [{h:0.14, s:0.5, b:1}, {h:0, s:1, b:1}, {h:0, s:1, b:0}]); 

function hsbGradient(steps, colours) {
  var parts = colours.length - 1;
  var gradient = new Array(steps);
  var …
Run Code Online (Sandbox Code Playgroud)

javascript interpolation gradient colors hsv

15
推荐指数
2
解决办法
8011
查看次数

将四边形图像提取为矩形

A photo

BOUNTY UPDATE

Denis的链接之后,这是如何使用threeblindmiceandamonkey代码:

// the destination rect is our 'in' quad
int dw = 300, dh = 250;
double in[4][4] = {{0,0},{dw,0},{dw,dh},{0,dh}};
    // the quad in the source image is our 'out'
double out[4][5] = {{171,72},{331,93},{333,188},{177,210}};
double homo[3][6];
const int ret = mapQuadToQuad(in,out,homo);
    // homo can be used for calculating the x,y of any destination point
// in the source, e.g.
for(int i=0; i<4; i++) {
    double p1[3] = {out[i][0],out[i][7],1};
    double p2[3];
    transformMatrix(p1,p2,homo);
    p2[0] /= p2[2]; …
Run Code Online (Sandbox Code Playgroud)

graphics interpolation pixel

15
推荐指数
2
解决办法
8747
查看次数

插值NA值

我有两组与时间无关的样本.我想合并它们并计算我没有两者值的时间的缺失值.简化示例:

A <- cbind(time=c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100),
           Avalue=c(1, 2, 3, 2, 1, 2, 3, 2, 1, 2))
B <- cbind(time=c(15, 30, 45, 60), Bvalue=c(100, 200, 300, 400))
C <- merge(A,B, all=TRUE)

   time Avalue Bvalue
1    10      1     NA
2    15     NA    100
3    20      2     NA
4    30      3    200
5    40      2     NA
6    45     NA    300
7    50      1     NA
8    60      2    400
9    70      3     NA
10   80      2     NA …
Run Code Online (Sandbox Code Playgroud)

interpolation r

15
推荐指数
1
解决办法
2万
查看次数

使用季节性循环插入时间序列中的缺失值

我有一个时间序列,我想智能地插入缺失值.特定时间的价值受多日趋势以及其在日常周期中的位置的影响.

这是一个缺少第十个观察的例子 myzoo

start <- as.POSIXct("2010-01-01") 
freq <- as.difftime(6, units = "hours") 
dayvals <- (1:4)*10 
timevals <- c(3, 1, 2, 4) 
index <- seq(from = start, by = freq, length.out = 16)
obs <- (rep(dayvals, each = 4) + rep(timevals, times = 4))
myzoo <- zoo(obs, index)
myzoo[10] <- NA
Run Code Online (Sandbox Code Playgroud)

如果我必须实现这个,我会在附近的日子里使用某种近似加权平均值,或者将当天的值添加到适合更大趋势的函数行,但我希望已经存在一些包或函数适用于这种情况?

编辑:稍微修改代码以澄清我的问题.有一些na.*方法可以从最近的邻居进行插值,但在这种情况下,他们无法识别缺失值是当天的最低值.也许解决方案是将数据重新整形为宽格式然后进行插值,但我不想完全忽略同一天的连续值.值得注意的是,diff(myzoo, lag = 4)返回10的向量.该解决方案可能在于一些组合reshape,na.spline以及diff.inv,但我就是想不通.

以下三种方法不起作用: 在此输入图像描述

EDIT2.使用以下代码生成的图像.

myzoo <- zoo(obs, index)
myzoo[10] <- NA # knock out the missing point …
Run Code Online (Sandbox Code Playgroud)

interpolation r time-series

14
推荐指数
1
解决办法
1万
查看次数

如果我想要随机非结构化数据的3D样条/平滑插值怎么办?

我由此受到启发答案通过@詹姆斯,看看如何griddatamap_coordinates可能被使用.在下面的例子中,我正在显示2D数据,但我的兴趣在于3D.我注意到griddata只提供1D和2D的样条曲线,并且仅限于3D和更高的线性插值(可能有很好的理由).然而,map_coordinates似乎很好用3D使用更高阶(比分段线性更平滑)插值.

我的主要问题是: 如果我在3D中有随机的非结构化数据(我不能使用map_coordinates),那么在NumPy SciPy宇宙中,或者至少在附近,是否有某种方法可以比分段线性插值更平滑?

我的第二个问题是:3D的样条是不可用的,griddata因为实现起来很困难或乏味,或者是否存在根本性的困难?

下面的图片和可怕的蟒蛇显示了我目前对griddata和map_coordinates如何使用或不能使用的理解.沿着粗黑线进行插值.

结构化数据:

结构化数据的插值

联合国结构化数据:

非结构化数据的插值

可怕的蟒蛇:

import numpy as np
import matplotlib.pyplot as plt

def g(x, y):
    return np.exp(-((x-1.0)**2 + (y-1.0)**2))

def findit(x, X):  # or could use some 1D interpolation
    fraction = (x - X[0]) / (X[-1]-X[0])
    return fraction * float(X.shape[0]-1)

nth, nr = 12, 11
theta_min, theta_max = 0.2, 1.3
r_min,     r_max     = 0.7, 2.0

theta = np.linspace(theta_min, theta_max, nth)
r     = np.linspace(r_min,     r_max, …
Run Code Online (Sandbox Code Playgroud)

python interpolation scipy

14
推荐指数
1
解决办法
8519
查看次数

使用pcolormesh时如何通过插值平滑?

我有一个世界的底图,它使用pcolormesh填充数据(lintrends_mean).因为数据有相对较大的网格框,我想平滑情节.但是,我无法弄清楚如何做到这一点.在绘图功能中设置着色='gouraud'会模糊网格框的边缘,但我想要一些比这更好看的东西,因为数据仍然显得斑点.

这里有一个类似的问题给出了答案,但我不明白答案,特别是"newdepth"的来源.由于我的声誉不足,我无法对其进行澄清澄清. 使用matplotlib pcolor进行插值

#Set cmap properties
bounds = np.array([0.1,0.2,0.5,1,2,3,4,6,9,13,20,35,50])
norm = colors.LogNorm(vmin=0.01,vmax=55) #creates logarithmic scale
#cmap.set_under('#000099') # I want to use this- edit in Paint
cmap.set_over('#660000')  # everything above range of colormap

fig = plt.figure(figsize=(15.,10.))                     #create figure & size
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c') #create basemap & specify data area & res
m.drawcoastlines(linewidth=1)
m.drawcountries(linewidth=1)
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3)
m.drawmeridians(np.arange(-180.,180.,90.),linewidth=0.3)            
meshlon,meshlat = np.meshgrid(lon,lat)                           #meshgrid turns lats & lons into 2D arrays
x,y = m(meshlon,meshlat)                                         #assign 2D arrays to new variables
trend = m.pcolormesh(x,y,lintrends_mean,cmap=plt.get_cmap('jet'),norm=norm) #plot the …
Run Code Online (Sandbox Code Playgroud)

python interpolation matplotlib matplotlib-basemap

14
推荐指数
1
解决办法
1万
查看次数