Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで極角に基づいてデカルト座標点のセットを並べ替えるプログラム

リストpointsに格納された一連のデカルト座標点(直交座標点)を考えます。これらの点を、それぞれの極角(偏角)に基づいて並べ替える必要があります。極角は0から2πの範囲で表されます。もし複数の点が同じ極角を持つ場合は、その点の原点からの距離に基づいて並べ替えます。

例えば、入力が points = [(1,1), (1,-2),(-2,2),(5,4),(4,5),(2,3),(-3,4)] の場合、

Pythonで極角に基づいてデカルト座標点のセットを並べ替えるプログラム

出力は [(5, 4), (1, 1), (4, 5), (2, 3), (-3, 4), (-2, 2), (1, -2)] となります。

Pythonで極角に基づいてデカルト座標点のセットを並べ替えるプログラム

解決のための手順

この問題を解くために、以下の手順に従います。

  • 比較用の関数 key() を定義します。この関数は点 x を引数として受け取ります。
  • atan := x[1]/x[0] の逆正接(アークタンジェント)を計算します。
  • atan >= 0 の場合はペア (atan, x[1]^2 + x[0]^2) を返し、そうでなければ (2*pi + atan, x[0]^2 + x[1]^2) を返します。
  • この比較関数 key() を使って points を並べ替えます。

なお、Pythonの math.atan2(y, x) が返す角度の範囲は −π〜π であるため、負の値になった場合は 2π を加算することで、0〜2π の範囲に正規化できます。また、第2要素には原点からの距離の二乗(x² + y²)を使用することで、平方根の計算を避けつつ距離による比較を実現しています。

実装例

理解を深めるために、以下の実装を見てみましょう。

import math
def solve(points):
    def key(x):
        atan = math.atan2(x[1], x[0])
        return (atan, x[1]**2+x[0]**2) if atan >= 0 else (2*math.pi + atan, x[0]**2+x[1]**2)

    return sorted(points, key=key)

points = [(1,1), (1,-2),(-2,2),(5,4),(4,5),(2,3),(-3,4)]
print(solve(points))

入力

[(1,1), (1,-2),(-2,2),(5,4),(4,5),(2,3),(-3,4)]

出力

[(5, 4), (1, 1), (4, 5), (2, 3), (-3, 4), (-2, 2), (1, -2)]
  1. Pythonで学ぶ選択ソートの基本原理と実装方法をわかりやすく解説

    本記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.xでの実装方法について詳しく解説します。 選択ソートとは? 選択ソートは、ソートされていない部分から最小値の要素を繰り返し見つけ出し、それを先頭に移動させることで配列全体を整列していくアルゴリズムです。処理の過程では、与えられた配列が次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーション(反復処理)では、未ソート部分から最小要素を取り出し、ソート済み部分の末尾に挿入していきます。この操作を繰り返すことで、最終的に配列全体

  2. Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説

    この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー