C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

最小二乗法で円フィッティングを考える2

こちらの続きです。
最小二乗法で円フィッティングを考える1 - C#ATIA
・・・結局、探しても見つからない為、numpy使う事にしました。

こちらを参考にさせてもらいました。
円の最小二乗近似 - morikomorou’s blog

    # param: list(Point3D)
    def circleFitting(points: list):

        x = np.array([p.x for p in points]) 
        y = np.array([p.y for p in points]) 

        A = np.vstack((x, y, np.ones((len(x))))).T
        v = -(x ** 2 + y ** 2)
        u, residuals, rank, s = np.linalg.lstsq(A, v, rcond=None)

        cx_pred = u[0] / (-2)
        cy_pred = u[1] / (-2)
        r_pred = np.sqrt(cx_pred ** 2 + cy_pred ** 2 - u[2])

        return cx_pred, cy_pred, r_pred

    # param: list(Point3D)
    def getFittingCircle(points: list) -> adsk.core.Circle3D:

        x, y, r = circleFitting(points)
        return adsk.core.Circle3D.createByCenter(
            adsk.core.Point3D.create(x, y, 0),
            adsk.core.Vector3D.create(0, 0, 1),
            r
        )

getFittingCircle関数にpoint3Dのリストを突っ込むと、円フィッティング
されたCircle3Dが返ってきます。

調べてないのですが、円フィッティングさせている分、高精度になる
のですが、処理が少し遅くなる予感はしていたのですが、
ポリゴン→円の変換可能かな? チェックを簡素化したおかげで
僅かながら処理時間が短縮されました。

でも、処理時間短縮はここじゃないんだよなぁ。
ここにMSketch.CreateCircleがあるんだけど、使い方が分からない。
Fusion360_Small_Tools_for_Developers/TextCommands_txt_Ver2_0_8176.txt at master · kantoku-code/Fusion360_Small_Tools_for_Developers · GitHub
試したいんだけどなぁ。

1個づつじゃなくて、何処かに描いた円をコピペしてババッとやりたい。