|
@@ -155,38 +155,38 @@ float delta_safe_distance_from_top() {
|
155
|
155
|
*
|
156
|
156
|
* The result is stored in the cartes[] array.
|
157
|
157
|
*/
|
158
|
|
-void forward_kinematics_DELTA(float z1, float z2, float z3) {
|
|
158
|
+void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) {
|
159
|
159
|
// Create a vector in old coordinates along x axis of new coordinate
|
160
|
|
- float p12[3] = { delta_tower[B_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[B_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z2 - z1 };
|
|
160
|
+ const float p12[3] = { delta_tower[B_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[B_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z2 - z1 };
|
161
|
161
|
|
162
|
|
- // Get the Magnitude of vector.
|
163
|
|
- float d = SQRT( sq(p12[0]) + sq(p12[1]) + sq(p12[2]) );
|
|
162
|
+ // Get the reciprocal of Magnitude of vector.
|
|
163
|
+ const float d2 = sq(p12[0]) + sq(p12[1]) + sq(p12[2]), inv_d = RSQRT(d2);
|
164
|
164
|
|
165
|
|
- // Create unit vector by dividing by magnitude.
|
166
|
|
- float ex[3] = { p12[0] / d, p12[1] / d, p12[2] / d };
|
|
165
|
+ // Create unit vector by multiplying by the inverse of the magnitude.
|
|
166
|
+ const float ex[3] = { p12[0] * inv_d, p12[1] * inv_d, p12[2] * inv_d };
|
167
|
167
|
|
168
|
168
|
// Get the vector from the origin of the new system to the third point.
|
169
|
|
- float p13[3] = { delta_tower[C_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[C_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z3 - z1 };
|
|
169
|
+ const float p13[3] = { delta_tower[C_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[C_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z3 - z1 };
|
170
|
170
|
|
171
|
171
|
// Use the dot product to find the component of this vector on the X axis.
|
172
|
|
- float i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2];
|
|
172
|
+ const float i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2];
|
173
|
173
|
|
174
|
174
|
// Create a vector along the x axis that represents the x component of p13.
|
175
|
|
- float iex[3] = { ex[0] * i, ex[1] * i, ex[2] * i };
|
|
175
|
+ const float iex[3] = { ex[0] * i, ex[1] * i, ex[2] * i };
|
176
|
176
|
|
177
|
177
|
// Subtract the X component from the original vector leaving only Y. We use the
|
178
|
178
|
// variable that will be the unit vector after we scale it.
|
179
|
179
|
float ey[3] = { p13[0] - iex[0], p13[1] - iex[1], p13[2] - iex[2] };
|
180
|
180
|
|
181
|
|
- // The magnitude of Y component
|
182
|
|
- float j = SQRT( sq(ey[0]) + sq(ey[1]) + sq(ey[2]) );
|
|
181
|
+ // The magnitude and the inverse of the magnitude of Y component
|
|
182
|
+ const float j2 = sq(ey[0]) + sq(ey[1]) + sq(ey[2]), inv_j = RSQRT(j2);
|
183
|
183
|
|
184
|
184
|
// Convert to a unit vector
|
185
|
|
- ey[0] /= j; ey[1] /= j; ey[2] /= j;
|
|
185
|
+ ey[0] *= inv_j; ey[1] *= inv_j; ey[2] *= inv_j;
|
186
|
186
|
|
187
|
187
|
// The cross product of the unit x and y is the unit z
|
188
|
188
|
// float[] ez = vectorCrossProd(ex, ey);
|
189
|
|
- float ez[3] = {
|
|
189
|
+ const float ez[3] = {
|
190
|
190
|
ex[1] * ey[2] - ex[2] * ey[1],
|
191
|
191
|
ex[2] * ey[0] - ex[0] * ey[2],
|
192
|
192
|
ex[0] * ey[1] - ex[1] * ey[0]
|
|
@@ -194,16 +194,16 @@ void forward_kinematics_DELTA(float z1, float z2, float z3) {
|
194
|
194
|
|
195
|
195
|
// We now have the d, i and j values defined in Wikipedia.
|
196
|
196
|
// Plug them into the equations defined in Wikipedia for Xnew, Ynew and Znew
|
197
|
|
- float Xnew = (delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[B_AXIS] + sq(d)) / (d * 2),
|
198
|
|
- Ynew = ((delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[C_AXIS] + HYPOT2(i, j)) / 2 - i * Xnew) / j,
|
199
|
|
- Znew = SQRT(delta_diagonal_rod_2_tower[A_AXIS] - HYPOT2(Xnew, Ynew));
|
|
197
|
+ const float Xnew = (delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[B_AXIS] + d2) * inv_d * 0.5,
|
|
198
|
+ Ynew = ((delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[C_AXIS] + sq(i) + j2) * 0.5 - i * Xnew) * inv_j,
|
|
199
|
+ Znew = SQRT(delta_diagonal_rod_2_tower[A_AXIS] - HYPOT2(Xnew, Ynew));
|
200
|
200
|
|
201
|
201
|
// Start from the origin of the old coordinates and add vectors in the
|
202
|
202
|
// old coords that represent the Xnew, Ynew and Znew to find the point
|
203
|
203
|
// in the old system.
|
204
|
204
|
cartes[X_AXIS] = delta_tower[A_AXIS][X_AXIS] + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew;
|
205
|
205
|
cartes[Y_AXIS] = delta_tower[A_AXIS][Y_AXIS] + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew;
|
206
|
|
- cartes[Z_AXIS] = z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew;
|
|
206
|
+ cartes[Z_AXIS] = z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew;
|
207
|
207
|
}
|
208
|
208
|
|
209
|
209
|
#if ENABLED(SENSORLESS_HOMING)
|