print Triangle errors, instead of exiting

This commit is contained in:
Hannes Janetzek
2013-03-09 12:13:44 +01:00
parent 68e7bf863d
commit 51d2a845a0
3 changed files with 283 additions and 2029 deletions

View File

@@ -1,9 +1,10 @@
LOCAL_PATH:= $(call my-dir) LOCAL_PATH:= $(call my-dir)
# APP_OPTIM := debug
include $(CLEAR_VARS) include $(CLEAR_VARS)
# TRILIBDEFS = -DTRILIBRARY -DREDUCED -DCDT_ONLY # TRILIBDEFS = -DTRILIBRARY -DREDUCED -DCDT_ONLY
LOCAL_CFLAGS := -O -DTRILIBRARY -DREDUCED -DCDT_ONLY -DNO_TIMER -Werror LOCAL_CFLAGS := -O -DTRILIBRARY -DREDUCED -DCDT_ONLY -DNO_TIMER -Werror -std=c99
# -DLINUX -> no fpu_control in bionic, needed ? # -DLINUX -> no fpu_control in bionic, needed ?
LOCAL_MODULE := triangle-jni LOCAL_MODULE := triangle-jni

View File

@@ -1,15 +1,12 @@
#include <jni.h> #include <jni.h>
#include <android/log.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "triangle.h" #include "triangle.h"
static void mylog(const char *msg) #include <android/log.h>
{ #define printf(...) __android_log_print(ANDROID_LOG_DEBUG, "Triangle", __VA_ARGS__)
__android_log_write(ANDROID_LOG_INFO,"triangle", msg);
}
// from www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html // from www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
#if 0 #if 0
@@ -29,62 +26,52 @@ int pnpoly(int nvert, float *vert, float testx, float testy)
//#define TESTING //#define TESTING
int int compare_dups(const void *a, const void *b) {
compare_dups (const void *a, const void *b) int da = *((const int*) a);
{ int db = *((const int*) b);
int da = *((const int*)a);
int db = *((const int*)b);
return (da > db) - (da < db); return (da > db) - (da < db);
} }
typedef struct triangulateio TriangleIO; typedef struct triangulateio TriangleIO;
jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c, jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
jobject point_buf, jobject point_buf, jint num_rings, jobject indice_buf, jint offset) {
jint num_rings, jfloat* points = (jfloat*) (*env)->GetDirectBufferAddress(env, point_buf);
jobject indice_buf, jshort* indices = (jshort*) (*env)->GetDirectBufferAddress(env, indice_buf);
jint offset)
{
jfloat* points = (jfloat*)(*env)->GetDirectBufferAddress(env, point_buf);
jshort* indices = (jshort*)(*env)->GetDirectBufferAddress(env, indice_buf);
TriangleIO in, out; TriangleIO in, out;
char buf[128]; char buf[128];
int i, j;
memset(&in, 0, sizeof(TriangleIO)); memset(&in, 0, sizeof(TriangleIO));
//int num_points = (indices[0])>>1; //int num_points = (indices[0])>>1;
in.numberofpoints = (indices[0])>>1; in.numberofpoints = (indices[0]) >> 1;
in.pointlist = (float *) points; in.pointlist = (float *) points;
// check if explicitly closed // check if explicitly closed
if (in.pointlist[0] == in.pointlist[indices[1]-2] && if (in.pointlist[0] == in.pointlist[indices[1] - 2]
in.pointlist[1] == in.pointlist[indices[1]-1]) && in.pointlist[1] == in.pointlist[indices[1] - 1]) {
{
int point = 0; int point = 0;
for (i = 0; i < num_rings; i++) for (int i = 0; i < num_rings; i++) {
{
// remove last point in ring // remove last point in ring
indices[i+1] -= 2; indices[i + 1] -= 2;
int last = point + indices[i+1] >> 1; int last = point + (indices[i + 1] >> 1);
//sprintf(buf, "drop closing point at %d, %d:\n", point, last); //sprintf(buf, "drop closing point at %d, %d:\n", point, last);
//mylog(buf); //mylog(buf);
if (in.numberofpoints - last > 1) if (in.numberofpoints - last > 1)
memmove(in.pointlist + (last * 2), memmove(in.pointlist + (last * 2),
in.pointlist + ((last + 1)*2), in.pointlist + ((last + 1) * 2),
(in.numberofpoints - last - 1) (in.numberofpoints - last - 1) * 2 * sizeof(float));
* 2 * sizeof(float));
in.numberofpoints--; in.numberofpoints--;
point = last; point = last;
} }
} }
int dups = 0; int dups = 0;
float *i_points = points; float *i_points = points;
@@ -92,19 +79,16 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
// check for duplicate vertices and keep a list // check for duplicate vertices and keep a list
// of dups and the first occurence // of dups and the first occurence
for (i = 0; i < in.numberofpoints - 1; i++) for (int i = 0; i < in.numberofpoints - 1; i++) {
{
float x = *i_points++; float x = *i_points++;
float y = *i_points++; float y = *i_points++;
float *j_points = i_points; float *j_points = i_points;
for (j = i + 1; j < in.numberofpoints; j++, j_points += 2) for (int j = i + 1; j < in.numberofpoints; j++, j_points += 2) {
{ if ((*j_points == x) && (*(j_points + 1) == y)) {
if ((*j_points == x) && (*(j_points+1) == y))
{
skip_list = realloc(skip_list, (dups + 2) * 2 * sizeof(int)); skip_list = realloc(skip_list, (dups + 2) * 2 * sizeof(int));
skip_list[dups*2+0] = j; skip_list[dups * 2 + 0] = j;
skip_list[dups*2+1] = i; skip_list[dups * 2 + 1] = i;
dups++; dups++;
} }
} }
@@ -112,19 +96,16 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
#ifdef TESTING #ifdef TESTING
for (i = 0; i < in.numberofpoints; i++) { for (i = 0; i < in.numberofpoints; i++) {
sprintf(buf, "point: %f, %f\n", points[i*2], points[i*2+1]); printf("point: %f, %f\n", points[i*2], points[i*2+1]);
mylog(buf);
} }
sprintf(buf, "points: %d, rings: %d\n", in.numberofpoints, num_rings); printf("points: %d, rings: %d\n", in.numberofpoints, num_rings);
mylog(buf);
#endif #endif
in.segmentlist = (int *) malloc(in.numberofpoints * 2 * sizeof(int)); in.segmentlist = (int *) malloc(in.numberofpoints * 2 * sizeof(int));
in.numberofsegments = in.numberofpoints; in.numberofsegments = in.numberofpoints;
in.numberofholes = num_rings - 1; in.numberofholes = num_rings - 1;
int *rings = NULL; int *rings = NULL;
if (in.numberofholes > 0) if (in.numberofholes > 0) {
{
in.holelist = (float *) malloc(in.numberofholes * 2 * sizeof(float)); in.holelist = (float *) malloc(in.numberofholes * 2 * sizeof(float));
rings = (int*) malloc(num_rings * sizeof(int)); rings = (int*) malloc(num_rings * sizeof(int));
} }
@@ -138,10 +119,9 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
int ring; int ring;
// assign all points to segments for each ring // assign all points to segments for each ring
for (ring = 0, point = 0; ring < num_rings; ring++, point++) for (ring = 0, point = 0; ring < num_rings; ring++, point++) {
{
int len; int len;
int num_points = indices[ring+1] >> 1; int num_points = indices[ring + 1] >> 1;
if (rings) if (rings)
rings[ring] = num_points; rings[ring] = num_points;
@@ -151,8 +131,7 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
// 'parallel' lines have a distance of at least // 'parallel' lines have a distance of at least
// 1 unit. you'll notice when things went wrong // 1 unit. you'll notice when things went wrong
// when the hole is rendered instead of the poly // when the hole is rendered instead of the poly
if (ring > 0) if (ring > 0) {
{
int k = point * 2; int k = point * 2;
float nx = in.pointlist[k++]; float nx = in.pointlist[k++];
@@ -161,8 +140,7 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
float cx, cy, vx, vy; float cx, cy, vx, vy;
// try to find a large enough segment // try to find a large enough segment
for (len = (point + num_points) * 2; k < len;) for (len = (point + num_points) * 2; k < len;) {
{
cx = nx; cx = nx;
cy = ny; cy = ny;
@@ -176,7 +154,7 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
break; break;
} }
float a = sqrt(vx*vx + vy*vy); float a = sqrt(vx * vx + vy * vy);
float ux = -vy / a; float ux = -vy / a;
float uy = vx / a; float uy = vx / a;
@@ -193,118 +171,98 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
*seg++ = last; *seg++ = last;
*seg++ = point; *seg++ = point;
for (len = point + num_points - 1; point < len; point++) for (len = point + num_points - 1; point < len; point++) {
{
*seg++ = point; *seg++ = point;
*seg++ = point + 1; *seg++ = point + 1;
} }
} }
if (dups) if (dups) {
{
for (i = 0; i < dups; i++) for (int i = 0; i < dups; i++) {
{ printf("duplicate points at %d, %d: %f,%f\n",
sprintf(buf, "duplicate points at %d, %d: %f,%f\n",
skip_list[i*2], skip_list[i*2+1], skip_list[i*2], skip_list[i*2+1],
in.pointlist[skip_list[i*2+1]*2], in.pointlist[skip_list[i*2+1]*2],
in.pointlist[skip_list[i*2+1]*2+1]); in.pointlist[skip_list[i*2+1]*2+1]);
mylog(buf);
} }
// print poly format to check with triangle/showme
for (int j = 0; j < in.numberofpoints; j++)
printf("%d %f %f\n", j, in.pointlist[j*2], in.pointlist[j*2+1]);
if (dups == 2) seg = in.segmentlist;
{ for (int j = 0; j < in.numberofsegments; j++, seg += 2)
if (skip_list[0] > skip_list[2]) printf("%d %d %d\n", j, *seg, *(seg+1));
{
if (0) {
free(in.segmentlist);
free(in.holelist);
free(rings);
free(skip_list);
return 0;
}
if (dups == 2) {
if (skip_list[0] > skip_list[2]) {
int tmp = skip_list[0]; int tmp = skip_list[0];
skip_list[0] = skip_list[2]; skip_list[0] = skip_list[2];
skip_list[2] = tmp;
tmp = skip_list[1]; tmp = skip_list[1];
skip_list[1] = skip_list[3]; skip_list[1] = skip_list[3];
skip_list[3] = tmp;
sprintf(buf, "flip items\n"); printf("flip items\n");
mylog(buf);
} }
} } else if (dups > 2) {
else if (dups > 2) printf("sort dups\n");
{
sprintf(buf, "sort dups\n");
mylog(buf);
qsort (skip_list, dups, 2 * sizeof (float), compare_dups); qsort(skip_list, dups, 2 * sizeof(float), compare_dups);
} }
// shift segment indices while removing duplicate points // shift segment indices while removing duplicate points
for (i = 0; i < dups; i++) for (int i = 0; i < dups; i++) {
{
// position of the duplicate vertex // position of the duplicate vertex
int pos = skip_list[i*2] - i; int pos = skip_list[i * 2] - i;
// first vertex // first vertex
int replacement = skip_list[i*2+1]; int replacement = skip_list[i * 2 + 1];
sprintf(buf, "add offset: %d, from pos %d\n", i, pos); printf("add offset: %d, from pos %d\n", i, pos);
mylog(buf); seg = in.segmentlist;
for (int j = 0; j < in.numberofsegments * 2;
for (seg = in.segmentlist, j = 0; j < in.numberofsegments*2; j++, seg++) j++, seg++) {
{ if (*seg == pos) {
if (*seg == pos)
{
if (replacement >= pos) if (replacement >= pos)
*seg = replacement - i; *seg = replacement - i;
else else
*seg = replacement; *seg = replacement;
} } else if (*seg > pos)
else if(*seg > pos)
*seg -= 1; *seg -= 1;
} }
sprintf(buf, "move %d %d %d\n", pos, pos + 1, printf("move %d %d %d\n", pos, pos + 1, in.numberofpoints - pos - 1);
in.numberofpoints - pos - 1);
mylog(buf);
if (in.numberofpoints - pos > 1) if (in.numberofpoints - pos > 1)
memmove(in.pointlist + (pos * 2), memmove(in.pointlist + (pos * 2),
in.pointlist + ((pos + 1)*2), in.pointlist + ((pos + 1) * 2),
(in.numberofpoints - pos - 1) * 2 * sizeof(float)); (in.numberofpoints - pos - 1) * 2 * sizeof(float));
in.numberofpoints--; in.numberofpoints--;
// print poly format to check with triangle/showme
for (j = 0; j < in.numberofpoints; j++)
{
sprintf(buf, "%d %f %f\n", j,
in.pointlist[j*2],
in.pointlist[j*2+1]);
mylog(buf);
} }
for (int j = 0; j < in.numberofholes; j++) {
seg = in.segmentlist; printf("%d %f %f\n", j, in.holelist[j*2], in.holelist[j*2+1]);
for (j = 0; j < in.numberofsegments; j++, seg+=2)
{
sprintf(buf, "%d %d %d\n",
j, *seg, *(seg+1));
mylog(buf);
}
}
for (j = 0; j < in.numberofholes; j++)
{
sprintf(buf, "%d %f %f\n", j,
in.holelist[j*2], in.holelist[j*2+1]);
mylog(buf);
} }
} }
#ifdef TESTING #ifdef TESTING
for (i = 0; i < in.numberofsegments; i++) for (i = 0; i < in.numberofsegments; i++)
{ {
sprintf(buf, "segment: %d, %d\n", printf("segment: %d, %d\n",
in.segmentlist[i*2], in.segmentlist[i*2+1]); in.segmentlist[i*2], in.segmentlist[i*2+1]);
mylog(buf);
} }
for (i = 0; i < in.numberofholes; i++) for (i = 0; i < in.numberofholes; i++)
{ {
sprintf(buf, "hole: %f, %f\n", printf("hole: %f, %f\n",
in.holelist[i*2], in.holelist[i*2+1]); in.holelist[i*2], in.holelist[i*2+1]);
mylog(buf);
} }
#endif #endif
@@ -319,11 +277,18 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
// Q - be quiet! // Q - be quiet!
triangulate("pzPNBQ", &in, &out, (TriangleIO *) NULL); triangulate("pzPNBQ", &in, &out, (TriangleIO *) NULL);
if (in.numberofpoints < out.numberofpoints) if (in.numberofpoints < out.numberofpoints) {
{ printf(
sprintf(buf, "polygon input is bad! points in:%d out%d\n", "polygon input is bad! points in:%d out%d\n", in.numberofpoints, out.numberofpoints);
in.numberofpoints, out.numberofpoints);
mylog(buf); for (int j = 0; j < in.numberofpoints; j++) {
printf("%d %f %f\n", j, in.pointlist[j*2], in.pointlist[j*2+1]);
}
seg = in.segmentlist;
for (int j = 0; j < in.numberofsegments; j++, seg += 2) {
printf("%d %d %d\n", j, *seg, *(seg+1));
}
free(in.segmentlist); free(in.segmentlist);
free(in.holelist); free(in.holelist);
@@ -331,32 +296,27 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
return 0; return 0;
} }
#ifdef TESTING #ifdef TESTING
sprintf(buf, "triangles: %d\n", out.numberoftriangles); printf( "triangles: %d\n", out.numberoftriangles);
mylog(buf);
for (i = 0; i < out.numberoftriangles; i++) for (int i = 0; i < out.numberoftriangles; i++)
{ {
sprintf(buf, "> %d, %d, %d\n",out.trianglelist[i*3], printf("> %d, %d, %d\n",out.trianglelist[i*3],
out.trianglelist[i*3+1], out.trianglelist[i*3+1],
out.trianglelist[i*3+2]); out.trianglelist[i*3+2]);
mylog(buf);
} }
#endif #endif
INDICE *tri; INDICE *tri;
int n, m;
/* shift back indices from removed duplicates */ /* shift back indices from removed duplicates */
for (i = 0; i < dups; i++) for (int i = 0; i < dups; i++) {
{ int pos = skip_list[i * 2] + i;
int pos = skip_list[i*2] + i;
tri = out.trianglelist; tri = out.trianglelist;
n = out.numberoftriangles * 3; int n = out.numberoftriangles * 3;
for (;n-- > 0; tri++) for (; n-- > 0; tri++)
if (*tri >= pos) if (*tri >= pos)
*tri += 1; *tri += 1;
} }
@@ -370,24 +330,23 @@ jint Java_org_oscim_jni_TriangleJNI_triangulate(JNIEnv *env, jclass c,
offset = 0; offset = 0;
tri = out.trianglelist; tri = out.trianglelist;
for (n = out.numberoftriangles * 3; n > 0; n--) for (int n = out.numberoftriangles * 3; n > 0; n--)
*tri++ = *tri * stride + offset; *tri++ = *tri * stride + offset;
// when a ring has an odd number of points one (or rather two) // when a ring has an odd number of points one (or rather two)
// additional vertices will be added. so the following rings // additional vertices will be added. so the following rings
// needs extra offset... // needs extra offset...
int start = offset; int start = offset;
for (j = 0, m = in.numberofholes; j < m; j++) for (int j = 0, m = in.numberofholes; j < m; j++) {
{
start += rings[j] * stride; start += rings[j] * stride;
// even number of points? // even number of points?
if (!(rings[j] & 1)) if (!(rings[j] & 1))
continue; continue;
tri = out.trianglelist; tri = out.trianglelist;
n = out.numberoftriangles * 3; int n = out.numberoftriangles * 3;
for (;n-- > 0; tri++) for (; n-- > 0; tri++)
if (*tri >= start) if (*tri >= start)
*tri += stride; *tri += stride;

File diff suppressed because it is too large Load Diff