前提・実現したいこと
csvデータに含まれる位置情報(xyz値)のデータを行列計算によって回転・移動を行いたいと考えています。具体的には1.原点中心の回転とするために平行移動を行う。2.原点中心に回転を行い、位置情報データをY軸を基準とするように回転を行う。の2点を行いたいと考えています。
1.については起点なる位置の抽出ができたのですが、2.の回転のフェーズにおいて、csvデータの行ごとの計算方法がわかりません。
座標の変換を行って、xyzを再びcsvデータとして出力する方法はわかるのですが、回転の計算の部分のみわかりません。よろしくお願いいたします。
私が考えている平行移動及び回転のイメージは以下の図のようになっております。
以下、csvデータの一部分です。
X Y Z
18840.76758 -30595.92773 26.81204796
18840.75781 -30595.89648 26.83104706
18840.7832 -30595.90625 26.82704735
18840.78516 -30595.91016 26.81804657
18840.76758 -30595.9082 26.8090477
18840.75781 -30595.9082 26.79904747
18840.76172 -30595.91211 26.7920475
18840.77148 -30595.92188 26.7770462
18840.73633 -30595.875 26.81004715
18840.75781 -30595.88477 26.80404663
また、各行が位置を表しており、これらのデータを以下の式を使って座標変換したいと考えています。
該当のソースコード
import pandas as pd import csv import numpy as np import sympy as sp #入れたいデータを選択 pd.read_csv("〇〇〇") #入れたいデータを選択 df=pd.read_csv("〇〇〇",names=("X","Y","Z")) #CSVを列ごとにラベル付け X=df["X"] Y=df["Y"] Z=df["Z"] #XとYの最大・最小を抽出 Xmax = (max(X)) Ymax = (max(Y)) Xmin = (min(X)) Ymin = (min(Y)) print(df[df['X'] == df.min(axis=0)['X']]) print(df[df['Y'] == df.min(axis=0)['Y']]) x1 = df[df['Y'] == df.min(axis=0)['Y']]['X'].values[0] y1 = df[df['Y'] == df.min(axis=0)['Y']]['Y'].values[0] x2 = df[df['X'] == df.min(axis=0)['X']]['X'].values[0] y2 = df[df['X'] == df.min(axis=0)['X']]['Y'].values[0] #回転すべき角度を求める kijunn = (x2 - x1) / (y2 - y1) θ = abs(np.degrees(np.arctan(kijunn))) print(θ) sinθ = np.sin(np.radians(θ)) cosθ = np.cos(np.radians(θ)) #この式を使って回転・移動を行うため、csvに含まれる位置情報データに適応したいです。 u = ( X*(cosθ) + Y*(sinθ) - x1 ) v = ( -X*(sinθ) + Y*(cosθ) - y1 )
試したこと
defやsympyを使って試してみたのですが、csvデータの行ごとの計算がうまくいきませんでした。
回答2件
あなたの回答
tips
プレビュー