From 7ffaabcda48f384625fc365c01ea3d3ed5c702f8 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 30 Nov 2022 13:12:48 +0100 Subject: [PATCH 1/2] [#1679] Render finset even if zero length --- .../sf/openrocket/gui/figure3d/geometry/FinRenderer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java index a8098964e..fa40f5a8a 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java @@ -81,7 +81,7 @@ public class FinRenderer { GLU.gluTessCallback(tess, GLU.GLU_TESS_COMBINE, cb); // fin side: +z - if (finSet.getSpan() > 0 && finSet.getLength() > 0 && which == Surface.INSIDE) { // Right side + if (finSet.getSpan() > 0 && which == Surface.INSIDE) { // Right side GLU.gluTessBeginPolygon(tess, null); GLU.gluTessBeginContour(tess); gl.glNormal3f(0, 0, 1); @@ -110,7 +110,7 @@ public class FinRenderer { } // fin side: -z - if (finSet.getSpan() > 0 && finSet.getLength() > 0 && which == Surface.OUTSIDE) { // Left side + if (finSet.getSpan() > 0 && which == Surface.OUTSIDE) { // Left side GLU.gluTessBeginPolygon(tess, null); GLU.gluTessBeginContour(tess); gl.glNormal3f(0, 0, -1); @@ -142,7 +142,7 @@ public class FinRenderer { GLU.gluDeleteTess(tess); // Fin strip around the edge - if (finSet.getSpan() > 0 && finSet.getLength() > 0 && which == Surface.EDGES) { + if (finSet.getSpan() > 0 && which == Surface.EDGES) { if (!(finSet instanceof EllipticalFinSet)) gl.glShadeModel(GLLightingFunc.GL_FLAT); gl.glBegin(GL.GL_TRIANGLE_STRIP); From 458a5a0605d52a10a396bc73b1dd1ed7a64d6ee7 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 30 Nov 2022 15:15:04 +0100 Subject: [PATCH 2/2] Catch bug of negative fin area weight --- core/src/net/sf/openrocket/rocketcomponent/FinSet.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java index 45e0b2a1d..0dc515dea 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java @@ -644,7 +644,7 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona // calculate marginal area final double delta_x = (cur.x - prev.x); - final double y_avg = (cur.y + prev.y)*0.5; + final double y_avg = (cur.y + prev.y)*0.5; // TODO: MEDIUM: what if one of the points is below the x-axis? (can produce negative area) double area_increment = delta_x*y_avg; if( MathUtil.equals( 0, area_increment)){ prev = cur; @@ -662,6 +662,11 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona prev=cur; } + + // Negative weight => make positive. TODO: This is NOT a correct solution, but at least it won't throw an exception... + if (centroidSum.weight < 0) { + centroidSum = new Coordinate(centroidSum.x, -centroidSum.y, centroidSum.z, Math.abs(centroidSum.weight)); + } return centroidSum; }