GEDPicker: Added Arc Support 07/12607/2
Caio SOUZA [Thu, 19 Sep 2013 20:54:10 +0000 (17:54 -0300)]
Change-Id: I4e60a22f2c1e2a5fd2f44d050858c97c52feb582

scilab/modules/graphic_objects/src/jni/ObjectData.i
scilab/modules/graphic_objects/src/jni/ObjectData_wrap.c
scilab/modules/gui/src/java/org/scilab/modules/gui/editor/GEDPicker.java

index bb8a783..cd09cd0 100644 (file)
@@ -213,10 +213,55 @@ int _getFecDataSize(char * uid) {
 
 %}
 
+%typemap(out) double * ARC_ULP {
+       $result = (*jenv)->NewDoubleArray(jenv, 3);
+       (*jenv)->SetDoubleArrayRegion(jenv, $result, 0, 3, $1);
+}
+
+%apply double * ARC_ULP { double * }
+%{
+
+double * getArcUpperLeftPoint(char * uid) {
+
+    double * upperLeftPoint;
+    getGraphicObjectProperty(uid, __GO_UPPER_LEFT_POINT__, jni_double_vector, (void**)&upperLeftPoint);
+    return upperLeftPoint;
+}
+
+%}
+
+%typemap(out) double * ARC_DATA {
+       $result = (*jenv)->NewDoubleArray(jenv, 4);
+       (*jenv)->SetDoubleArrayRegion(jenv, $result, 0, 4, $1);
+}
+
+%apply double * ARC_DATA { double * }
+%{
+
+double * getArcData(char * uid) {
+
+    double * data = (double *)MALLOC(sizeof(double)*4);
+       double value;
+       double * temp = &value;
+    getGraphicObjectProperty(uid, __GO_HEIGHT__, jni_double, (void**)&temp);
+       data[0] = value;
+    getGraphicObjectProperty(uid, __GO_WIDTH__, jni_double, (void**)&temp);
+       data[1] = value;
+    getGraphicObjectProperty(uid, __GO_START_ANGLE__, jni_double, (void**)&temp);
+       data[2] = value;
+    getGraphicObjectProperty(uid, __GO_END_ANGLE__, jni_double, (void**)&temp);
+       data[3] = value;
+    return data;
+}
+
+%}
+
 
 double * getChampX(char * uid);
 double * getChampY(char * uid);
 double * getArrows(char * uid);
 double * getSegsData(char * uid);
 double * getFecTriangles(char * uid);
-double * getFecData(char * uid);
\ No newline at end of file
+double * getFecData(char * uid);
+double * getArcUpperLeftPoint(char * uid);
+double * getArcData(char * uid);
\ No newline at end of file
index b6e9e0b..14f258b 100644 (file)
@@ -296,6 +296,35 @@ int _getFecDataSize(char * uid) {
 
 
 
+
+double * getArcUpperLeftPoint(char * uid) {
+
+    double * upperLeftPoint;
+    getGraphicObjectProperty(uid, __GO_UPPER_LEFT_POINT__, jni_double_vector, (void**)&upperLeftPoint);
+    return upperLeftPoint;
+}
+
+
+
+
+double * getArcData(char * uid) {
+
+    double * data = (double *)MALLOC(sizeof(double)*4);
+       double value;
+       double * temp = &value;
+    getGraphicObjectProperty(uid, __GO_HEIGHT__, jni_double, (void**)&temp);
+       data[0] = value;
+    getGraphicObjectProperty(uid, __GO_WIDTH__, jni_double, (void**)&temp);
+       data[1] = value;
+    getGraphicObjectProperty(uid, __GO_START_ANGLE__, jni_double, (void**)&temp);
+       data[2] = value;
+    getGraphicObjectProperty(uid, __GO_END_ANGLE__, jni_double, (void**)&temp);
+       data[3] = value;
+    return data;
+}
+
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -424,8 +453,52 @@ SWIGEXPORT jobject JNICALL Java_org_scilab_modules_graphic_1objects_ObjectDataJN
   }
   result = (double *)getFecData(arg1);
   {
-    jresult = (*jenv)->NewDoubleArray(jenv, _getFecDataSize(arg1));
-    (*jenv)->SetDoubleArrayRegion(jenv, jresult, 0, _getFecDataSize(arg1), result);
+    jresult = (*jenv)->NewDoubleArray(jenv, 4);
+    (*jenv)->SetDoubleArrayRegion(jenv, jresult, 0, 4, result);
+  }
+  if (arg1) (*jenv)->ReleaseStringUTFChars(jenv, jarg1, (const char *)arg1);
+  return jresult;
+}
+
+
+SWIGEXPORT jobject JNICALL Java_org_scilab_modules_graphic_1objects_ObjectDataJNI_getArcUpperLeftPoint(JNIEnv *jenv, jclass jcls, jstring jarg1) {
+  jobject jresult = 0 ;
+  char *arg1 = (char *) 0 ;
+  double *result = 0 ;
+  
+  (void)jenv;
+  (void)jcls;
+  arg1 = 0;
+  if (jarg1) {
+    arg1 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg1, 0);
+    if (!arg1) return 0;
+  }
+  result = (double *)getArcUpperLeftPoint(arg1);
+  {
+    jresult = (*jenv)->NewDoubleArray(jenv, 4);
+    (*jenv)->SetDoubleArrayRegion(jenv, jresult, 0, 4, result);
+  }
+  if (arg1) (*jenv)->ReleaseStringUTFChars(jenv, jarg1, (const char *)arg1);
+  return jresult;
+}
+
+
+SWIGEXPORT jobject JNICALL Java_org_scilab_modules_graphic_1objects_ObjectDataJNI_getArcData(JNIEnv *jenv, jclass jcls, jstring jarg1) {
+  jobject jresult = 0 ;
+  char *arg1 = (char *) 0 ;
+  double *result = 0 ;
+  
+  (void)jenv;
+  (void)jcls;
+  arg1 = 0;
+  if (jarg1) {
+    arg1 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg1, 0);
+    if (!arg1) return 0;
+  }
+  result = (double *)getArcData(arg1);
+  {
+    jresult = (*jenv)->NewDoubleArray(jenv, 4);
+    (*jenv)->SetDoubleArrayRegion(jenv, jresult, 0, 4, result);
   }
   if (arg1) (*jenv)->ReleaseStringUTFChars(jenv, jarg1, (const char *)arg1);
   return jresult;
