Difference between revisions of "Transverse Hinge Axis"

no edit summary
Line 213: Line 213:
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt


# Dati originali forniti
# Original data provided
original_center = np.array([11.56, 61.21])
original_center = np.array([11.56, 61.21])
radius = 26.38
radius = 26.38
Line 222: Line 222:
])
])


# Funzione per aggiungere rumore ai punti
# Function to add noise to the points
def add_noise_to_points(points, noise_level):
def add_noise_to_points(points, noise_level):
     noisy_points = points + np.random.normal(0, noise_level, points.shape)
     noisy_points = points + np.random.normal(0, noise_level, points.shape)
     return noisy_points
     return noisy_points


# Aggiungi rumore ai punti
# Add noise to the points
noise_level = 0.1  # Livello di rumore ridotto
noise_level = 0.1  # Reduced noise level
noisy_points = add_noise_to_points(points, noise_level)
noisy_points = add_noise_to_points(points, noise_level)


# Funzione residua per il fitting non lineare
# Residual function for non-linear fitting
def residuals(c, points):
def residuals(c, points):
     xc, yc, r = c
     xc, yc, r = c
Line 237: Line 237:
     return Ri - r
     return Ri - r


# Calcolo del centro e del raggio usando i punti rumorosi
# Calculate the center and radius using noisy points
x_m = np.mean(noisy_points[:, 0])
x_m = np.mean(noisy_points[:, 0])
y_m = np.mean(noisy_points[:, 1])
y_m = np.mean(noisy_points[:, 1])
Line 243: Line 243:
initial_guess = [x_m, y_m, r_m]
initial_guess = [x_m, y_m, r_m]


# Fitting del cerchio usando il metodo di Levenberg-Marquardt
# Fitting the circle using the Levenberg-Marquardt method
result = least_squares(residuals, initial_guess, args=(noisy_points,))
result = least_squares(residuals, initial_guess, args=(noisy_points,))
xc, yc, r = result.x
xc, yc, r = result.x
Line 249: Line 249:
calculated_center = np.array([xc, yc])
calculated_center = np.array([xc, yc])


# Calcolo dell'errore tra i centri
# Calculate the error between the centers
error = np.linalg.norm(calculated_center - original_center)
error = np.linalg.norm(calculated_center - original_center)
error_mm = error * 10  # Convertire in millimetri (tenendo conto che i punti potrebbero essere in centimetri)
error_mm = error * 10  # Convert to millimeters (assuming the points might be in centimeters)


# Verifica del centro calcolato
# Verify the calculated center
print(f'Calculated Center: {calculated_center}')
print(f'Calculated Center: {calculated_center}')
print(f'Radius: {r:.4f}')
print(f'Radius: {r:.4f}')
print(f'Error: {error_mm:.4f} mm')
print(f'Error: {error_mm:.4f} mm')


# Visualizzazione del cerchio calcolato
# Visualization of the fitted circle
theta = np.linspace(0, 2 * np.pi, 100)
theta = np.linspace(0, 2 * np.pi, 100)
x_fit = calculated_center[0] + r * np.cos(theta)
x_fit = calculated_center[0] + r * np.cos(theta)
Line 272: Line 272:
plt.ylabel('Y')
plt.ylabel('Y')
plt.legend()
plt.legend()
plt.title('Fitting del Cerchio con Punti Rumorosi')
plt.title('Circle Fitting with Noisy Points')
plt.grid(True)
plt.grid(True)
plt.show()
plt.show()
</syntaxhighlight>
</syntaxhighlight>
==Occlusal Distortions==
==Occlusal Distortions==
Line 297: Line 298:
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt


# Definizione dei dati originali
# Definition of the original data
original_center = np.array([11.56, 61.21])  # Centro originale del cerchio
original_center = np.array([11.56, 61.21])  # Original center of the circle
r = 26.38  # Raggio del cerchio originale
r = 26.38  # Radius of the original circle
theta = np.linspace(0, 2 * np.pi, 10)  # 10 punti lungo la circonferenza
theta = np.linspace(0, 2 * np.pi, 10)  # 10 points along the circumference


# Generazione dei punti originali sulla circonferenza
# Generation of original points on the circumference
points = np.array([
points = np.array([
     original_center + r * np.array([np.cos(angle), np.sin(angle)])
     original_center + r * np.array([np.cos(angle), np.sin(angle)])
Line 308: Line 309:
])
])


# Definizione del raggio per la posizione delle cuspidi dentali
# Definition of the radius for the position of dental cusps
cusp_radius = 75.0  # Distanza della cuspide dal centro di rotazione
cusp_radius = 75.0  # Distance of the cusp from the center of rotation


# Generazione delle posizioni delle cuspidi dentali originali
# Generation of the positions of the original dental cusps
cusp_positions = np.array([
cusp_positions = np.array([
     original_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
     original_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
Line 317: Line 318:
])
])


# Simulazione degli errori Δ
# Simulation of the errors Δ
errors = np.linspace(0, 10, 10)  # Errori Δ da 0 a 10 mm, 10 passi
errors = np.linspace(0, 10, 10)  # Errors Δ from 0 to 10 mm, 10 steps
max_differences_zero_apertura = []
max_differences_zero_apertura = []


# Errore cuspidale per apertura mandibolare a 0 mm è zero
# Cusp error for mandibular opening at 0 mm is zero
for delta in errors:
for delta in errors:
     max_differences_zero_apertura.append(0)  # Errore cuspidale è zero
     max_differences_zero_apertura.append(0)  # Cusp error is zero


plt.plot(errors, max_differences_zero_apertura, 'ro-', label='Apertura 0 mm (Bocca chiusa)')
plt.plot(errors, max_differences_zero_apertura, 'ro-', label='Opening 0 mm (Mouth closed)')
plt.xlabel('Errore Δ (mm) nella localizzazione HA')
plt.xlabel('Error Δ (mm) in HA localization')
plt.ylabel('Max Difference in Cusp Positions (mm)')
plt.ylabel('Max Difference in Cusp Positions (mm)')
plt.title('Errore Cuspidale con Apertura a 0 mm e Cuspidi Piatte')
plt.title('Cusp Error with 0 mm Opening and Flat Cusps')
plt.grid(True)
plt.grid(True)
plt.legend()
plt.legend()
plt.show()
plt.show()
</syntaxhighlight><blockquote>
</syntaxhighlight><blockquote>
===='''Script Pyhton: Errore Cuspidale con Apertura a 3 mm e Cuspidi Piatte'''====
===='''Script Pyhton: Errore Cuspidale con Apertura a 3 mm e Cuspidi Piatte'''====
Line 340: Line 342:
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt


# Definizione dei dati originali
# Definition of the original data
original_center = np.array([11.56, 61.21])  # Centro originale del cerchio
original_center = np.array([11.56, 61.21])  # Original center of the circle
r = 26.38  # Raggio del cerchio originale
r = 26.38  # Radius of the original circle
theta = np.linspace(0, 2 * np.pi, 10)  # 10 punti lungo la circonferenza
theta = np.linspace(0, 2 * np.pi, 10)  # 10 points along the circumference


# Generazione dei punti originali sulla circonferenza
# Generation of original points on the circumference
points = np.array([
points = np.array([
     original_center + r * np.array([np.cos(angle), np.sin(angle)])
     original_center + r * np.array([np.cos(angle), np.sin(angle)])
Line 351: Line 353:
])
])


# Definizione del raggio per la posizione delle cuspidi dentali
# Definition of the radius for the position of dental cusps
cusp_radius = 75.0  # Distanza della cuspide dal centro di rotazione
cusp_radius = 75.0  # Distance of the cusp from the center of rotation


