📄 draggingconformingshapes.java
字号:
}} ); JCheckBox bdyCB = new JCheckBox("Draw shape boundaries", drawShapeBoundary); controlPanel.add(bdyCB); bdyCB.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { drawShapeBoundary = !drawShapeBoundary; for (Renderable r : rLayer.getRenderables()) if (r instanceof ConformingShape) ((ConformingShape)r).setDrawBorder(drawShapeBoundary); else ((AbstractSurfaceShape)r).getAttributes().setDrawOutline(drawShapeBoundary); AppFrame.this.getWwd().redraw(); }} ); JCheckBox extCB = new JCheckBox("Show wireframe exterior", drawWireframeExterior); if (drawWireframeExterior) this.getWwd().getModel().setShowWireframeExterior(true); controlPanel.add(extCB); extCB.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { drawWireframeExterior = !drawWireframeExterior; WorldWindowGLCanvas wwd = AppFrame.this.getWwd(); wwd.getModel().setShowWireframeExterior(drawWireframeExterior); wwd.redraw(); }} ); JCheckBox intCB = new JCheckBox("Show wireframe interior", drawWireframeInterior); if (drawWireframeInterior) this.getWwd().getModel().setShowWireframeInterior(true); controlPanel.add(intCB); intCB.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { drawWireframeInterior = !drawWireframeInterior; WorldWindowGLCanvas wwd = AppFrame.this.getWwd(); wwd.getModel().setShowWireframeInterior(drawWireframeInterior); wwd.redraw(); }} ); lp.add(controlPanel,BorderLayout.SOUTH); } private Font makeToolTipFont() { HashMap<TextAttribute, Object> fontAttributes = new HashMap<TextAttribute, Object>(); fontAttributes.put(TextAttribute.BACKGROUND, new java.awt.Color(0.4f, 0.4f, 0.4f, 1f)); return Font.decode("Arial-BOLD-14").deriveFont(fontAttributes); } private void rebuildRenderableShapeLayer(Globe g) { if (numShapesInLayer > 0) buildRandomShapes(g); else buildDemoShapes(g); } private void buildDemoShapes(Globe g) { // a triangle over the Rockies. ArrayList<LatLon> v1 = new ArrayList<LatLon>(); v1.add(new LatLon(Angle.fromDegrees(35),Angle.fromDegrees(-115))); v1.add(new LatLon(Angle.fromDegrees(35),Angle.fromDegrees(-105))); v1.add(new LatLon(Angle.fromDegrees(40),Angle.fromDegrees(-110))); v1.add(new LatLon(Angle.fromDegrees(35),Angle.fromDegrees(-115))); Color c1B = new Color(1.0f,0.0f,1.0f,1.0f); Color c1F = new Color(0.8f,0.0f,0.0f,0.3f); ConformingShape s1 = new ConformingPolygon(g,v1,c1F,c1B); s1.setBorderWidth(3.0); s1.setDrawBorder(drawShapeBoundary); s1.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s1); // a concave shape over the eastern half of the U.S. ArrayList<LatLon> v2 = new ArrayList<LatLon>(); v2.add(new LatLon(Angle.fromDegrees(30),Angle.fromDegrees(-80))); v2.add(new LatLon(Angle.fromDegrees(32),Angle.fromDegrees(-78))); v2.add(new LatLon(Angle.fromDegrees(34),Angle.fromDegrees(-72))); v2.add(new LatLon(Angle.fromDegrees(34),Angle.fromDegrees(-76))); v2.add(new LatLon(Angle.fromDegrees(38),Angle.fromDegrees(-72))); v2.add(new LatLon(Angle.fromDegrees(36),Angle.fromDegrees(-76))); v2.add(new LatLon(Angle.fromDegrees(40),Angle.fromDegrees(-80))); v2.add(new LatLon(Angle.fromDegrees(30),Angle.fromDegrees(-80))); ConformingShape s2 = new ConformingPolygon(g,v2); s2.setBorderWidth(2.0); s2.setDrawBorder(drawShapeBoundary); s2.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s2); // a pentagon approximately over Washington D.C. ConformingEllipticalPolygon s3 = new ConformingEllipticalPolygon(g, new LatLon(Angle.fromDegrees(39),Angle.fromDegrees(-77)), 1.1e5,1.1e5, Angle.ZERO, 5); s3.setDrawBorder(drawShapeBoundary); s3.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s3); // a hexagon inscribed in an ellipse in southern Minnesota ConformingEllipticalPolygon s4 = new ConformingEllipticalPolygon(g, new LatLon(Angle.fromDegrees(44),Angle.fromDegrees(-96)), 3.75e5,2.0e5, Angle.ZERO, 6); s4.setDrawBorder(drawShapeBoundary); s4.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s4); // a rectangle in Oregon ConformingQuad s5 = new ConformingQuad(g, new LatLon(Angle.fromDegrees(43.75),Angle.fromDegrees(-121)), 1.5e5,8e4,Angle.ZERO); s5.setDrawBorder(drawShapeBoundary); s5.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s5); // another rectangle in the southeast ConformingQuad s6 = new ConformingQuad(g, new LatLon(Angle.fromDegrees(25),Angle.fromDegrees(-90)), 4.5e5,3e4,Angle.ZERO); s6.setDrawBorder(drawShapeBoundary); s6.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s6); // a hexagon straddling the international date line ConformingEllipticalPolygon s7 = new ConformingEllipticalPolygon(g, new LatLon(Angle.fromDegrees(20),Angle.fromDegrees(179)), 4.25e5,2.0e5, Angle.ZERO, 6); s7.setDrawBorder(drawShapeBoundary); s7.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s7); // a triangle straddling the date line ArrayList<LatLon> v8 = new ArrayList<LatLon>(); v8.add(new LatLon(Angle.fromDegrees(-35),Angle.fromDegrees(170))); v8.add(new LatLon(Angle.fromDegrees(-35),Angle.fromDegrees(-170))); v8.add(new LatLon(Angle.fromDegrees(-20),Angle.fromDegrees(-175))); v8.add(new LatLon(Angle.fromDegrees(-35),Angle.fromDegrees(170))); Color c8B = new Color(1.0f,0.0f,1.0f,1.0f); Color c8F = new Color(0.8f,0.0f,0.0f,0.3f); ConformingShape s8 = new ConformingPolygon(g,v8,c8F,c8B); s8.setBorderWidth(2.0); s8.setDrawBorder(drawShapeBoundary); s8.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s8); // another triangle straddling the date line ArrayList<LatLon> v9 = new ArrayList<LatLon>(); v9.add(new LatLon(Angle.fromDegrees(-15),Angle.fromDegrees(170))); v9.add(new LatLon(Angle.fromDegrees(-15),Angle.fromDegrees(-170))); v9.add(new LatLon(Angle.fromDegrees( 0),Angle.fromDegrees(170))); v9.add(new LatLon(Angle.fromDegrees(-15),Angle.fromDegrees(170))); Color c9B = new Color(1.0f,0.0f,1.0f,1.0f); Color c9F = new Color(0.8f,0.0f,0.0f,0.3f); ConformingShape s9 = new ConformingPolygon(g,v9,c9F,c9B); s9.setBorderWidth(2.0); s9.setDrawBorder(drawShapeBoundary); s9.setDrawInterior(drawShapeInterior); rLayer.addRenderable(s9); // new Circle and ellipse shapes ConformingShape n1 = new ConformingEllipse(new LatLon(Angle.fromDegrees(20),Angle.fromDegrees(-100)), 3.75e5,2.0e5, null); n1.setDrawBorder(drawShapeBoundary); n1.setDrawInterior(drawShapeInterior); rLayer.addRenderable(n1); ConformingShape n2 = new ConformingCircle(new LatLon(Angle.fromDegrees(30),Angle.fromDegrees(-100)), 3.75e5); n2.setDrawBorder(drawShapeBoundary); n2.setDrawInterior(drawShapeInterior); rLayer.addRenderable(n2); } private void buildRandomShapes(Globe g) { int[] c1Int = { 3, 4, 5, 6, 7, 8 }; Color[] c1B = { new Color(1.0f,0.0f,0.0f,1.0f), new Color(0.0f,1.0f,0.0f,1.0f), new Color(0.0f,0.0f,1.0f,1.0f), new Color(0.0f,1.0f,1.0f,1.0f), new Color(1.0f,0.0f,1.0f,1.0f), new Color(1.0f,1.0f,0.0f,1.0f) }; float fillAlpha = 0.3f; float brighten = 0.3f; Color[] c1F = { new Color(1.0f,brighten,brighten,fillAlpha), new Color(brighten,1.0f,brighten,fillAlpha), new Color(brighten,brighten,1.0f,fillAlpha), new Color(brighten,1.0f,1.0f,fillAlpha), new Color(1.0f,brighten,1.0f,fillAlpha), new Color(1.0f,1.0f,brighten,fillAlpha) }; double latMin = 0.0, latMax = 80.0; double lonMin = -170, lonMax = 0.0; for (int i=0 ; i<numShapesInLayer ; i++) { // randomly choose center int j = i%c1Int.length; double cLat = latMin + Math.random()*(latMax - latMin); double cLon = lonMin + Math.random()*(lonMax - lonMin); if (buildConformingShapes) { ConformingEllipticalPolygon ceShape = new ConformingEllipticalPolygon(g, new LatLon(Angle.fromDegrees(cLat),Angle.fromDegrees(cLon)), 1.75e5,1.0e5, Angle.ZERO, c1Int[j], c1F[j], c1B[j]); ceShape.setDrawBorder(drawShapeBoundary); ceShape.setDrawInterior(drawShapeInterior); rLayer.addRenderable(ceShape); } else { SurfaceEllipse seShape = new SurfaceEllipse( new LatLon(Angle.fromDegrees(cLat),Angle.fromDegrees(cLon)), 1.75e5, 1.0e5, Angle.ZERO); seShape.getAttributes().setDrawInterior(drawShapeInterior); seShape.getAttributes().setDrawOutline(drawShapeBoundary); seShape.getAttributes().setInteriorMaterial(new Material(c1F[j])); seShape.getAttributes().setOutlineMaterial(new Material(c1B[j])); seShape.getAttributes().setInteriorOpacity(c1F[j].getAlpha() / 255.0); seShape.getAttributes().setOutlineOpacity(c1B[j].getAlpha() / 255.0); rLayer.addRenderable(seShape); } } } } public static void main(String[] args) { ApplicationTemplate.start("Conforming Surface Shape Dragging", AppFrame.class); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -