@Test public void testCircumference_Circle() { Ellipse ellipse = new Ellipse(); double major = 50; double minor = 50; ellipse.setMajorRadius(major); ellipse.setMinorRadius(minor); double expectedCircumference = 2 * Math.PI * major; double actualCircumference = ellipse.computeCircumference(); assertEquals("circle circumference", expectedCircumference, actualCircumference, 1e-9); } }
protected boolean mustAssembleGeometry(RenderContext rc) { int calculatedIntervals = this.computeIntervals(rc); int sanitizedIntervals = this.sanitizeIntervals(calculatedIntervals); if (this.vertexArray == null || sanitizedIntervals != this.activeIntervals) { this.activeIntervals = sanitizedIntervals; return true; } return false; }
protected static int computeIndexOffset(int intervals) { return intervals + computeNumberSpinePoints(intervals); }
@Test public void testHeadingGetter() { Ellipse ellipse = new Ellipse(); double heading = 64.3; ellipse.heading = heading; double actualHeading = ellipse.getHeading(); assertEquals("heading getter", heading, actualHeading, 1e-9); }
Ellipse ellipse = new Ellipse(new Position(45, -120, 0), 500000, 300000); ellipse.setAltitudeMode(WorldWind.CLAMP_TO_GROUND); // clamp the ellipse's center position to the terrain surface ellipse.setFollowTerrain(true); // cause the ellipse geometry to follow the terrain surface tutorialLayer.addRenderable(ellipse); attrs.setInteriorColor(new Color(1, 1, 1, 0.5f)); // 50% transparent white attrs.setOutlineWidth(3); ellipse = new Ellipse(new Position(45, -100, 0), 500000, 300000, attrs); ellipse.setAltitudeMode(WorldWind.CLAMP_TO_GROUND); // clamp the ellipse's center position to the terrain surface ellipse.setFollowTerrain(true); // cause the ellipse geometry to follow the terrain surface tutorialLayer.addRenderable(ellipse); ellipse = new Ellipse(new Position(35, -120, 0), 500000, 300000); ellipse.setAltitudeMode(WorldWind.CLAMP_TO_GROUND); // clamp the ellipse's center position to the terrain surface ellipse.setFollowTerrain(true); // cause the ellipse geometry to follow the terrain surface ellipse.setHeading(45); tutorialLayer.addRenderable(ellipse); ellipse = new Ellipse(new Position(35, -100, 0), 400000, 400000); ellipse.setAltitudeMode(WorldWind.CLAMP_TO_GROUND); // clamp the ellipse's center position to the terrain surface ellipse.setFollowTerrain(true); // cause the ellipse geometry to follow the terrain surface tutorialLayer.addRenderable(ellipse); ellipse = new Ellipse(new Position(25, -120, 200e3), 500000, 300000); tutorialLayer.addRenderable(ellipse); attrs.setInteriorColor(new Color(1, 1, 1, 0.5f)); // 50% transparent white attrs.setDrawVerticals(true); ellipse = new Ellipse(new Position(25, -100, 200e3), 500000, 300000, attrs);
if (this.mustAssembleGeometry(rc)) { this.assembleGeometry(rc); this.vertexBufferKey = new Object(); drawState = ((DrawableSurfaceShape) drawable).drawState; ((DrawableSurfaceShape) drawable).sector.set(this.boundingSector); this.cameraDistance = this.cameraDistanceGeographic(rc, this.boundingSector); } else { Pool<DrawableShape> pool = rc.getDrawablePool(DrawableShape.class); drawState.elementBuffer = assembleElements(this.activeIntervals); rc.putBufferObject(elementBufferKey, drawState.elementBuffer); this.drawInterior(rc, drawState); this.drawOutline(rc, drawState); } else { this.drawOutline(rc, drawState); this.drawInterior(rc, drawState);
this.determineModelToTexCoord(rc); int spineCount = computeNumberSpinePoints(this.activeIntervals); // activeIntervals must be even int arrayOffset = computeIndexOffset(this.activeIntervals) * VERTEX_STRIDE; this.addVertex(rc, loc.latitude, loc.longitude, this.center.altitude, arrayOffset, this.isExtrude()); this.addVertex(rc, scratchPosition.latitude, scratchPosition.longitude, this.center.altitude, arrayOffset, false);
@Test public void testHeadingSetter() { Ellipse ellipse = new Ellipse(); double heading = 64.2; ellipse.setHeading(heading); assertEquals("heading setter", heading, ellipse.heading, 1e-9); }
@Test public void testMajorRadiusSetterValid() { Ellipse ellipse = new Ellipse(); double majorRadius = 15000; ellipse.setMajorRadius(majorRadius); assertEquals("major radius setter valid", majorRadius, ellipse.majorRadius, 1e-9); }
@Test public void testMinorRadiusSetterValid() { Ellipse ellipse = new Ellipse(); double minorRadius = 15000; ellipse.setMinorRadius(minorRadius); assertEquals("minor radius setter valid", minorRadius, ellipse.minorRadius, 1e-9); }
@Test public void testCenterGetter() { Position position = new Position(12, 34, 56); double majorRadius = 1000; double minorRadius = 500; Ellipse ellipse = new Ellipse(position, majorRadius, minorRadius); Position actualPosition = ellipse.getCenter(); assertEquals("center getter", position, actualPosition); }
@Test public void testMaxIntervalSetterValid() { Ellipse ellipse = new Ellipse(); int maxNumberIntervals = 146; ellipse.setMaximumIntervals(maxNumberIntervals); assertEquals("max interval setter even", maxNumberIntervals, ellipse.maximumIntervals); }
@Test public void testMaxIntervalGetter() { Ellipse ellipse = new Ellipse(); int actualMaxNumberIntervals = ellipse.getMaximumIntervals(); assertEquals("default number of intervals", ellipse.maximumIntervals, actualMaxNumberIntervals); }
@Test public void testMajorRadiusGetter() { Position position = new Position(12, 34, 56); double majorRadius = 1000; double minorRadius = 500; Ellipse ellipse = new Ellipse(position, majorRadius, minorRadius); double actualMajorRadius = ellipse.getMajorRadius(); assertEquals("major radius getter", majorRadius, actualMajorRadius, 1e-9); }
@Test public void testMinorRadiusGetter() { Position position = new Position(12, 34, 56); double majorRadius = 1000; double minorRadius = 500; Ellipse ellipse = new Ellipse(position, majorRadius, minorRadius); double actualMinorRadius = ellipse.getMinorRadius(); assertEquals("minor radius getter", minorRadius, actualMinorRadius, 1e-9); }
Ellipse ellipse = new Ellipse(ellipseCenter, 1.5e6, 800e3); sa = new ShapeAttributes(thickenLine); sa.setInteriorImageSource(ImageSource.fromResource(R.drawable.pattern_sample_houndstooth)); ellipse.setAttributes(sa); layer.addRenderable(ellipse);
@Test public void testConstructor() { Position position = new Position(12, 34, 56); double majorRadius = 1000; double minorRadius = 500; Ellipse ellipse = new Ellipse(position, majorRadius, minorRadius); assertEquals("constructor position", position, ellipse.center); assertEquals("constructor major radius", majorRadius, ellipse.majorRadius, 1e-9); assertEquals("constructor minor radius", minorRadius, ellipse.minorRadius, 1e-9); }
/** * Calculate the number of times to split the edges of the shape for geometry assembly. * * @param rc current RenderContext * * @return an even number of intervals */ protected int computeIntervals(RenderContext rc) { int intervals = MIN_INTERVALS; if (intervals >= this.maximumIntervals) { return intervals; // use at least the minimum number of intervals } Vec3 centerPoint = rc.geographicToCartesian(this.center.latitude, this.center.longitude, this.center.altitude, this.altitudeMode, scratchPoint); double maxRadius = Math.max(this.majorRadius, this.minorRadius); double cameraDistance = centerPoint.distanceTo(rc.cameraPoint) - maxRadius; if (cameraDistance <= 0) { return this.maximumIntervals; // use the maximum number of intervals when the camera is very close } double metersPerPixel = rc.pixelSizeAtDistance(cameraDistance); double circumferencePixels = this.computeCircumference() / metersPerPixel; double circumferenceIntervals = circumferencePixels / this.maximumPixelsPerInterval; double subdivisions = Math.log(circumferenceIntervals / intervals) / Math.log(2); int subdivisionCount = Math.max(0, (int) Math.ceil(subdivisions)); intervals <<= subdivisionCount; // subdivide the base intervals to achieve the desired number of intervals return Math.min(intervals, this.maximumIntervals); // don't exceed the maximum number of intervals }
int offset = computeIndexOffset(intervals);