私のプログラムは、次のリスト (抜粋) を生成します。
my_list = [{'x': 1764, 'y': 18320, 'class': 'note', 'id': 'd1e2443'},
{'x': 1764, 'y': 20030, 'class': 'note', 'id': 'd1e2591'},
{'x': 1807, 'y': 12650, 'class': 'note', 'id': 'd1e1362'},
{'x': 2243, 'y': 20120, 'class': 'note', 'id': 'd1e2609'},
{'x': 2243, 'y': 22685, 'class': 'note', 'id': 'd1e2769'},
{'x': 2257, 'y': 12560, 'class': 'note', 'id': 'd1e1380'},
{'x': 2688, 'y': 20210, 'class': 'note', 'id': 'd1e2625'},
{'x': 2707, 'y': 10040, 'class': 'note', 'id': 'd1e1194'},
{'x': 2707, 'y': 12650, 'class': 'note', 'id': 'd1e1398'},
{'x': 2707, 'y': 14720, 'class': 'note', 'id': 'd1e1571'},
{'x': 2901, 'y': 18140, 'class': 'note', 'id': 'd1e2475'}]
すでに「x」キーの値でソートされています。特定の座標に対してこのリストの2つの要素のタプルを返すメソッドを作成しようとしています(xPos, yPos)
:
- 左に最も近い要素 (
x <= xPos
) - 右に最も近い要素 (
x > xPos
)
距離は単にユークリッド距離 (「ピタゴラス」) です。関数の 2 番目のパラメーターは、許可される最大距離です。
def getNearest(noteList, posX, posY, maxDistance):
[...]
return leftElement, rightElement
検索領域を絞り込むために、bisect 関数を使用しxPos
て、xPos - maxDistance
(case 'left') および(case 'right) にそれぞれ最も近い要素の挿入ポイントを取得しようとしました。xPos + maxDistance
次に、このスライスされたリストの残りのすべての要素の距離を計算しました
なんというか、これは非常に非エレガントに感じます。これを行うより良い方法はありますか?
編集: たぶん、私の意図はあまり明確ではありませんでした: リストの 2 つの要素が必要です。'2D ペイン' 内の最も近い要素が左に、もう 1 つが右にあります。したがって、y 座標も考慮する必要があります。
x座標に関して最も近い要素が、近くのy座標を持つ要素よりもはるかに離れていることが(実際にはほぼ毎回)発生する可能性があります。