我想实现Bézier曲线.我以前在C#中做过这个,但我对C++库完全不熟悉.我该如何创建二次曲线?
void printQuadCurve(float delta, Vector2f p0, Vector2f p1, Vector2f p2);
Run Code Online (Sandbox Code Playgroud)
显然我们需要使用线性插值,但这是否存在于标准数学库中?如果没有,我在哪里可以找到它?
对不起,我忘了提到我正在使用Linux.
我正在编写一些以不同速度播放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) 我有一个真实数据的数据集,例如看起来像这样:
# 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)
我怎么能意识到这一点?手动我会为每个值做这样的事情:
Xsmall且最接近的X值大于Xlarge当前X值X.relPos = (X - …我需要在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) 我正在尝试在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) 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) 我有两组与时间无关的样本.我想合并它们并计算我没有两者值的时间的缺失值.简化示例:
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) 我有一个时间序列,我想智能地插入缺失值.特定时间的价值受多日趋势以及其在日常周期中的位置的影响.
这是一个缺少第十个观察的例子 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) 我由此受到启发答案通过@詹姆斯,看看如何griddata和map_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) 我有一个世界的底图,它使用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) interpolation ×10
python ×3
r ×3
scipy ×2
audio ×1
bicubic ×1
c++ ×1
colors ×1
gradient ×1
graphics ×1
hsv ×1
javascript ×1
math ×1
matplotlib ×1
numpy ×1
pixel ×1
resampling ×1
spline ×1
statistics ×1
time-series ×1