⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shapes.java

📁 world wind java sdk 源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.examples;import com.sun.opengl.util.j2d.TextRenderer;import gov.nasa.worldwind.Configuration;import gov.nasa.worldwind.event.*;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.layers.RenderableLayer;import gov.nasa.worldwind.pick.PickedObjectList;import gov.nasa.worldwind.render.*;import javax.swing.*;import javax.swing.border.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;import java.util.ArrayList;/** * @author tag * @version $Id: Shapes.java 10925 2009-05-06 22:22:50Z dcollins $ */public class Shapes{    private static class Info    {        private final Object object;        private final String name;        public Info(String name, Object object)        {            this.object = object;            this.name = name;        }    }    protected static class AppFrame extends JFrame    {        private Dimension canvasSize = new Dimension(800, 600);        private ApplicationTemplate.AppPanel wwjPanel;        private RenderableLayer layer = new RenderableLayer();        private TextRenderer textRenderer = new TextRenderer(java.awt.Font.decode("Arial-Plain-13"), true, false);        public AppFrame()        {            // Create the WorldWindow.            this.wwjPanel = new ApplicationTemplate.AppPanel(this.canvasSize, true);            this.wwjPanel.setPreferredSize(canvasSize);            ApplicationTemplate.insertBeforePlacenames(this.wwjPanel.getWwd(), layer);            JPanel shapesPanel = makeShapeSelectionPanel();            shapesPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));            JPanel attrsPanel = makeAttributesPanel();            attrsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));            // Put the pieces together.            JPanel controlPanel = new JPanel(new BorderLayout());            controlPanel.add(shapesPanel, BorderLayout.CENTER);            JPanel p = new JPanel(new BorderLayout(6, 6));            p.add(attrsPanel, BorderLayout.CENTER);            controlPanel.add(p, BorderLayout.SOUTH);            this.getContentPane().add(wwjPanel, BorderLayout.CENTER);            this.getContentPane().add(controlPanel, BorderLayout.WEST);            this.pack();            // Center the application on the screen.            Dimension prefSize = this.getPreferredSize();            Dimension parentSize;            java.awt.Point parentLocation = new java.awt.Point(0, 0);            parentSize = Toolkit.getDefaultToolkit().getScreenSize();            int x = parentLocation.x + (parentSize.width - prefSize.width) / 2;            int y = parentLocation.y + (parentSize.height - prefSize.height) / 2;            this.setLocation(x, y);            this.setResizable(true);            wwjPanel.getWwd().addRenderingListener(new RenderingListener()            {                public void stageChanged(RenderingEvent event)                {                    if (!event.getStage().equals(RenderingEvent.BEFORE_BUFFER_SWAP))                        return;                    if (currentShape instanceof Polyline)                    {                        Polyline p = (Polyline) currentShape;                        String length = Double.toString(p.getLength());                        textRenderer.beginRendering(wwjPanel.getWidth(), wwjPanel.getHeight());                        textRenderer.draw(length, 100, 100);                        textRenderer.endRendering();                    }                }            });            // Enable dragging and other selection responses            this.setupSelection();        }        private Renderable currentShape;        private String currentPathColor = "Yellow";        private int currentPathOpacity = 10;        private float currentPathWidth = 1;        private String currentPathType = "Great Circle";        private String currentPathStyle = "Solid";        private boolean currentFollowTerrain = true;        private float currentOffset = 0;        private int currentTerrainConformance = 10;        private int currentNumSubsegments = 10;        private String currentBorderColor = "Yellow";        private float currentBorderWidth = 1;        private int currentBorderOpacity = 10;        private String currentBorderStyle = "Solid";        private String currentInteriorColor = "Yellow";        private int currentInteriorOpacity = 10;        private String currentInteriorStyle = "Solid";        private ArrayList<JComponent> onTerrainOnlyItems = new ArrayList<JComponent>();        private ArrayList<JComponent> offTerrainOnlyItems = new ArrayList<JComponent>();        private void update()        {            for (JComponent c : onTerrainOnlyItems)                c.setEnabled(currentFollowTerrain);            for (JComponent c : offTerrainOnlyItems)                c.setEnabled(!currentFollowTerrain);            if (this.currentShape instanceof AbstractSurfaceShape)            {                AbstractSurfaceShape shape = (AbstractSurfaceShape) currentShape;                if (!currentBorderStyle.equals("None"))                {                    float alpha = currentBorderOpacity >= 10 ? 1f : currentBorderOpacity <= 0 ? 0f                        : currentBorderOpacity / 10f;                    Color color = null;                    if (currentBorderColor.equals("Yellow"))                        color = new Color(1f, 1f, 0f);                    else if (currentBorderColor.equals("Red"))                        color = new Color(1f, 0f, 0f);                    else if (currentBorderColor.equals("Green"))                        color = new Color(0f, 1f, 0f);                    else if (currentBorderColor.equals("Blue"))                        color = new Color(0f, 0f, 1f);                    shape.getAttributes().setDrawOutline(true);                    shape.getAttributes().setOutlineMaterial(new Material(color));                    shape.getAttributes().setOutlineOpacity(alpha);                    shape.getAttributes().setOutlineWidth(currentBorderWidth);                }                else                {                    shape.getAttributes().setDrawOutline(false);                }                if (!currentInteriorStyle.equals("None"))                {                    float alpha = currentInteriorOpacity >= 10 ? 1f : currentInteriorOpacity <= 0 ? 0f                        : currentInteriorOpacity / 10f;                    Color color = null;                    if (currentInteriorColor.equals("Yellow"))                        color = new Color(1f, 1f, 0f);                    else if (currentInteriorColor.equals("Red"))                        color = new Color(1f, 0f, 0f);                    else if (currentInteriorColor.equals("Green"))                        color = new Color(0f, 1f, 0f);                    else if (currentInteriorColor.equals("Blue"))                        color = new Color(0f, 0f, 1f);                    shape.getAttributes().setInteriorMaterial(new Material(color));                    shape.getAttributes().setInteriorOpacity(alpha);                    shape.getAttributes().setDrawInterior(true);                }                else                {                    shape.getAttributes().setDrawInterior(false);                }            }            else            {                float alpha = currentPathOpacity >= 10 ? 1f : currentPathOpacity <= 0 ? 0f                    : currentPathOpacity / 10f;                Color color = null;                if (currentPathColor.equals("Yellow"))                    color = new Color(1f, 1f, 0f, alpha);                else if (currentPathColor.equals("Red"))                    color = new Color(1f, 0f, 0f, alpha);                else if (currentPathColor.equals("Green"))                    color = new Color(0f, 1f, 0f, alpha);                else if (currentPathColor.equals("Blue"))                    color = new Color(0f, 0f, 1f, alpha);                if (currentShape instanceof Polyline)                {                    Polyline pl = (Polyline) currentShape;                    pl.setColor(color);                    pl.setLineWidth(currentPathWidth);                    pl.setFollowTerrain(currentFollowTerrain);                    pl.setTerrainConformance(currentTerrainConformance);                    pl.setNumSubsegments(currentNumSubsegments);                    if (currentPathType.equalsIgnoreCase("linear"))                        pl.setPathType(Polyline.LINEAR);                    else if (currentPathType.equalsIgnoreCase("rhumb line"))                        pl.setPathType(Polyline.RHUMB_LINE);                    else                        pl.setPathType(Polyline.GREAT_CIRCLE);                    pl.setOffset(currentOffset);                    if (currentPathStyle.equals("Dash"))                    {                        pl.setStippleFactor(5);                        pl.setStipplePattern((short) 0xAAAA);                    }                    else                    {                        pl.setStippleFactor(0); // solid                    }                }            }            this.layer.removeAllRenderables();            if (this.currentShape != null)                this.layer.addRenderable(this.currentShape);            this.wwjPanel.getWwd().redraw();        }        private Info[] buildSurfaceShapes()        {            LatLon position = new LatLon(Angle.fromDegrees(38), Angle.fromDegrees(-105));            ArrayList<LatLon> surfaceLinePositions = new ArrayList<LatLon>();//            surfaceLinePositions.add(LatLon.fromDegrees(37.8484, -119.9754));//            surfaceLinePositions.add(LatLon.fromDegrees(38.3540, -119.1526));//            surfaceLinePositions.add(new LatLon(Angle.fromDegrees(0), Angle.fromDegrees(-150)));//            surfaceLinePositions.add(new LatLon(Angle.fromDegrees(60), Angle.fromDegrees(0)));            surfaceLinePositions.add(position);            surfaceLinePositions.add(LatLon.fromDegrees(39, -104));            surfaceLinePositions.add(LatLon.fromDegrees(39, -105));            surfaceLinePositions.add(position);            return new Info[]                {                    new Info("Circle", new SurfaceCircle(position, 100e3)),                    new Info("Ellipse", new SurfaceEllipse(position, 100e3, 90e3, Angle.ZERO)),                    new Info("Square", new SurfaceSquare(position, 100e3)),                    new Info("Quad", new SurfaceQuad(position, 100e3, 60e3, Angle.ZERO)),                    new Info("Sector", new SurfaceSector(Sector.fromDegrees(38, 40, -105, -103))),                    new Info("Polygon", new SurfacePolygon(surfaceLinePositions)),                };        }        private Info[] buildFreeShapes()        {            double elevation = 10e3;            ArrayList<Position> positions = new ArrayList<Position>();            positions.add(new Position(Angle.fromDegrees(37.8484), Angle.fromDegrees(-119.9754), elevation));            positions.add(new Position(Angle.fromDegrees(39.3540), Angle.fromDegrees(-110.1526), elevation));            positions.add(new Position(Angle.fromDegrees(38.3540), Angle.fromDegrees(-100.1526), elevation));            ArrayList<Position> positions2 = new ArrayList<Position>();            positions2.add(new Position(Angle.fromDegrees(0), Angle.fromDegrees(-150), elevation));            positions2.add(new Position(Angle.fromDegrees(25), Angle.fromDegrees(-75), elevation));            positions2.add(new Position(Angle.fromDegrees(50), Angle.fromDegrees(0), elevation));            ArrayList<Position> positions3 = new ArrayList<Position>();            for (double lat = 42, lon = -100; lat <= 45; lat += .1, lon += .1)                positions3.add(new Position(Angle.fromDegrees(lat), Angle.fromDegrees(lon), elevation));            ArrayList<Position> positions4 = new ArrayList<Position>();            positions4.add(new Position(Angle.fromDegrees(90), Angle.fromDegrees(-110), elevation));            positions4.add(new Position(Angle.fromDegrees(-90), Angle.fromDegrees(-110), elevation));            ArrayList<Position> positions5 = new ArrayList<Position>();            for (int i = 0; i < 100; i++)            positions5.add(Position.fromDegrees(38.0 + i * 0.0001, 30.0 + i * 0.0001, 1000.0 + i * 5.0));            @SuppressWarnings({"UnnecessaryLocalVariable"})            Info[] infos = new Info[]                {                    new Info("Short Path", new Polyline(positions)),                    new Info("Long Path", new Polyline(positions2)),                    new Info("Incremental Path", new Polyline(positions3)),                    new Info("Vertical Path", new Polyline(positions4)),                    new Info("Small-segment Path", new Polyline(positions5)),                    new Info("Quad", new Quadrilateral(Sector.fromDegrees(38, 40, -104, -105), elevation)),                    new Info("None", null)                };            return infos;        }        private JPanel makeShapeSelectionPanel()        {            final Info[] surfaceShapeInfos = this.buildSurfaceShapes();            GridLayout layout = new GridLayout(surfaceShapeInfos.length, 1);            JPanel ssPanel = new JPanel(layout);            ButtonGroup group = new ButtonGroup();            for (final Info info : surfaceShapeInfos)            {                JRadioButton b = new JRadioButton(info.name);                b.addActionListener(new ActionListener()                {                    public void actionPerformed(ActionEvent actionEvent)                    {                        currentShape = (Renderable) info.object;                        update();                    }                });                group.add(b);                ssPanel.add(b);                if (info.name.equalsIgnoreCase("none"))                    b.setSelected(true);            }            ssPanel.setBorder(this.createTitleBorder("Surface Shapes"));            final Info[] freeShapeInfos = this.buildFreeShapes();            layout = new GridLayout(freeShapeInfos.length, 1);            JPanel fsPanel = new JPanel(layout);            for (final Info info : freeShapeInfos)            {                JRadioButton b = new JRadioButton(info.name);                b.addActionListener(new ActionListener()                {                    public void actionPerformed(ActionEvent actionEvent)                    {                        currentShape = (Renderable) info.object;                        update();                    }                });                group.add(b);                fsPanel.add(b);                if (info.name.equalsIgnoreCase("none"))                    b.setSelected(true);            }            fsPanel.setBorder(this.createTitleBorder("Path Shapes"));            JPanel shapesPanel = new JPanel(new GridLayout(1, 2, 8, 1));            shapesPanel.add(fsPanel);            shapesPanel.add(ssPanel);            return shapesPanel;        }        private Border createTitleBorder(String title)        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -