CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

任意の曲面をフーリエ変換するPythonプログラム

2023-03-13 03:31:27 | Civil3D
ドローンを使って地表を撮影し、Civil3Dで作図するシーンをイメージして以下の質問を思い付いた。

任意の曲面をフーリエ変換するPythonプログラムを書いて


以下は、任意の曲面をフーリエ変換するPythonプログラムの例です。numpyとmatplotlibのライブラリを使用しています。このプログラムでは、フーリエ変換を2回実行して、元の曲面と復元された曲面を比較します。

import numpy as np import matplotlib.pyplot as plt # 2次元フーリエ変換 def fft2d(surface): return np.fft.fft2(surface) # 逆2次元フーリエ変換 def ifft2d(fourier_surface): return np.fft.ifft2(fourier_surface) # メイン関数 def main(): # 曲面を生成する x = np.linspace(-10, 10, 256) y = np.linspace(-10, 10, 256) xv, yv = np.meshgrid(x, y) surface = np.sin(np.sqrt(xv ** 2 + yv ** 2)) / np.sqrt(xv ** 2 + yv ** 2) # フーリエ変換する fourier_surface = fft2d(surface) # フーリエ逆変換して元の曲面を復元する restored_surface = ifft2d(fourier_surface).real # 結果をプロットする fig, axs = plt.subplots(1, 2, figsize=(8, 4)) axs[0].imshow(surface, cmap="gray") axs[0].set_title("Original Surface") axs[1].imshow(restored_surface, cmap="gray") axs[1].set_title("Restored Surface") plt.show() if __name__ == "__main__": main()

このプログラムは、-10から10までの範囲のxとyの値を持つ256x256のメッシュグリッドを作成し、それに対してsin(sqrt(x^2 + y^2))/sqrt(x^2 + y^2)を適用して、曲面を生成します。その後、生成された曲面に対して2次元フーリエ変換を実行し、フーリエ逆変換によって復元された曲面を計算します。最後に、元の曲面と復元された曲面を2つのサイドバイサイドのサブプロットでプロットします。

以下はPydroidでの実行結果






ドローンで地表を撮影した際に得られた高低差のデータを利用して加工すれば、Civil3Dに自動で作図させることも可能になると思われる。




最新の画像もっと見る