Package org.geoforge.worldwind.builder.utils

Source Code of org.geoforge.worldwind.builder.utils.GfrShapeUtils

/* Copyright (C) 2001, 2008 United States Government as represented by
the Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
*/
package org.geoforge.worldwind.builder.utils;

import gov.nasa.worldwind.WorldWindow;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.globes.Globe;
import gov.nasa.worldwind.view.orbit.OrbitView;

import java.util.*;

/**
* @author dcollins
* @version $Id: ShapeUtils.java 1 2011-07-16 23:22:47Z dcollins $
*
* modified bantchao
*/
public class GfrShapeUtils
{
    public static double s_getViewportScaleFactor(WorldWindow wwd)
    {
        return ((OrbitView) wwd.getView()).getZoom() / 8.0;
    }

    public static Position s_getNewShapePosition(WorldWindow wwd)
    {
        Line ray = new Line(wwd.getView().getEyePoint(), wwd.getView().getForwardVector());
        Intersection[] intersection = wwd.getSceneController().getTerrain().intersect(ray);

        if (intersection != null && intersection.length != 0)
        {
            return wwd.getModel().getGlobe().computePositionFromPoint(intersection[0].getIntersectionPoint());
        }
        else if (wwd.getView() instanceof OrbitView)
        {
            return ((OrbitView) wwd.getView()).getCenterPosition();
        }

        return Position.ZERO;
    }

    public static Angle s_getNewShapeHeading(WorldWindow wwd, boolean matchViewHeading)
    {
        if (matchViewHeading)
        {
            if (wwd.getView() instanceof OrbitView)
            {
                return ((OrbitView) wwd.getView()).getHeading();
            }
        }

        return Angle.ZERO;
    }

    public static List<LatLon> s_createSquareInViewport(WorldWindow wwd, Position position, Angle heading,
        double sizeInMeters)
    {
        Globe globe = wwd.getModel().getGlobe();
        Matrix transform = Matrix.IDENTITY;
        transform = transform.multiply(globe.computeSurfaceOrientationAtPosition(position));
        transform = transform.multiply(Matrix.fromRotationZ(heading.multiply(-1)));

        double widthOver2 = sizeInMeters / 2.0;
        double heightOver2 = sizeInMeters / 2.0;
        Vec4[] points = new Vec4[]
            {
                new Vec4(-widthOver2, -heightOver2, 0.0).transformBy4(transform), // lower left
                new Vec4(widthOver2, -heightOver2, 0.0).transformBy4(transform), // lower right
                new Vec4(widthOver2, heightOver2, 0.0).transformBy4(transform), // upper right
                new Vec4(-widthOver2, heightOver2, 0.0).transformBy4(transform// upper left
            };

        LatLon[] locations = new LatLon[points.length];
        for (int i = 0; i < locations.length; i++)
        {
            locations[i] = new LatLon(globe.computePositionFromPoint(points[i]));
        }

        return Arrays.asList(locations);
    }
   
    public static List<Position> s_createPositionSquareInViewport(WorldWindow wwd, Position position, Angle heading,
        double sizeInMeters)
    {
        Globe globe = wwd.getModel().getGlobe();
        Matrix transform = Matrix.IDENTITY;
        transform = transform.multiply(globe.computeSurfaceOrientationAtPosition(position));
        transform = transform.multiply(Matrix.fromRotationZ(heading.multiply(-1)));

        double widthOver2 = sizeInMeters / 2.0;
        double heightOver2 = sizeInMeters / 2.0;
        double depthOver2 = sizeInMeters / 2.0;
       
        Vec4[] points = new Vec4[]
            {
                new Vec4(-widthOver2, -heightOver2, depthOver2).transformBy4(transform), // lower left
                new Vec4(widthOver2, -heightOver2, depthOver2).transformBy4(transform), // lower right
                new Vec4(widthOver2, heightOver2, depthOver2).transformBy4(transform), // upper right
                new Vec4(-widthOver2, heightOver2, depthOver2).transformBy4(transform// upper left
            };

        Position[] locations = new Position[points.length];
       
        for (int i = 0; i < locations.length; i++)
        {
            locations[i] = globe.computePositionFromPoint(points[i]);
           
            // done in a hurry
            locations[i] = new Position(locations[i].getLatitude(), locations[i].getLongitude(), 1000);
        }

        return Arrays.asList(locations);
    }

    public static List<Position> s_createPositionTriangleInViewport(WorldWindow wwd, Position position, Angle heading,
        double sizeInMeters)
    {
        Globe globe = wwd.getModel().getGlobe();
        Matrix transform = Matrix.IDENTITY;
        transform = transform.multiply(globe.computeSurfaceOrientationAtPosition(position));
        transform = transform.multiply(Matrix.fromRotationZ(heading.multiply(-1)));

        double widthOver2 = sizeInMeters / 2.0;
        double heightOver2 = sizeInMeters / 2.0;
        double depthOver2 = sizeInMeters / 2.0;
       
        Vec4[] points = new Vec4[]
            {
                new Vec4(-widthOver2, -heightOver2, depthOver2).transformBy4(transform), // lower left
                //new Vec4(widthOver2, -heightOver2, depthOver2).transformBy4(transform), // lower right
                new Vec4(widthOver2, heightOver2, depthOver2).transformBy4(transform), // upper right
                //new Vec4(-widthOver2, heightOver2, depthOver2).transformBy4(transform)  // upper left
            };

        int intMax = 2;
        Position[] locations = new Position[points.length];
       
        for (int i = 0; i < locations.length; i++)
        {
            locations[i] = globe.computePositionFromPoint(points[i]);
           
            // done in a hurry
            locations[i] = new Position(locations[i].getLatitude(), locations[i].getLongitude(), 1000);
        }
       

        return Arrays.asList(locations);
    }
}
TOP

Related Classes of org.geoforge.worldwind.builder.utils.GfrShapeUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.