index a14c8a8..cf43455 100644 (file)
@@ -342,9 +342,83 @@ public class GEDPicker {
     */
     boolean getArc(String obj, Integer[] position) {
 
+        double[] upperLeft = (double[])ObjectData.getArcUpperLeftPoint(obj);
+        double[] data = (double[])ObjectData.getArcData(obj);
+        double[] pos = { position[0] * 1.0, position[1] * 1.0, 0.0 };
+        double[] c2d = CallRenderer.get2dViewFromPixelCoordinates(axesUID, pos);
+        pos[0] += delta;
+        pos[1] += delta;
+        double[] c2d2 = CallRenderer.get2dViewFromPixelCoordinates(axesUID, pos);
+        Boolean fill_mode = (Boolean)GraphicController.getController().getProperty(obj, GraphicObjectProperties.__GO_FILL_MODE__);
+
+        //Calculates the selection delta based on ellipse & axes size
+        double dt = Math.sqrt(Math.pow(c2d[0] - c2d2[0], 2.0) + Math.pow(c2d[1] - c2d2[1], 2.0)) / Math.sqrt((data[0] * data[0] / 4.) / 2. + (data[1] * data[1] / 4.) / 2.);
+
+        double[] c3d1 = AxesDrawer.compute3dViewCoordinates(axes, c2d);
+        c2d[2] += 1.0;
+        double[] c3d2 = AxesDrawer.compute3dViewCoordinates(axes, c2d);
+
+        //Calculates the intersection of the click ray with the ellipse plane
+        Vector3d v0 = new Vector3d(c3d1);
+        Vector3d v1 = new Vector3d(c3d2);
+        Vector3d dir = v1.minus(v0);
+
+        if (dir.getZ() == 0) {
+            return false;
+        }
+
+        double u = upperLeft[2] - (v0.getZ() / dir.getZ());
+        Vector3d point = v0.plus(dir.times(u));
+
+        double xr = data[1] / 2.;
+        double yr = data[0] / 2.;
+
+        Vector3d center =  new Vector3d(upperLeft[0] + xr , upperLeft[1] - yr , upperLeft[2]);
+
+        //checks if the point lies within the ellipse
+        double x = point.getX() - center.getX();
+        double y = point.getY() - center.getY();
+        double v = (x * x) / (xr * xr) + (y * y) / (yr * yr);
+
+        if (v > 1.0 + dt) {
+            return false;
+        }
+
+        double angle0 = getAngle360(data[2]);
+        double angle1 = getAngle360(data[3]) + angle0;
+
+        /**
+         * Checks if the point is closer to the drawn arc
+         * and inside de given angles. If fill_mode = false
+         * it it accept 1-dt < value < 1+dt, if fill_mode = true
+         * it accept value < 1+dt;
+         */
+
+        v0 = new Vector3d(1.0, 0.0, 0.0);
+        v1 = point.minus(center);
+        double angle = Math.acos(v0.scalar(v1) / (v0.getNorm() * v1.getNorm()));
+        angle += v1.getY() < 0.0 ? Math.PI : 0.0;
+
+        if (!(angle0 == angle1) && !(angle >= angle0 && angle <= angle1)) {
+            return false;
+        }
+
+        if (fill_mode) {
+            return true;
+        } else if (v > 1.0 - dt) {
+            return true;
+        }
+
         return false;
     }
 
+    double getAngle360(double a) {
+        while (a > 2 * Math.PI) {
+            a -= 2 * Math.PI;
+        }
+        return a;
+    }
+
     /**
      * Champ picker, given a champ object it checks if the click
      * was over it