9

l_1ポイントシリーズで与えられた線がありp_1,...,p_nます。ここで、ポイントl_2を持つ新しい線が必要です。ただし、すべての場合、のセグメントが等距離または均一であることを意味します。kq_1,...,q_k.i \in {1,...,k-1}: abs( q_i - q_i+1 ) = constl_2

  • k >= 2
  • およびp_1p_nはにある必要がありl_2ます。
  • abs( p_i - p_i+1 )constではありません

1つの解決策は、スプラインで線を近似し、次にこれを再度サブサンプリングして、均一な長さのセグメントを作成することです。もっと上手くできますか?そのためのC++コードはありますか?

ああ、私は特定の詳細を見逃しました:それらq_iはにあるべきですl_1、つまりそれらはの線分上にあるか、l_1またはのサンプルポイントですl_1

4

2 に答える 2

8

パラメトリック関数の使用

区分的パラメトリック関数を定義できます。

 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};

次に、ポイントqを選択します。理想的には、最小のp [i + 1]-p[i]よりも小さい間隔で配置します。

最後に、等しいt間隔でf[q]をサンプリングします。

サンプル結果:

代替テキスト

ここでは、元のサンプルの間隔サイズを最大から最小に縮小した効果を確認できます。

代替テキスト

元の曲線と再サンプリングされた曲線の間の領域を合計(統合)する近似の良さを評価できます。

代替テキスト

さまざまな間隔サイズの積分をプロットする場合、適切なサンプリングを決定できます。

代替テキスト

念のため、Mathematicaのコードは次のとおりです。

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]}];

編集:あなたのコメントに答える

コメントされたpgmコード:

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*)
于 2010-10-29T15:10:16.790 に答える
2

それはあなたのラインポイントに依存します-それらは何ですか?滑らかな線を定義する場合は、3次スプラインをリサンプリングすることをお勧めします。

基本的に、ポイントを等距離にする場合は、ポイント間に何を見たいかを定義する必要があります。元の線に忠実であるよりも滑らかさが重要ですか?速度の制約はありますか?

私が見る限り、ここで反復プロセスが発生する可能性があります。元のポイントが滑らかな線を定義している場合、その線の長ささえ計算するのは簡単ではなく、それを均等に分割することは言うまでもありません。そして、これらの点の座標を決定します。

3次スプラインを使用する場合、各スプラインについて、ウィキペディアの弧長の記事の式を使用してその長さを計算できるはずです。ただし、積分を行う必要があります。数値積分を行う場合、「求積法」と呼ばれます。立方体の場合(2つの元の点の間の線分の長さを計算するため)、これは、特にガウス求積法を使用する場合、3次スプラインの係数の加重和として終わるはずです。

ただし、区分的3次多項式(2点とその両側の2点から3次多項式を生成する)と、xiの推定値を改善して等距離の点を与える反復アルゴリズムを使用すると、おそらく妥当な答えを得ることができます。しかし、それはあなたが正確さよりもスピードを望んでいることを前提としています。

于 2010-10-29T15:32:41.450 に答える