View Javadoc

1   // Copyright 2004-2005, FreeHEP.
2   package hep.wired.heprep.representation;
3   
4   import java.util.*;
5   
6   import org.freehep.graphics2d.VectorGraphics;
7   import hep.graphics.heprep.HepRepInstance;
8   import hep.graphics.heprep.HepRepPoint;
9   
10  import hep.wired.heprep.services.GraphicsMode;
11  import hep.wired.heprep.services.Attributes;
12  import hep.wired.heprep.services.Projection;
13  import hep.wired.heprep.services.DrawAs;
14  import hep.wired.services.ViewPort;
15  
16  /***
17   * Draws a prism, where one face is given by the first half of the HepRepPoints and the 
18   * other by the second half of the HepRepPoints.
19   *
20   * @author Mark Donszelmann
21   * @version $Id: DrawAsPrism.java 645 2005-02-27 02:23:41Z duns $
22   */
23  
24  public class DrawAsPrism extends AbstractDrawAs {
25      
26      // FIXME WIRED-253, limited.
27      // NOTE inner needs to at first contain all the points.
28      private double inner[][]   = new double[3][100];
29      private double outer[][]   = new double[3][100];
30      private double side[][][]  = new double[100][3][4];
31  
32      public String getKey() {
33          return "prism";
34      }
35      
36      public String getName() {
37          return "Prism";
38      }
39      
40      public String getDescription() {
41          return "Draws a closed set of line segments forming a Prism.";
42      }
43      
44      private int createPrism(int n) {
45          int k = n/2;
46          
47          // outer
48          for (int i=k; i<n; i++) {
49              outer[U][i-k] = inner[U][i];
50              outer[V][i-k] = inner[V][i];
51              outer[W][i-k] = inner[W][i];
52          }
53          // sides of prism - make each a polygon.
54          for (int i=0; i < k; i++) {
55              side[i][U][0] = outer[U][i];
56              side[i][V][0] = outer[V][i];
57              side[i][W][0] = outer[W][i];
58  
59              side[i][U][1] = inner[U][i];
60              side[i][V][1] = inner[V][i];
61              side[i][W][1] = inner[W][i];
62  
63              int next = (i+1 == k) ? 0 : i+1;
64              side[i][U][2] = inner[U][next];
65              side[i][V][2] = inner[V][next];
66              side[i][W][2] = inner[W][next];
67  
68              side[i][U][3] = outer[U][next];
69              side[i][V][3] = outer[V][next];
70              side[i][W][3] = outer[W][next];
71          }
72          
73          return k;
74      }
75      
76      public void draw(VectorGraphics graphics, HepRepInstance instance,
77                       Attributes atts, GraphicsMode mode, 
78                       Projection projection, ViewPort viewPort) {
79  
80          int n = instance.getPoints(inner);
81  
82          if (n < 0) {
83              n = 0;
84              for (Iterator i=instance.getPoints().iterator(); i.hasNext(); ) {
85  
86                  HepRepPoint p = (HepRepPoint)i.next();
87                  inner[U][n] = p.getX();
88                  inner[V][n] = p.getY();
89                  inner[W][n] = p.getZ();
90                  n++;
91              }
92          }
93          if (n == 0) return;
94  
95          int k = createPrism(n);
96  
97          inner = projection.transform(viewPort, inner, k);        
98          outer = projection.transform(viewPort, outer, k);        
99          for (int i=0; i<k; i++) {                         
100             side[i] = projection.transform(viewPort, side[i], 4);        
101         }
102         
103         if (atts.isFilled()) {
104             graphics.setColor(atts.getFillColor());
105             graphics.fillPolygon(inner[U], inner[V], k);
106             graphics.fillPolygon(outer[U], outer[V], k);
107             for (int i=0; i<k; i++) {
108                 graphics.fillPolygon(side[i][U], side[i][V], 4);
109             }   
110             graphics.setColor(atts.getColor());
111         }
112         graphics.drawPolygon(inner[U], inner[V], k);
113         graphics.drawPolygon(outer[U], outer[V], k);
114         for (int i=0; i<k; i++) {
115             graphics.drawPolygon(side[i][U], side[i][V], 4);
116         }   
117     }
118 
119     public void frame(VectorGraphics graphics, HepRepInstance instance,
120                       Attributes atts, GraphicsMode mode, 
121                       Projection projection, ViewPort viewPort) {
122 
123         int n = instance.getPoints(inner);
124 
125         if (n < 0) {
126             n = 0;
127             for (Iterator i=instance.getPoints().iterator(); i.hasNext(); ) {
128 
129                 HepRepPoint p = (HepRepPoint)i.next();
130                 inner[U][n] = p.getX();
131                 inner[V][n] = p.getY();
132                 inner[W][n] = p.getZ();
133                 n++;
134             }
135         }
136         if (n == 0) return;
137 
138         int k = createPrism(n);
139                          
140         inner = projection.transform(viewPort, inner, k);        
141         outer = projection.transform(viewPort, outer, k);        
142         for (int i=0; i<k; i++) {                         
143             side[i] = projection.transform(viewPort, side[i], 4);        
144             side[i] = viewPort.transform  (side[i], 4);
145         }
146         
147         graphics.setColor(atts.getFrameColor());
148         graphics.setLineWidth(atts.getFrameWidth()*2+atts.getLineWidth());
149         graphics.drawPolygon(inner[U], inner[V], k);
150         graphics.drawPolygon(outer[U], outer[V], k);
151         for (int i=0; i<k; i++) {
152             graphics.drawPolygon(side[i][U], side[i][V], 4);
153         }   
154         graphics.setLineWidth(atts.getLineWidth());
155         graphics.setColor(atts.getColor());
156     }
157 }