我正在尝试使用开始时的加速和结束时的减速(缓出/缓和)来编写一个从0到x(一维中物体的位置)的插值方法,其中只有总时间的限制提供了加速和减速的持续时间.运动应该复制惯性效应,我正在考虑非线性部分的Hermite曲线.
double Interpolate(
double timeToAccel, double timeCruising, double timeToDecel,
double finalPosition,
double currentTime)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
有人能指出我做的那部分代码吗?我不知道如何整合Hermite曲线,因此不知道我将在加速部分或减速部分移动多少,反过来我无法弄清楚线性速度是多少一部分.
谢谢.
一些参考来说明我的问题.
编辑:
编辑:Roman和Bob10提供了完整的工作解决方案.我实现了罗马的代码.谢谢你们两个,伙计们!我感谢您的完美支持和详细的解决方案,为您节省了长时间的搜索和试用.
我编写了以下代码来执行样条插值:
import numpy as np
import scipy as sp
x1 = [1., 0.88, 0.67, 0.50, 0.35, 0.27, 0.18, 0.11, 0.08, 0.04, 0.04, 0.02]
y1 = [0., 13.99, 27.99, 41.98, 55.98, 69.97, 83.97, 97.97, 111.96, 125.96, 139.95, 153.95]
x = np.array(x1)
y = np.array(y1)
new_length = 25
new_x = np.linspace(x.min(), x.max(), new_length)
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)
Run Code Online (Sandbox Code Playgroud)
但我得到了:
ValueError: A value in x_new is below the interpolation range.
Run Code Online (Sandbox Code Playgroud)
在 interpolate.py
任何帮助,将不胜感激.
假设我想使用贝塞尔路径近似SVG中的半余弦曲线.半余弦应该如下所示:
从[x0,y0](左手控制点)到[x1,y1](右手控制点)运行.
如何找到一组可接受的系数,以便对该函数进行良好的近似?
奖金问题:如何推广例如四分之一余弦的公式?
请注意,我不希望用近似一系列相互连接段的余弦,我想计算使用贝塞尔曲线的良好近似.
我在评论中尝试了解决方案,但是,使用这些系数,曲线似乎在第二点之后结束.
我试图找到一个python软件包,该软件包将提供一个选项,以使自然平滑样条线与用户可选的平滑因子相匹配。有没有实现的方法?如果没有,您将如何使用可用的工具自己实施?
所谓自然样条曲线,是指应该满足以下条件:拟合函数在端点处的二阶导数为零(线性)。
通过平滑样条曲线,我的意思是样条曲线不应被“插值”(通过所有数据点)。我想自己决定正确的平滑系数lambda(请参见Wikipedia页面以平滑样条线)。
我在X,Y +旋转中有2个点,我需要计算一个贝塞尔样条(一组二次贝塞尔曲线),它们可以平滑地连接这两个点.(见图)该点代表游戏中只能缓慢旋转的单位.所以要从A点到B点,它必须走很长的路.附图显示了相当夸张的弯曲路径,但你明白了.
替代文字http://i49.tinypic.com/sor6tk.png
我可以使用哪些公式来计算这样的贝塞尔样条?
假设我有一个双打数组,使用Akima插值对这个系列进行采样的好算法是什么?将这些数学描述翻译成代码我太愚蠢了.
// values is an array of doubles
// idx is the index of the left-hand value for the current interpolation
// t is the normalized parameter between values[idx] and values[idx+1]
// Don't worry about array bounds, I'll handle that separately.
public double InterpolateAkima(double[] values, int idx, double t)
{
...?
}
Run Code Online (Sandbox Code Playgroud) 我希望确定一个点(鼠标位置)何时在一个B样条控制点定义的曲线上或附近.
我将为B-Spline提供的信息是n个控制点的列表(在x,y坐标中).控制点列表可以是任意长度(> = 4)并定义由(n-1)/ 3立方贝塞尔曲线组成的B样条.贝塞尔曲线都是立方的.我希望设置一个参数k,(以像素为单位)定义为"接近"曲线的距离.如果鼠标位置在曲线的k个像素内,那么我需要返回true,否则返回false.
有没有一个算法可以提供这些信息.任何解决方案都不需要精确 - 我正在努力达到1像素(或坐标)的容差.
我发现以下问题似乎提供了一些帮助,但不回答我的确切问题.特别是第一个参考似乎仅是4个控制点的解决方案,并没有考虑我希望定义的接近因素.
编辑:示例曲线:
e, 63.068, 127.26
29.124, 284.61
25.066, 258.56
20.926, 212.47
34, 176
38.706, 162.87
46.556, 149.82
54.393, 138.78
Run Code Online (Sandbox Code Playgroud)
格式的描述是:"为每个边缘分配一个pos属性,该属性由3n + 1个位置组成.这些是B样条控制点:点p0,p1,p2,p3是第一个Bezier样条,p3 ,p4,p5,p6是第二个等.点由逗号分隔的两个整数表示,表示以点(1/72英寸)指定的位置的X和Y坐标.在pos属性中,控制点列表可以在起始点ps和/或终点pe之前.它们分别具有通常的位置表示,带有"s"或"e"前缀."
EDIT2:对"e"点的进一步说明(如果存在,则为s).
在pos属性中,控制点列表可以在起点ps和/或终点pe之前.它们具有通常的位置表示,分别带有"s"或"e"前缀.如果在p0处有箭头,则存在起点.在这种情况下,箭头从p0到ps,其中ps实际上在节点的边界上.箭头的长度和方向由矢量(ps -p0)给出.如果没有箭头,则p0位于节点的边界上.类似地,点pe在边缘的另一端指定箭头,连接到最后一个样条点.
在交叉处验证我问一个问题,有关日期分析数据,但不希望由每月分档数据产生虚假尖峰和低谷.例如,如果一个人在每个月的最后一天支付账单,但有一次支付了几天的延迟,那么一个月将反映零费用,而下一个月将反映通常费用的两倍.所有虚假的垃圾.
我的问题的答案之一解释了使用线性样条平滑对累积和进行插值的概念,以克服分档中的打嗝.我对它感兴趣,并希望在R中实现它,但无法在线找到任何示例.我不只是想打印情节.我希望在每个时间点(可能每天)获得瞬时斜率,但该斜率应该来自样条,该样条曲线从几天(或者几周或几个月)之前输入几天到几天之间在时间点之后.换句话说,在一天结束时,我想得到一些数据框,其中一列是每天的钱,或者是每周的病人,但这不会发生变幻莫测,例如我是否支付了几天的费用或是否本月恰好有5个工作日(而不是通常的4天).
这是一些简化的模拟和绘图,以显示我的反对意见.
library(lubridate)
library(ggplot2)
library(reshape2)
dates <- seq(as.Date("2010-02-01"), length=24, by="1 month") - 1
dates[5] <- dates[5]+3 #we are making one payment date that is 3 days late
dates#look how the payment date is the last day of every month except for
#2010-05 where it takes place on 2010-06-03 - naughty boy!
amounts <- rep(50,each=24)# pay $50 every month
register <- data.frame(dates,amounts)#this is the starting register or ledger
ggplot(data=register,aes(dates,amounts))+geom_point()#look carefully and you will see …
Run Code Online (Sandbox Code Playgroud) 我有一系列由(x,y)对组成的轨迹.我想使用样条插入这个轨迹上的点.
我该怎么做呢?使用scipy.interpolate.UnivariateSpline
不起作用,因为x和y都不是单调的.我可以引入参数化(例如沿着轨迹的长度d),但是我有两个因变量x(d)和y(d).
例:
import numpy as np
import matplotlib.pyplot as plt
import math
error = 0.1
x0 = 1
y0 = 1
r0 = 0.5
alpha = np.linspace(0, 2*math.pi, 40, endpoint=False)
r = r0 + error * np.random.random(len(alpha))
x = x0 + r * np.cos(alpha)
y = x0 + r * np.sin(alpha)
plt.scatter(x, y, color='blue', label='given')
# For this special case, the following code produces the …
Run Code Online (Sandbox Code Playgroud)