# Generazione delle posizioni delle cuspidi dentali originali
# Generation of the positions of the original dental cusps
cusp_positions = np.array([
cusp_positions = np.array([
     original_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
     original_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
Line 360: Line 362:
])
])


# Simulazione degli errori Δ
# Simulation of the errors Δ
errors = np.linspace(0, 10, 10)  # Errori Δ da 0 a 10 mm, 10 passi
errors = np.linspace(0, 10, 10)  # Errors Δ from 0 to 10 mm, 10 steps
max_differences_apertura_3mm = []
max_differences_apertura_3mm = []


# Calcolo dell'errore cuspidale per apertura mandibolare a 3 mm
# Calculation of the cusp error for a mandibular opening of 3 mm
for delta in errors:
for delta in errors:
     new_center = original_center + np.array([delta, 0])  # Spostamento lungo l'asse x
     new_center = original_center + np.array([delta, 0])  # Shift along the x-axis
      
      
     # Calcolo delle nuove posizioni delle cuspidi dentali con l'errore Δ
     # Calculate the new positions of the dental cusps with error Δ
     new_cusp_positions = np.array([
     new_cusp_positions = np.array([
         new_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
         new_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
Line 374: Line 376:
     ])
     ])
      
      
     # Calcolo delle differenze spaziali tra le posizioni originali e quelle calcolate
     # Calculate the spatial differences between the original and calculated positions
     differences = np.linalg.norm(cusp_positions - new_cusp_positions, axis=1)
     differences = np.linalg.norm(cusp_positions - new_cusp_positions, axis=1)
     max_difference = np.max(differences) * (3 / 30)  # Scala dell'errore per un'apertura di 3 mm su 18 mm massimi
     max_difference = np.max(differences) * (3 / 30)  # Scaling the error for a 3 mm opening out of 18 mm maximum
     max_differences_apertura_3mm.append(max_difference)
     max_differences_apertura_3mm.append(max_difference)
      
      
     print(f"Errore Δ = {delta:.1f} mm: Max Difference in Cusp Positions (3 mm apertura) = {max_difference:.2f} mm")
     print(f"Error Δ = {delta:.1f} mm: Max Difference in Cusp Positions (3 mm opening) = {max_difference:.2f} mm")


plt.plot(errors, max_differences_apertura_3mm, 'bo-', label='Apertura 3 mm')
plt.plot(errors, max_differences_apertura_3mm, 'bo-', label='Opening 3 mm')
plt.xlabel('Errore Δ (mm) nella localizzazione HA')
plt.xlabel('Error Δ (mm) in HA localization')
plt.ylabel('Max Difference in Cusp Positions (mm)')
plt.ylabel('Max Difference in Cusp Positions (mm)')
plt.title('Errore Cuspidale con Apertura a 3 mm e Cuspidi Piatte')
plt.title('Cusp Error with 3 mm Opening and Flat Cusps')
plt.grid(True)
plt.grid(True)
plt.legend()
plt.legend()
plt.show()
plt.show()
</syntaxhighlight><blockquote>
</syntaxhighlight><blockquote>
===='''Script Python: Effetto degli Errori di Localizzazione del Centro di Rotazione con on Apertura a 0 mm e Cuspidi Inclinate ''<math>5^\circ</math>'''''====
===='''Script Python: Effetto degli Errori di Localizzazione del Centro di Rotazione con on Apertura a 0 mm e Cuspidi Inclinate ''<math>5^\circ</math>'''''====
Line 394: Line 397:
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt


# Definizione dei dati originali
# Definition of the original data
original_center = np.array([11.56, 61.21])  # Centro originale del cerchio
original_center = np.array([11.56, 61.21])  # Original center of the circle
r = 26.38  # Raggio del cerchio originale
r = 26.38  # Radius of the original circle
theta = np.linspace(0, 2 * np.pi, 10)  # 10 punti lungo la circonferenza
theta = np.linspace(0, 2 * np.pi, 10)  # 10 points along the circumference


