13

等間隔でない (x,y) 値のリストがあります。この質問で使用されているアーカイブは次のとおりです。

値の間を補間することはできますが、得られるのは等間隔の補間ポイントではありません。これが私がすることです:

x_data = [0.613,0.615,0.615,...]
y_data = [5.919,5.349,5.413,...]

# Interpolate values for x and y.
t = np.linspace(0, 1, len(x_data))
t2 = np.linspace(0, 1, 100)
# One-dimensional linear interpolation.
x2 = np.interp(t2, t, x_data)
y2 = np.interp(t2, t, y_data)

# Plot x,y data.
plt.scatter(x_data, y_data, marker='o', color='k', s=40, lw=0.)

# Plot interpolated points.
plt.scatter(x2, y2, marker='o', color='r', s=10, lw=0.5)

結果は次のとおりです。

ここに画像の説明を入力

ご覧のとおり、元の点の分布が密集しているグラフのセクションでは、赤い点が互いに接近しています。

指定されたステップ値 (0.1 など) に従って、x、y で等間隔の補間点を生成する方法が必要です。


askewchan が正しく指摘しているように、「x 、y で等間隔」という意味は、曲線内の 2 つの連続する補間点が互いに同じ値 (ユークリッド直線距離) 離れている必要があることを意味します。


私はunubtuの答えを試しましたが、滑らかな曲線ではうまく機能しますが、滑らかではない曲線では壊れているようです:

滑らかでない曲線

これは、コードが曲線の真上ではなくユークリッドの方法で点の距離を計算し、曲線上の距離点間で同じになるようにする必要があるために発生します。この問題は何とか回避できますか?

4

5 に答える 5

10

まず、単純なケースを考えてみましょう。データが下の青い線のように見えるとします。

ここに画像の説明を入力

r距離が離れている等距離点を選択したい場合rは、(1,2) の先端が最初の等距離点である場所にいくつかの重要な値があります。

この臨界距離よりも離れたポイントが必要な場合、最初の等距離ポイントは (1,2) から非常に異なる場所 (緑の弧と青の線の交点で示される) にジャンプします。変化は徐々にではありません。

rこのおもちゃのケースは、パラメーターのわずかな変更がソリューションに根本的で不連続な影響を与える可能性があることを示唆しています。

また、(i+1) 番目の等距離点の位置を決定する前に、i 番目の等距離点の位置を知る必要があることも示唆しています。

したがって、反復的な解決策が必要なようです:

import numpy as np
import matplotlib.pyplot as plt
import math

x, y = np.genfromtxt('data', unpack=True, skip_header=1)
# find lots of points on the piecewise linear curve defined by x and y
M = 1000
t = np.linspace(0, len(x), M)
x = np.interp(t, np.arange(len(x)), x)
y = np.interp(t, np.arange(len(y)), y)
tol = 1.5
i, idx = 0, [0]
while i < len(x):
    total_dist = 0
    for j in range(i+1, len(x)):
        total_dist += math.sqrt((x[j]-x[j-1])**2 + (y[j]-y[j-1])**2)
        if total_dist > tol:
            idx.append(j)
            break
    i = j+1

xn = x[idx]
yn = y[idx]
fig, ax = plt.subplots()
ax.plot(x, y, '-')
ax.scatter(xn, yn, s=50)
ax.set_aspect('equal')
plt.show()

ここに画像の説明を入力

注: 縦横比を に設定し'equal'て、ポイントが等距離にあることをより明確にします。

于 2013-10-01T14:18:40.570 に答える
0

曲線に沿って等距離の点を生成することは可能です。しかし、本当の答えを求めるには、もっと明確な定義が必要です。申し訳ありませんが、このタスクのために私が書いたコードは MATLAB で書かれていますが、一般的なアイデアを説明することはできます。3 つの可能性があります。

まず、単純なユークリッド距離に関して、ポイントは隣のポイントから真に等距離にあるでしょうか? これを行うには、曲線上の任意の点で固定半径の円との交点を見つける必要があります。あとはカーブに沿って歩くだけ。

次に、曲線自体に沿った距離を意味する距離を意図する場合、曲線が区分線形の場合、問題は再び簡単に実行できます。線分上の距離は簡単に測定できるので、曲線に沿って歩くだけです。

最後に、曲線を 3 次スプラインにする場合も、それほど難しくはありませんが、もう少し手間がかかります。ここでのトリックは次のとおりです。

  • 曲線に沿って点から点への区分的線形弧長を計算します。それをtと呼びます。
  • 3 次スプラインのペア x(t)、y(t) を生成します。
  • x と y を t の関数として微分します。これらは立方体のセグメントなので、これは簡単です。微分関数は、区分的な二次関数になります。
  • ode ソルバーを使用して曲線に沿って移動し、微分弧長関数を統合します。MATLAB では、ODE45 がうまく機能しました。

したがって、統合する

sqrt((x')^2 + (y')^2)

繰り返しますが、MATLAB では、ODE45 を設定して、関数が特定の指定された点と交差する場所を特定できます。

MATLAB のスキルが十分にある場合は、 interparcのコードで詳細な説明を確認できます。これはかなりよくコメントされたコードです。

于 2013-10-01T14:33:54.730 に答える