@@ -18,6 +18,9 @@ typedef exprtk::parser<double> parser;
1818
1919std::string jstring2string (JNIEnv *env, jstring jStr);
2020
21+ template <typename T>
22+ void removeAlternatingPairs (std::vector<T> &vec);
23+
2124extern " C"
2225JNIEXPORT jfloatArray JNICALL
2326Java_org_nsh07_simplygraph_NativeBridge_calculateGraphPoints (
@@ -101,7 +104,7 @@ Java_org_nsh07_simplygraph_NativeBridge_calculateGraphPoints(
101104 }
102105 }
103106 } else if (!hasX && !hasY) {
104- std::string preEqual = functionStr.substr (0 , equalsPos - 1 );
107+ std::string preEqual = functionStr.substr (0 , equalsPos);
105108 bool isPolar = (equalsPos != std::string::npos) && (trim (preEqual) == " r" );
106109
107110 if (isPolar) {
@@ -212,7 +215,7 @@ Java_org_nsh07_simplygraph_NativeBridge_calculateGraphPoints(
212215
213216 std::string lhs, rhs;
214217
215- lhs = functionStr.substr (0 , equalsPos - 1 );
218+ lhs = functionStr.substr (0 , equalsPos);
216219 rhs = functionStr.substr (equalsPos + 1 );
217220
218221 lhsParser.compile (lhs, lhsExpression);
@@ -241,16 +244,16 @@ Java_org_nsh07_simplygraph_NativeBridge_calculateGraphPoints(
241244 }
242245 }
243246
244- if (points.size () < 100000 ) { // Avoids out of memory errors in very dense graphs
245- jfloatArray jpoints = env->NewFloatArray (jsize (points.size ()));
246- if (jpoints != nullptr ) {
247- env->SetFloatArrayRegion (jpoints, 0 , jsize (points.size ()), points.data ());
248- }
247+ while (points.size () > 100000 ) {
248+ removeAlternatingPairs (points);
249+ }
249250
250- return jpoints;
251+ jfloatArray jpoints = env->NewFloatArray (jsize (points.size ()));
252+ if (jpoints != nullptr ) {
253+ env->SetFloatArrayRegion (jpoints, 0 , jsize (points.size ()), points.data ());
251254 }
252255
253- return jfloatArray () ;
256+ return jpoints ;
254257}
255258
256259std::string jstring2string (JNIEnv *env, jstring jStr) {
@@ -259,4 +262,23 @@ std::string jstring2string(JNIEnv *env, jstring jStr) {
259262 std::string str = convertedValue;
260263 (env)->ReleaseStringUTFChars (jStr, convertedValue);
261264 return str;
265+ }
266+
267+ template <typename T>
268+ void removeAlternatingPairs (std::vector<T> &vec) {
269+ std::vector<T> result;
270+ long i = 0 ;
271+ long n = vec.size ();
272+
273+ while (i < n) {
274+ // Copy two elements (i.e., keep them)
275+ for (int j = 0 ; j < 2 && i < n; ++j, ++i) {
276+ result.push_back (vec[i]);
277+ }
278+
279+ // Skip next two elements (i.e., remove them)
280+ i += 2 ;
281+ }
282+
283+ vec = std::move (result); // Replace original vector with filtered one
262284}
0 commit comments