Ich arbeite an der Begradigung von Splines als Teil meines größeren Projekts, um gekrümmten Text zu begradigen.Begradigen Sie einen Spline mithilfe von Derivaten, um die Rotation an jedem Punkt zu bestimmen.
Nach dem Anpassen eines Splines an meine Datenpunkte verwende ich scipy splev
, um die Ableitung des Splines an jedem Punkt entlang der Kurve zu erhalten. Da die Ableitung mir die Neigung der Tangente zur Kurve an einem gegebenen Punkt gibt (wenn ich nicht sehr verwirrt bin), bestimmt ich die Drehung, die benötigt wird, um eine gerade Linie zu erzeugen, indem ich die Ableitung mit einer Linie mit Steigung 0 vergleiche.
Nachdem ich die Rotation an jedem Punkt festgelegt habe, um meinen Spline zu richten, schleife ich über jeden Punkt und setze die korrigierende Drehung auf den aktuellen Punkt und jeden vorhergehenden Punkt.
Der entsprechende Code folgt:
import numpy as np
from numpy import arange
from scipy import interpolate
import matplotlib.pyplot as plt
import math
import random
def rotate(origin, point, angle):
ox, oy = origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return qx, qy
xxx = [0,2,4,4,2,0]
yyy = [0,2,4,6,8,10]
tckp, u = interpolate.splprep([xxx, yyy], s=3, k=2, nest=-1)
xpointsnew, ypointsnew = interpolate.splev(u, tckp)
dx, dy = interpolate.splev(u, tckp, der=1)
fullder = dy/dx
rotating_x = xxx
rotating_y = yyy
index = -1
for i in fullder:
index += 1
corrective_rotation = -(math.degrees(math.atan(0)-math.atan(fullder[index])))
print(corrective_rotation)
rotation_center = [rotating_x[index], rotating_y[index]]
target_indices = np.arange(0,index,1)
for i in target_indices:
rotation_target = [rotating_x[i], rotating_y[i]]
qx, qy = rotate(rotation_target,rotation_center,math.radians(corrective_rotation))
rotating_x[i] = qx
rotating_y[i] = qy
print(rotating_x)
print(rotating_y)
plt.plot(xpointsnew, ypointsnew, 'r-')
plt.plot(rotating_x, rotating_y, 'b-')
plt.show()
Was ich tue, nicht funktioniert, aber ich bin mir nicht sicher, warum. Die resultierende Linie ist nicht nur gerade, sondern auch viel kürzer als die ursprüngliche Kurve. Ist der oben skizzierte Ansatz in irgendeiner Weise grundlegend fehlerhaft? Mache ich etwas Dummes in meinem Code? Ich würde wirklich ein zweites Augenpaar schätzen.
Sie definieren rotate-Methode und Sie verwenden es überhaupt nicht. – MishaVacic
@MishaVacic Ich nicht? Ich bin mir ziemlich sicher, dass ich hier mache: 'qx, qy = rotiere (rotation_target, rotation_center, math.radians (corrective_rotation))' – Tric