Skip to content

Commit 661cd30

Browse files
committed
Graphs with a large number of points are now drawn with reduced resolution
1 parent 40af082 commit 661cd30

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

app/src/main/cpp/native-lib.cpp

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ typedef exprtk::parser<double> parser;
1818

1919
std::string jstring2string(JNIEnv *env, jstring jStr);
2020

21+
template<typename T>
22+
void removeAlternatingPairs(std::vector<T> &vec);
23+
2124
extern "C"
2225
JNIEXPORT jfloatArray JNICALL
2326
Java_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

256259
std::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

Comments
 (0)