2

ベクトルのリストがあり、すべてのベクトルと残りのベクトルの間の角度を見つける必要があるコードを作成しようとしています(メディアパイプの手のランドマークに取り組んでいます)。これまでの私のコードは次のとおりです。

vectors = [thumb_cmc_vec, thumb_mcp_vec, thumb_ip_vec, thumb_tip_vec, index_mcp_vec, index_pip_vec,
                           index_dip_vec, index_tip_vec, middle_mcp_vec, middle_pip_vec, middle_dip_vec, middle_tip_vec,
                           ring_mcp_vec, ring_pip_vec, ring_dip_vec, ring_tip_vec, pinky_mcp_vec, pinky_pip_vec,
                           pinky_dip_vec, pinky_tip_vec]

                for vector in vectors:
                    next_vector = vector + 1
                    print(vector)
                    for next_vector in vectors:
                        print(next_vector)
                        M = (np.linalg.norm(vector) * np.linalg.norm(next_vector))
                        ES = np.dot(vector, next_vector)
                        th = math.acos(ES / M)
                        list.append(th)
                        print(list)

ここで、M = 現在のベクトル セットのノルムの乗算、ES = ベクトルのスカラー積、th = ベクトルの角度です。next_vector私の問題は、結果が重複しないように、前のループの次のベクトルから開始したいにもかかわらず、変数が常にリストの最初のベクトルから for ループを開始することです。また、両方のループが 3 番目のベクトル (thumb_ip_vec) にある場合、このエラー th = math.acos(ES / M) ValueError: math domain error が発生します。これを解決する方法はありますか?ありがとうございました!

4

3 に答える 3

2

range(len(vectors) - 1)リストのインデックスを ( を使用して) 反復処理し、各要素をループする代わりに、インデックスを介して要素にアクセスできると思います

for i in range(len(vectors) - 1):
    # Iterate from 0 to len(vectors) -1
    vector = vectors[i]
    for j in range(i + 1, len(vectors)):
        # Iterate from index i + 1 to len(vectors)
        next_vector = vectors[j]
        M = (np.linalg.norm(vector) * np.linalg.norm(next_vector))
        ES = np.dot(vector, next_vector)
        th = math.acos(ES / M)
        list.append(th)
        print(list)
于 2021-05-02T15:55:07.757 に答える