Algorithm 如何等距重采样直线(或曲线)?

Algorithm 如何等距重采样直线(或曲线)?,algorithm,geometry,line,sampling,Algorithm,Geometry,Line,Sampling,我有一行l_1和一个点序列p_1,…,p_n。我现在想要一个新行l_2具有k点:q_1,…,q_k.但是对于所有I\in{1,…,k-1}:abs(q_I-q_I+1)=const,这意味着l_2的段是等距的或均匀的 k>=2 和p_1和p_n应该在l_2中 abs(pui-pui+1)notconst 一种解决方案是用样条曲线逼近一条直线,然后再次对其进行子采样,以获得统一长度的线段。我能做得更好吗?有没有C++代码?< /P> 啊,我遗漏了一个具体的细节:那些q_I应该在l_1中,这意味

我有一行
l_1
和一个点序列
p_1,…,p_n
。我现在想要一个新行
l_2
具有
k
点:
q_1,…,q_k.
但是对于所有
I\in{1,…,k-1}:abs(q_I-q_I+1)=const
,这意味着
l_2
的段是等距的或均匀的

  • k>=2
  • p_1
    和p_n应该在
    l_2
  • abs(pui-pui+1)
    notconst
一种解决方案是用样条曲线逼近一条直线,然后再次对其进行子采样,以获得统一长度的线段。我能做得更好吗?有没有C++代码?< /P> 啊,我遗漏了一个具体的细节:那些
q_I
应该在
l_1
中,这意味着它们要么在
l_1
的线段上,要么是使用参数函数的
l_1

的采样点 您可以定义分段参数化函数:

 f[t_] := Piecewise[
      When x[i] <= t <= x[i + 1]

         f[t]= (y[i+1]-y[i]) (t - x[i]) / (x[i+1]-x[i]) + y[i], 

      For {i, 1 ... N};
f[t_]:=分段[

当x[i]这取决于你的线点-它们是什么?如果它们定义了一条平滑的线,那么对三次样条曲线进行重采样是一个很好的选择

基本上,如果要使点等距,则需要定义点之间要看到的内容-平滑度是否比保持原始直线的真实性更重要?是否存在速度约束

就我所见,你可能会在这里以一个迭代过程结束,因为如果你的原始点定义了一条平滑的线,那么计算这条线的长度就不容易了,更不用说把它分成相等的部分并确定这些点的坐标了

如果使用三次样条曲线,对于每条样条曲线,您应该能够通过上的公式计算其长度。但是,它要求您进行积分-当您进行数值积分时,它被称为“”。对于三次样条曲线(用于计算两个原始点之间的线段长度),这应该作为三次样条曲线系数的加权和结束-特别是如果使用高斯求积


但是,您可能可以使用分段三次多项式得到合理的答案(从2个点及其两侧的2个点生成一个三次多项式)一种迭代算法,它改进了席的猜测值,给出了等距点。但是假设你想要速度而不是精度。

在问题设置中有一个混乱。目前看来,原来的点系列<代码> pY1,…,pnn不参与构造<代码> LY2<代码>,只是为了检查I unun。derstand,您有一条从p1到pn的线段;您希望将该线段表示为k个新点q1到qk,其中q1=p1和qk=pn,以及| qi-q(i+1)|对所有我来说都是相等的?你能自由选择k吗?@chris:是的,我的意思是p_1,…,p_n一个统一的样本?有一些定义有点不清楚,
h
是如何定义的?2D平面上那些随机点的示例图片也很好,因为在我的例子中,这就是确切的应用。非常感谢你的帮助您的解决方案!!!@brubelsabs请参见编辑。请询问是否还有剩余内容unclear@brubelsabs我删除了2D图,因为使用更多的卷积代码,问题会更难一些,我认为你的问题更接近这个问题。如果你认为这是值得的,请发布另一个2D问题的问题,并附上一张图片,我相信我们我会帮助你的。
a = 0;
p = Table[{   a = a + RandomReal[], RandomReal[]}, {10}];
f[t_, h_] := Piecewise[Table[{(h[[i + 1, 2]] - h[[i, 2]]) (t - h[[i, 1]]) /
                              (h[[i + 1, 1]] - h[[i, 1]]) + h[[i, 2]],
                       h[[i, 1]] <= t <= h[[i + 1, 1]]}, 
                       {i, 1, Length[h] - 1}]];

minSeg[h_] := Min[Table[Norm[h[[i, 1]] - h[[i + 1, 1]]], {i, Length[h] - 1}]];

newSegSize[h_] := (h[[Length@h, 1]] - h[[1, 1]])/
                  Ceiling[(h[[Length@h, 1]] - h[[1, 1]])/minSeg[h]]

qTable = Table[{t, f[t, p]}, {t, p[[1, 1]], p[[Length@p, 1]], newSegSize[p]}];
a = 0; (* Accumulator to ensure an increasing X Value*)

p = Table[{a = a + RandomReal[], 
    RandomReal[]}, {10}]; (*Generates 10 {x,y} Rnd points with \
                            increasing x Value*)

f[t_, h_] :=  (* Def. a PWise funct:
                Example of resulting function:
                     f[t,{{1,2},{2,2},{3,4}}]
                Returns teh following function definition:

                    Value          for Range
                     2             1<=t<=2
                 2+2*(-2+t)        2<=t<=3
                     0             True
              *)
  Piecewise[
   Table[{(h[[i + 1, 2]] - 
           h[[i, 2]]) (t - h[[i, 1]])/(h[[i + 1, 1]] - h[[i, 1]]) + h[[i, 2]],
           h[[i, 1]] <= t <= h[[i + 1, 1]]},
           {i, 1, Length[h] - 1}]];

  minSeg[h_] := (* Just lookup the min input point separation*)
               Min[Table[Norm[h[[i, 1]] - h[[i + 1, 1]]], {i, Length[h] - 1}]];

  newSegSize[h_] := (* Determine the new segment size for having
                       the full interval length as a multiple of the
                       segment size *)
                   (h[[Length@h, 1]] - h[[1, 1]])/
                    Ceiling[(h[[Length@h, 1]] - h[[1, 1]])/minSeg[h]]

   qTable =     (*Generates a table of points using the PW function *)
         Table[
               {t, f[t, p]},
               {t, p[[1, 1]], p[[Length@p, 1]],newSegSize[p]}];

   ListLinePlot[{qTable, p}, PlotStyle -> {Red, Blue}] (*Plot*)