実現したいこと
ベジエ曲線の曲率を求められるようにしたい。
制御点を指定して作図するプログラムはできたのですが、そこから曲率を求めるプログラムの作成に苦戦してます。
以下のサイトを参考に曲率半径の計算を行おうとしています。
https://qiita.com/HMMNRST/items/39f77e5051df2928eb93
該当のソースコード
import numpy as np import math from matplotlib import pyplot as plt import os import glob from PIL import Image # Bernstein多項式を計算する関数 def bernstein(n, t): B = [] for k in range(n + 1): # 二項係数を計算してからBernstein多項式を計算 nCk = math.factorial(n) / (math.factorial(k) * math.factorial(n - k)) B.append(nCk * t ** k * (1 - t) ** (n - k)) print(nCk, k, n - k) return B # ベジェ曲線を描く関数 def bezie_curve(Q): n = len(Q) - 1 dt = 0.01 t = np.arange(0, 1 + dt, dt) B = bernstein(n, t) px = 0 py = 0 for i in range(len(Q)): px += np.dot(B[i], Q[i][0]) py += np.dot(B[i], Q[i][1]) return px, py, t # 点座標を準備 q1 = [0., 0] q2 = [0.5, 1.] q3 = [0.75, 0.] q4 = [1.25, 1.] q5 = [1.5, 0.] q6 = [2., 1.] Q = [q1, q2, q3, q4, q5, q6] # ベジェ曲線を描く関数を実行 px, py, t = bezie_curve(Q) for j in range(len(t)): print(j) # 制御点個数-1(n-1)の線分ができるので、その方程式(傾きと切片)を得る tx = [] ty = [] for i in range(len(Q) - 1): diff_x = Q[i + 1][0] - Q[i][0] if diff_x == 0: diff_y = Q[i + 1][1] - Q[i][1] tx.append(Q[i][0]) ty.append(Q[i][1] + t[j] * diff_y) else: grad = (Q[i + 1][1] - Q[i][1]) / diff_x intercept = Q[i][1] - grad * Q[i][0] tx_temp = Q[i][0] + t[j] * diff_x tx.append(tx_temp) ty.append(grad * tx_temp + intercept) tx2 = [] ty2 = [] for i in range(len(tx) - 1): diff_x2 = tx[i + 1] - tx[i] if diff_x2 == 0: diff_y2 = ty[i + 1] - ty[i] tx2.append(tx[i]) ty2.append(ty[i] + t[j] * diff_y2) else: grad2 = (ty[i + 1] - ty[i]) / diff_x2 intercept2 = ty[i] - grad2 * tx[i] tx_temp2 = tx[i] + t[j] * diff_x2 tx2.append(tx_temp2) ty2.append(grad2 * tx_temp2 + intercept2)
曲率の式をどのように適用すればいいのか三時間くらいネットサーフィンをして探したり考えたりしてますが、いまだにできてません。
どうか教えてください。
補足情報(FW/ツールのバージョンなど)
python 3.10

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/17 07:33 編集
退会済みユーザー
2023/01/17 12:10
2023/01/17 12:21
退会済みユーザー
2023/01/17 12:43 編集
2023/01/17 14:36