ゆるサブ

趣味のこととか日常で感じたことをゆるく書いていく

Fusion 360 のスケッチに三角関数を描いてみた

最近、Fusion 360 にnumpyを導入することに成功したので、試しに簡単な関数を描いてみた。
前回の記事はこちら。
miogadanisub.hatenadiary.jp

準備

まずFusion 360pythonを使うにあたって、それなりの記法というか使い方があるので、AutodeskのホームページからFusion 360 API の適当なサンプルを見つけてくる。
help.autodesk.com
今回は「Program Interface ⇒ Sample Programs ⇒ Modeling ⇒ Sketches ⇒ Sketch spline through points creation and relative function」のソースコードをコピペして、少々手を加えた。
f:id:miogadani:20210715031831p:plainf:id:miogadani:20210715031842p:plainf:id:miogadani:20210715031846p:plain

三角関数

どうやら、曲線をそのまま描くことはできない?ようなので、関数に具体的な値を代入していって出力されたものをスケッチする、という流れになる。
当然、値を細かくしていけば正確な曲線には近づくが、NURBS カーブを使っているので実際はそこまでの点数は必要ない気がしている。


まずは、\(f(x) = \sin (x) \) を 2 cm刻みで描いてみる。
デフォルトの単位がcmになっていることに注意。

import adsk.core, adsk.fusion, traceback
import numpy as np

# ここの部分を変えて、関数を定義する。
posX = np.arange(-10,11,2) # 単位はcm 
posY = np.sin(posX) 

# この下は、基本的に変えなくていい。
def run(context):
    ui = None
    try: 
        app = adsk.core.Application.get()
        ui = app.userInterface

        doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
        design = app.activeProduct

        # Get the root component of the active design.
        rootComp = design.rootComponent

        # Create a new sketch on the xy plane.
        sketch = rootComp.sketches.add(rootComp.xYConstructionPlane)

        # Create an object collection for the points.
        points = adsk.core.ObjectCollection.create()

        # Define the points the spline with fit trhrough.
        for num in range (len(posX)):
            points.add(adsk.core.Point3D.create(float(posX[num]), float(posY[num]), 0))

        # Create the spline.
        spline = sketch.sketchCurves.sketchFittedSplines.add(points)

        # Get spline fit points
        fitPoints = spline.fitPoints

        # Get the second fit point
        fitPoint = fitPoints.item(1)
 
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

f:id:miogadani:20210715033942p:plain
2 cm 刻みだと、若干曲線が歪んでいる。もう少し刻みを細かくしてみる。
f:id:miogadani:20210715033945p:plainf:id:miogadani:20210715033950p:plainf:id:miogadani:20210715033956p:plain
今回の場合、5 mm ぐらいの刻み幅で十分なようだ。

三角関数ちょい応用
posX = np.arange(-10,11,0.1) # 単位はcm 
posY = np.sin(posX) + 2 * np.cos(posX * 3)

f:id:miogadani:20210715035208p:plain
フーリエ変換したい。

インボリュート曲線

$$ \begin{eqnarray} x &=& \cos \theta + \theta \cos \theta \\
y &=& \sin \theta -\theta \cos \theta \end{eqnarray} $$

t = np.arange(0,15,0.2) # 単位はcm
posX = np.cos(t) + t * np.sin(t)
posY = np.sin(t) - t * np.cos(t)

f:id:miogadani:20210715043300p:plain
押し出してみる。
f:id:miogadani:20210715043341p:plain

ハートの関数

ハートの関数は色々知られているが、次式を使ってみる。
$$ \begin{eqnarray} x(t)& =& 16 \sin ^3 (t) \\
y(t) &=& 13 \cos(t) - 5 \cos (2t) -2 \cos (3t) -\cos (4t) \end{eqnarray} $$

t = np.arange(-10,11,0.2) # 単位はcm
posX = 16*(np.sin(t))**3
posY = 13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t) 

残念ながら、計算に失敗。。。
f:id:miogadani:20210715041412p:plain


ちょっと試しただけだが、色々使えそう。複雑な関数になると、計算に失敗してしまうのが難点。
また、面白そうな関数を見つけたら書いてみようと思う。