All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sim.portrayal3d.network.ArrowEdgePortrayal3D Maven / Gradle / Ivy

Go to download

MASON is a fast discrete-event multiagent simulation library core in Java, designed to be the foundation for large custom-purpose Java simulations, and also to provide more than enough functionality for many lightweight simulation needs. MASON contains both a model library and an optional suite of visualization tools in 2D and 3D.

The newest version!
/*
  Copyright 2006 by Sean Luke and George Mason University
  Licensed under the Academic Free License version 3.0
  See the file "LICENSE" for more information
*/
package sim.portrayal3d.network;

import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import sim.util.*;
import com.sun.j3d.utils.geometry.*;
import sim.portrayal3d.simple.*;

/**
 * This implementation of GenericEdgePortrayal3D uses Arrow, 
 * which aggregates two primitives.  This class provides 
 * to the super class with uniform/transparent access to all the shapes, 
 * regardless of the primitives they belong to.
 * 
 * @author Gabriel Balan
 * In 2006
 */
 
public class ArrowEdgePortrayal3D extends PrimitiveEdgePortrayal3D
    {   
    static Double3D dummyFrom = new Double3D(0f,-1f,0f);
    static Double3D dummyTo = new Double3D(0f,1f,0f);
        
    public ArrowEdgePortrayal3D()
        {
        this(null, Color.white, null, DEFAULT_RADIUS);
        }

    /** @deprecated */
    public ArrowEdgePortrayal3D(double radius)
        {
        this(null, Color.white, null, radius);
        }
        
    /** @deprecated */
    public ArrowEdgePortrayal3D(double radius, Appearance ap)
        {
        this(ap, Color.white, null, radius);
        }

    /** @deprecated */
    public ArrowEdgePortrayal3D(Color labelColor)
        {
        this(null, labelColor, null, DEFAULT_RADIUS);
        }

    public ArrowEdgePortrayal3D(Appearance appearance, Color labelColor)
        {
        this(appearance, labelColor, null, DEFAULT_RADIUS);
        }       

    public ArrowEdgePortrayal3D(Color color, Color labelColor)
        {
        this(appearanceForColor(color), labelColor, null, DEFAULT_RADIUS);
        }       

    /** Assumes that the image is opaque */
    public ArrowEdgePortrayal3D(Image image, Color labelColor)
        {
        this(appearanceForImage(image, true), labelColor, null, DEFAULT_RADIUS);
        }       

    public ArrowEdgePortrayal3D(Appearance appearance, Color labelColor, Font labelFont, double radius)
        {
        super(new Arrow(radius, dummyFrom, dummyTo, null, null, appearance), appearance, labelColor, labelFont);
        }       

    /** the arrow body has 3 (body, top, bottom), arrow head has 2 (bottom and body) */ 
    protected int numShapes()
        {
        return 5;
        }
        
    /** 
     * Returns the shape by the given index.  Cylinder shapes come first
     * (BODY=0, TOP=1, BOTTOM=2), Cone chape come last (BODY=3, CAP=4) 
     * 
     * Here's the structure of the j3dModel in this class:
     * TransformGroup                   j3dModel (passed in and out of getModel())
     * ->TransformGroup                 positioning the edge model between the end points.
     *  ->TransformGroup                a clone of the prototypical arrow you pass in the constructor)
     *          ->TransformGroup        arrowCylinderTransformGroup
     *                  ->Cylinder
     *          ->TransformGroup        arrowHeadTransformGroup
     *                  ->Cone
     *          ->TansformGroup         startLable, endLabel TransformGroups
     *                  
     **/
    protected Shape3D getShape(TransformGroup j3dModel, int shapeIndex)
        {
        TransformGroup endPointTG = (TransformGroup)(j3dModel.getChild(0));
        TransformGroup edgeModelClone = (TransformGroup)(endPointTG.getChild(0));
        int coneOffset = 3;
        
        if(shapeIndex < coneOffset) //it's the body
            {       
            TransformGroup arrowBody = (TransformGroup)(edgeModelClone.getChild(0));
            Cylinder c = (Cylinder)arrowBody.getChild(0);
            return c.getShape(shapeIndex);
            }
        TransformGroup arrowHead = (TransformGroup)(edgeModelClone.getChild(1));
        Cone c = (Cone)arrowHead.getChild(0);
        return c.getShape(shapeIndex-coneOffset);        
        }
    
    protected void init(Node edgeModel)
        {
        super.init(edgeModel);
        Arrow arrow = (Arrow)edgeModel; 
        arrow.setCapability(Group.ALLOW_CHILDREN_READ);
        //In the future I will want to read the cylinder out of its TransformGroup
        ((TransformGroup)arrow.getChild(0)).setCapability(Group.ALLOW_CHILDREN_READ);
        //In the future I will want to read the cone out of its TransformGroup
        ((TransformGroup)arrow.getChild(1)).setCapability(Group.ALLOW_CHILDREN_READ);
                
        Cylinder body = arrow.getArrowTail();
        PrimitivePortrayal3D.setShape3DFlags(body.getShape(Cylinder.BODY));
        PrimitivePortrayal3D.setShape3DFlags(body.getShape(Cylinder.TOP));
        PrimitivePortrayal3D.setShape3DFlags(body.getShape(Cylinder.BOTTOM));
        Cone head = arrow.getArrowHead();
        PrimitivePortrayal3D.setShape3DFlags(head.getShape(Cone.BODY));
        PrimitivePortrayal3D.setShape3DFlags(head.getShape(Cone.CAP));
        }

    }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy