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

📄 basicdragger.java

📁 world wind java sdk 源码
💻 JAVA
字号:
/*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 gov.nasa.worldwind.Movable;import gov.nasa.worldwind.View;import gov.nasa.worldwind.WorldWindow;import gov.nasa.worldwind.examples.util.RayCastingSupport;import gov.nasa.worldwind.event.DragSelectEvent;import gov.nasa.worldwind.event.SelectEvent;import gov.nasa.worldwind.event.SelectListener;import gov.nasa.worldwind.geom.Intersection;import gov.nasa.worldwind.geom.Line;import gov.nasa.worldwind.geom.Position;import gov.nasa.worldwind.geom.Vec4;import gov.nasa.worldwind.globes.Globe;import gov.nasa.worldwind.util.Logging;import java.awt.*;/** * @author Patrick Murris * @version $Id: BasicDragger.java 9246 2009-03-06 19:10:20Z tgaskins $ */public class BasicDragger implements SelectListener{    private final WorldWindow wwd;    private boolean dragging = false;    private Point dragRefCursorPoint;    private Vec4 dragRefObjectPoint;    private double dragRefAltitude;    public BasicDragger(WorldWindow wwd)    {        if (wwd == null)        {            String msg = Logging.getMessage("nullValue.WorldWindow");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.wwd = wwd;    }    public boolean isDragging()    {        return this.dragging;    }    public void selected(SelectEvent event)    {        if (event == null)        {            String msg = Logging.getMessage("nullValue.EventIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (event.getEventAction().equals(SelectEvent.DRAG_END))        {            this.dragging = false;        }        else if (event.getEventAction().equals(SelectEvent.DRAG))        {            DragSelectEvent dragEvent = (DragSelectEvent) event;            Object topObject = dragEvent.getTopObject();            if (topObject == null)                return;            if (!(topObject instanceof Movable))                return;            Movable dragObject = (Movable) topObject;            View view = wwd.getView();            Globe globe = wwd.getModel().getGlobe();            // Compute dragged object ref-point in model coordinates.            // Use the Icon and Annotation logic of elevation as offset above ground when below max elevation.            Position refPos = dragObject.getReferencePosition();            Vec4 refPoint = null;            if (refPos.getElevation() < globe.getMaxElevation())                refPoint = wwd.getSceneController().getTerrain().getSurfacePoint(refPos);            if (refPoint == null)                refPoint = globe.computePointFromPosition(refPos);            if (!this.isDragging())   // Dragging started            {                // Save initial reference points for object and cursor in screen coordinates                // Note: y is inverted for the object point.                this.dragRefObjectPoint = view.project(refPoint);                // Save cursor position                this.dragRefCursorPoint = dragEvent.getPreviousPickPoint();                // Save start altitude                this.dragRefAltitude = globe.computePositionFromPoint(refPoint).getElevation();            }            // Compute screen-coord delta since drag started.            int dx = dragEvent.getPickPoint().x - this.dragRefCursorPoint.x;            int dy = dragEvent.getPickPoint().y - this.dragRefCursorPoint.y;            // Find intersection of screen coord (refObjectPoint + delta) with globe.            double x = this.dragRefObjectPoint.x + dx;            double y = event.getMouseEvent().getComponent().getSize().height - this.dragRefObjectPoint.y + dy - 1;            Line ray = view.computeRayFromScreenPoint(x, y);            Position pickPos = null;            if (view.getEyePosition().getElevation() < globe.getMaxElevation() * 10)            {                // Use ray casting below some altitude                // Try ray intersection with current terrain geometry                Intersection[] intersections = wwd.getSceneController().getTerrain().intersect(ray);                if (intersections != null && intersections.length > 0)                    pickPos = globe.computePositionFromPoint(intersections[0].getIntersectionPoint());                else                    // Fallback on raycasting using elevation data                    pickPos = RayCastingSupport.intersectRayWithTerrain(globe, ray.getOrigin(), ray.getDirection(),                        200, 20);            }            if (pickPos == null)            {                // Use intersection with sphere at reference altitude.                Intersection inters[] = globe.intersect(ray, this.dragRefAltitude);                if (inters != null)                    pickPos = globe.computePositionFromPoint(inters[0].getIntersectionPoint());            }            if (pickPos != null)            {                // Intersection with globe. Move reference point to the intersection point,                // but maintain current altitude.                Position p = new Position( pickPos, dragObject.getReferencePosition().getElevation());                dragObject.moveTo(p);            }            this.dragging = true;        }    }}

⌨️ 快捷键说明

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