this increases timings a little bit (including in the unrotated case), but
correct is much better than fast in this case
---
 src/emc/rs274ngc/gcodemodule.cc |   47 ++++++++++++++++++++++----------------
 1 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/src/emc/rs274ngc/gcodemodule.cc b/src/emc/rs274ngc/gcodemodule.cc
index 051bbe1..7a4a7d7 100644
--- a/src/emc/rs274ngc/gcodemodule.cc
+++ b/src/emc/rs274ngc/gcodemodule.cc
@@ -846,6 +846,12 @@ static bool get_attr(PyObject *o, const char *attr_name, 
const char *fmt, ...) {
     return result;
 }
 
+static void unrotate(double &x, double &y, double c, double s) {
+    double tx = x * c + y * s;
+    y = -x * s + y * c;
+    x = tx;
+}
+
 static void rotate(double &x, double &y, double c, double s) {
     double tx = x * c - y * s;
     y = x * s + y * c;
@@ -880,31 +886,29 @@ static PyObject *rs274_arc_to_segments(PyObject *self, 
PyObject *args) {
     if(!get_attr(canon, "offset_w", &offset[8])) return NULL;
 
     if(plane == 1) {
-        rotate(x1, y1, rotation_cos, rotation_sin);
-        rotate(cx, cy, rotation_cos, rotation_sin);
-        n[0] = x1 + offset[0];
-        n[1] = y1 + offset[1];
-        n[2] = z1 + offset[2];
+        n[0] = x1;
+        n[1] = y1;
+        n[2] = z1;
         X=0; Y=1; Z=2;
     } else if(plane == 3) {
-        n[0] = y1 + offset[0];
-        n[1] = z1 + offset[1];
-        n[2] = x1 + offset[2];
+        n[0] = y1;
+        n[1] = z1;
+        n[2] = x1;
         X=2; Y=0; Z=1;
     } else {
-        n[0] = z1 + offset[0];
-        n[1] = x1 + offset[1];
-        n[2] = y1 + offset[2];
+        n[0] = z1;
+        n[1] = x1;
+        n[2] = y1;
         X=1; Y=2; Z=0;
     }
-    cx += offset[X];
-    cy += offset[Y];
-    n[3] = a + offset[3];
-    n[4] = b + offset[4];
-    n[5] = c + offset[5];
-    n[6] = u + offset[6];
-    n[7] = v + offset[7];
-    n[8] = w + offset[8];
+    n[3] = a;
+    n[4] = b;
+    n[5] = c;
+    n[6] = u;
+    n[7] = v;
+    n[8] = w;
+    for(int ax=0; ax<9; ax++) o[ax] -= offset[ax];
+    unrotate(o[0], o[1], rotation_cos, rotation_sin);
 
     double rad = hypot(o[X]-cx, o[Y]-cy);
     double theta1 = atan2(o[Y]-cy, o[X]-cx);
@@ -936,10 +940,13 @@ static PyObject *rs274_arc_to_segments(PyObject *self, 
PyObject *args) {
         p[6] = o[6] + d[6] * f;
         p[7] = o[7] + d[7] * f;
         p[8] = o[8] + d[8] * f;
-
+        rotate(p[0], p[1], rotation_cos, rotation_sin);
+        for(int ax=0; ax<9; ax++) p[ax] += offset[ax];
         PyList_SET_ITEM(segs, i,
             Py_BuildValue("ddddddddd", p[0], p[1], p[2], p[3], p[4], p[5], 
p[6], p[7], p[8]));
     }
+    for(int ax=0; ax<9; ax++) n[ax] += offset[ax];
+    rotate(n[0], n[1], rotation_cos, rotation_sin);
     PyList_SET_ITEM(segs, steps,
         Py_BuildValue("ddddddddd", n[0], n[1], n[2], n[3], n[4], n[5], n[6], 
n[7], n[8]));
     return segs;
-- 
1.6.3.3


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Emc-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-developers

Reply via email to