# Generazione dei punti originali sulla circonferenza
# Generation of original points on the circumference
points = np.array([
points = np.array([
     original_center + r * np.array([np.cos(angle), np.sin(angle)])
     original_center + r * np.array([np.cos(angle), np.sin(angle)])
Line 405: Line 408:
])
])


# Definizione del raggio per la posizione delle cuspidi dentali
# Definition of the radius for the position of dental cusps
cusp_radius = 75.0  # Distanza della cuspide dal centro di rotazione
cusp_radius = 75.0  # Distance of the cusp from the center of rotation


# Generazione delle posizioni delle cuspidi dentali originali
# Generation of the positions of the original dental cusps
cusp_positions = np.array([
cusp_positions = np.array([
     original_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
     original_center + cusp_radius * np.array([np.cos(angle), np.sin(angle)])
Line 414: Line 417:
])
])


# Simulazione degli errori Δ
# Simulation of the errors Δ
errors = np.linspace(0, 10, 10)  # Errori Δ da 0 a 10 mm, 10 passi
errors = np.linspace(0, 10, 10)  # Errors Δ from 0 to 10 mm, 10 steps
max_differences_inclined_cusp = []
max_differences_inclined_cusp = []


# Definizione dell'angolazione delle cuspidi dentali (in gradi)
# Definition of the angle of the dental cusps (in degrees)
cusp_angle_deg = 5   
cusp_angle_deg = 5   
cusp_angle_rad = np.deg2rad(cusp_angle_deg)  # Conversione in radianti
cusp_angle_rad = np.deg2rad(cusp_angle_deg)  # Conversion to radians


# Calcolo dell'errore cuspidale per apertura mandibolare a 0 mm con cuspidi inclinate
# Calculation of cusp error for mandibular opening at 0 mm with inclined cusps
for delta in errors:
for delta in errors:
     # Calcolo dell'errore verticale dovuto all'inclinazione delle cuspidi
     # Calculation of vertical error due to cusp inclination
     vertical_error_due_to_inclination = delta * np.tan(cusp_angle_rad)
     vertical_error_due_to_inclination = delta * np.tan(cusp_angle_rad)
      
      
     # Salviamo l'errore massimo in questo caso specifico
     # Save the maximum error in this specific case
     max_differences_inclined_cusp.append(vertical_error_due_to_inclination)
     max_differences_inclined_cusp.append(vertical_error_due_to_inclination)
      
      
     print(f"Errore Δ = {delta:.1f} mm: Max Difference in Cusp Positions con cuspidi inclinate = {vertical_error_due_to_inclination:.2f} mm")
     print(f"Error Δ = {delta:.1f} mm: Max Difference in Cusp Positions with inclined cusps = {vertical_error_due_to_inclination:.2f} mm")


plt.plot(errors, max_differences_inclined_cusp, 'ro-', label=f'Cuspidi inclinate ({cusp_angle_deg}°)')
plt.plot(errors, max_differences_inclined_cusp, 'ro-', label=f'Inclined Cusps ({cusp_angle_deg}°)')
plt.xlabel('Errore Δ (mm) nella localizzazione HA')
plt.xlabel('Error Δ (mm) in HA localization')
plt.ylabel('Max Difference in Cusp Positions (mm)')
plt.ylabel('Max Difference in Cusp Positions (mm)')
plt.title(f'Effetto degli Errori di Localizzazione del Centro di Rotazione con Cuspidi Inclinate ({cusp_angle_deg}°)')
plt.title(f'Effect of Rotation Center Localization Errors with Inclined Cusps ({cusp_angle_deg}°)')
plt.grid(True)
plt.grid(True)
plt.legend()
plt.legend()
plt.show()
plt.show()
</syntaxhighlight>
</syntaxhighlight>


Editor, Editors, USER, admin, Bureaucrats, Check users, dev, editor, founder, Interface administrators, member, oversight, Suppressors, Administrators, translator
11,142

edits