1
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
27
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
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
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 }