[fixes #565] Fixes display of canted fins

This commit is contained in:
Daniel_M_Williams 2020-02-16 14:14:16 -05:00
parent d23d25ed15
commit 465989f837
2 changed files with 45 additions and 129 deletions

View File

@ -71,7 +71,7 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
/** /**
* Rotation about the x-axis by 2*PI/fins. * Rotation about the x-axis by 2*PI/fins.
*/ */
private Transformation finRotation = Transformation.IDENTITY; private Transformation finRotationIncrement = Transformation.IDENTITY;
/** /**
@ -164,13 +164,13 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
n = 8; n = 8;
finCount = n; finCount = n;
finRotation = Transformation.rotate_x(2 * Math.PI / finCount); finRotationIncrement = Transformation.rotate_x(2 * Math.PI / finCount);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
public Transformation getFinRotationTransformation() { public Transformation getFinRotationTransformation() {
return finRotation; return finRotationIncrement;
} }
@Override @Override
@ -210,19 +210,16 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
if (MathUtil.equals(clampedCant, this.cantRadians)) if (MathUtil.equals(clampedCant, this.cantRadians))
return; return;
this.cantRadians = clampedCant; this.cantRadians = clampedCant;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
public Transformation getCantRotation() { public Transformation getCantRotation() {
if (cantRotation == null) { if( null == cantRotation ) {
if (MathUtil.equals(this.cantRadians, 0)) { if (MathUtil.equals(this.cantRadians, 0)) {
cantRotation = Transformation.IDENTITY; cantRotation = Transformation.IDENTITY;
} else { } else {
Transformation t = new Transformation(-length / 2, 0, 0); cantRotation = Transformation.rotate_y(cantRadians);
t = Transformation.rotate_y(cantRadians).applyTransformation(t);
t = new Transformation(length / 2, 0, 0).applyTransformation(t);
cantRotation = t;
} }
} }
return cantRotation; return cantRotation;
@ -944,6 +941,13 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
if (MathUtil.equals(reducedAngle, firstFinOffsetRadians)) if (MathUtil.equals(reducedAngle, firstFinOffsetRadians))
return; return;
firstFinOffsetRadians = reducedAngle; firstFinOffsetRadians = reducedAngle;
if (MathUtil.equals(this.firstFinOffsetRadians, 0)) {
baseRotation = Transformation.IDENTITY;
} else {
baseRotation = Transformation.rotate_x(firstFinOffsetRadians);
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
@ -1024,7 +1028,7 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
protected List<RocketComponent> copyFrom(RocketComponent c) { protected List<RocketComponent> copyFrom(RocketComponent c) {
FinSet src = (FinSet) c; FinSet src = (FinSet) c;
this.finCount = src.finCount; this.finCount = src.finCount;
this.finRotation = src.finRotation; this.finRotationIncrement = src.finRotationIncrement;
this.firstFinOffsetRadians = src.firstFinOffsetRadians; this.firstFinOffsetRadians = src.firstFinOffsetRadians;
this.cantRadians = src.cantRadians; this.cantRadians = src.cantRadians;
this.cantRotation = src.cantRotation; this.cantRotation = src.cantRotation;
@ -1230,20 +1234,20 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
checkState(); checkState();
final double bodyRadius = this.getBodyRadius(); final double bodyRadius = this.getBodyRadius();
// already includes the base rotation
final double[] angles = getInstanceAngles(); final double[] angles = getInstanceAngles();
final Transformation localCantRotation = getCantRotation(); final Transformation localCantRotation = new Transformation(length / 2, 0, 0)
.applyTransformation(getCantRotation())
.applyTransformation(new Transformation(-length / 2, 0, 0));
Coordinate[] toReturn = new Coordinate[finCount]; Coordinate[] toReturn = new Coordinate[finCount];
for (int instanceNumber = 0; instanceNumber < finCount; instanceNumber++) { for (int instanceNumber = 0; instanceNumber < finCount; instanceNumber++) {
final double curY = bodyRadius * Math.cos(angles[instanceNumber]); final Coordinate raw = new Coordinate( 0, bodyRadius, 0);
final double curZ = bodyRadius * Math.sin(angles[instanceNumber]); final Coordinate canted = localCantRotation.transform(raw);
final Coordinate rotated = Transformation.rotate_x(angles[instanceNumber]).transform(canted);
final Coordinate naiveLocation = new Coordinate(0, curY, curZ); toReturn[instanceNumber] = rotated;
final Coordinate adjustedLocation = baseRotation.transform(localCantRotation.transform( naiveLocation));
toReturn[instanceNumber] = adjustedLocation;
} }
return toReturn; return toReturn;

View File

@ -30,7 +30,7 @@ public class FinSetShapes extends RocketComponentShape {
*/ */
final Transformation cantRotation = finset.getCantRotation(); final Transformation cantRotation = finset.getCantRotation();
final Transformation compositeTransform = cantRotation.applyTransformation( transformation); final Transformation compositeTransform = transformation.applyTransformation(cantRotation);
Coordinate finPoints[] = finset.getFinPoints(); Coordinate finPoints[] = finset.getFinPoints();
Coordinate tabPoints[] = finset.getTabPoints(); Coordinate tabPoints[] = finset.getTabPoints();
@ -117,47 +117,37 @@ public class FinSetShapes extends RocketComponentShape {
return new Shape[]{p}; return new Shape[]{p};
} }
// TODO: LOW: Jagged shapes from back draw incorrectly.
private static Shape[] cantedShapesBack(FinSet finset, private static Shape[] cantedShapesBack(FinSet finset,
Transformation transformation) { Transformation transformation) {
int i;
int fins = finset.getFinCount();
double thickness = finset.getThickness();
Transformation cantRotation = finset.getCantRotation(); double thickness = finset.getThickness();
Coordinate[] sidePoints; Coordinate[] sidePoints;
Coordinate[] backPoints; Coordinate[] backPoints;
int maxIndex; int maxIndex;
Coordinate[] points = finset.getFinPoints(); Coordinate[] points = finset.getFinPoints();
// this loop finds the index @ max-y, as visible from the back
for (maxIndex = points.length-1; maxIndex > 0; maxIndex--) { for (maxIndex = points.length-1; maxIndex > 0; maxIndex--) {
if (points[maxIndex-1].y < points[maxIndex].y) if (points[maxIndex-1].y < points[maxIndex].y)
break; break;
} }
points = cantRotation.transform( points ); Transformation cantTransform = finset.getCantRotation();
// transformPoints(points,new Transformation(0,radius,0)); final Transformation compositeTransform = transformation.applyTransformation(cantTransform);
points = transformation.transform( points );
sidePoints = new Coordinate[points.length]; sidePoints = new Coordinate[points.length];
backPoints = new Coordinate[2*(points.length-maxIndex)]; backPoints = new Coordinate[2*(points.length-maxIndex)];
double sign; double sign = Math.copySign(1.0, finset.getCantAngle());
if (finset.getCantAngle() > 0) {
sign = 1.0;
} else {
sign = -1.0;
}
// Calculate points for the side panel // Calculate points for the visible side panel
for (i=0; i < points.length; i++) { for (int i=0; i < points.length; i++) {
sidePoints[i] = points[i].add(0,0,sign*thickness/2); sidePoints[i] = points[i].add(0,0,sign*thickness/2);
} }
// Calculate points for the back portion // Calculate points for the back portion
i=0; int i=0;
for (int j=points.length-1; j >= maxIndex; j--, i++) { for (int j=points.length-1; j >= maxIndex; j--, i++) {
backPoints[i] = points[j].add(0,0,sign*thickness/2); backPoints[i] = points[j].add(0,0,sign*thickness/2);
} }
@ -168,35 +158,24 @@ public class FinSetShapes extends RocketComponentShape {
// Generate shapes // Generate shapes
Shape[] s; Shape[] s;
if (thickness > 0.0005) { if (thickness > 0.0005) {
s = new Shape[2];
s = new Shape[fins*2]; s[0] = makePolygonBack(sidePoints,compositeTransform);
for (int fin=0; fin<fins; fin++) { s[1] = makePolygonBack(backPoints,compositeTransform);
s[2*fin] = makePolygonBack(sidePoints,finset,transformation);
s[2*fin+1] = makePolygonBack(backPoints,finset,transformation);
}
} else { } else {
s = new Shape[1];
s = new Shape[fins]; s[0] = makePolygonBack(sidePoints,compositeTransform);
for (int fin=0; fin<fins; fin++) {
s[fin] = makePolygonBack(sidePoints,finset,transformation);
}
} }
return s; return s;
} }
private static Shape makePolygonBack(Coordinate[] array, FinSet finset, final Transformation t) { private static Shape makePolygonBack(Coordinate[] array, final Transformation t) {
Path2D.Float p; Path2D.Float p;
Coordinate compCenter = t.transform(Coordinate.ZERO);
// Make polygon // Make polygon
p = new Path2D.Float(); p = new Path2D.Float();
for (int i=0; i < array.length; i++) { for (int i=0; i < array.length; i++) {
Coordinate a = t.transform(compCenter.add( array[i]) ); Coordinate a = t.transform(array[i] );
if (i==0) if (i==0)
p.moveTo(a.z, a.y); p.moveTo(a.z, a.y);
else else
@ -206,71 +185,4 @@ public class FinSetShapes extends RocketComponentShape {
return p; return p;
} }
/* Side painting with thickness:
Coordinate c[] = new Coordinate[8];
c[0]=new Coordinate(0-position*rootChord,radius,thickness/2);
c[1]=new Coordinate(rootChord-position*rootChord,radius,thickness/2);
c[2]=new Coordinate(sweep+tipChord-position*rootChord,height+radius,thickness/2);
c[3]=new Coordinate(sweep-position*rootChord,height+radius,thickness/2);
c[4]=new Coordinate(0-position*rootChord,radius,-thickness/2);
c[5]=new Coordinate(rootChord-position*rootChord,radius,-thickness/2);
c[6]=new Coordinate(sweep+tipChord-position*rootChord,height+radius,-thickness/2);
c[7]=new Coordinate(sweep-position*rootChord,height+radius,-thickness/2);
if (rotation != 0) {
rot = Transformation.rotate_x(rotation);
for (int i=0; i<8; i++)
c[i] = rot.transform(c[i]);
}
Shape[] s = new Shape[fins*6];
rot = Transformation.rotate_x(2*Math.PI/fins);
for (int fin=0; fin<fins; fin++) {
Coordinate a,b;
Path2D.Float p;
// First polygon
p = new Path2D.Float();
a = finset.toAbsolute(c[0]);
p.moveTo(a.x(), a.y());
a = finset.toAbsolute(c[1]);
p.lineTo(a.x(), a.y());
a = finset.toAbsolute(c[2]);
p.lineTo(a.x(), a.y());
a = finset.toAbsolute(c[3]);
p.lineTo(a.x(), a.y());
p.closePath();
s[fin*6] = p;
// Second polygon
p = new Path2D.Float();
a = finset.toAbsolute(c[4]);
p.moveTo(a.x(), a.y());
a = finset.toAbsolute(c[5]);
p.lineTo(a.x(), a.y());
a = finset.toAbsolute(c[6]);
p.lineTo(a.x(), a.y());
a = finset.toAbsolute(c[7]);
p.lineTo(a.x(), a.y());
p.closePath();
s[fin*6+1] = p;
// Single lines
for (int i=0; i<4; i++) {
a = finset.toAbsolute(c[i]);
b = finset.toAbsolute(c[i+4]);
s[fin*6+2+i] = new Line2D.Float((float)a.x(),(float)a.y(),(float)b.x(),(float)b.y());
}
// Rotate fin coordinates
for (int i=0; i<8; i++)
c[i] = rot.transform(c[i]);
}
*/
} }