001/* 002 003*/ 004 005package renderer.scene; 006 007import java.util.Random; 008import java.awt.Color; 009 010/** 011 A {@code Vertex} object has three doubles which represent the 012 coordinates of a point in 3-dimensional space. 013<p> 014 When a {@code Vertex} object is created in a client program, 015 before the {@code Vertex} object moves down the graphics rendering 016 pipeline, the coordinates in the {@code Vertex} will be in 017 "camera coordinates". 018<p> 019 As a {@code Vertex} object moves down the graphics rendering 020 pipeline, the coordinates in the {@code Vertex} will be transformed 021 from one coordinate system to another. 022<p> 023 A {@code Vertex} object also has a {@link Color} (or "shade"). The 024 color of a {@link LineSegment} is interpolated from the colors at 025 its two endpoints. 026*/ 027public class Vertex 028{ 029 public double x, y, z; 030 public float r = 1.0f, g = 1.0f, b = 1.0f; // color at this vertex 031 032 033 /** 034 Construct a default {@code Vertex}. 035 */ 036 public Vertex() 037 { 038 set(0.0, 0.0, 0.0); 039 } 040 041 042 /** 043 Construct a new {@code Vertex} using the given 044 {@code x}, {@code y}, and {@code z} coordinates. 045 046 @param x x-coordinate of the new {@code Vertex} 047 @param y y-coordinate of the new {@code Vertex} 048 @param z z-coordinate of the new {@code Vertex} 049 */ 050 public Vertex(double x, double y, double z) 051 { 052 set(x, y, z); 053 } 054 055 056 /** 057 Construct a new {@code Vertex} with the given coordinates 058 and the given {@link Color}. 059 060 @param x x-coordinate of the new {@code Vertex} 061 @param y y-coordinate of the new {@code Vertex} 062 @param z z-coordinate of the new {@code Vertex} 063 @param c {@link Color} of the new {@code Vertex} 064 */ 065 public Vertex(double x, double y, double z, Color c) 066 { 067 set(x, y, z); 068 setColor(c); 069 } 070 071 072 /** 073 Construct a new {@code Vertex} that is a copy of another {@code Vertex}. 074 075 @param v {@code Vertex} to make a copy of 076 */ 077 public Vertex(Vertex v) // a "copy constructor" 078 { 079 set(v.x, v.y, v.z); 080 setColor(v); 081 } 082 083 084 /** 085 Set the coordinates of this {@code Vertex}. 086 087 @param x new x-coordinate for this {@code Vertex} 088 @param y new y-coordinate for this {@code Vertex} 089 @param z new z-coordinate for this {@code Vertex} 090 */ 091 public void set(double x, double y, double z) 092 { 093 this.x = x; 094 this.y = y; 095 this.z = z; 096 } 097 098 099 /** 100 Get the {@link Color} of this {@code Vertex}. 101 102 @return the {@link Color} of this {@code Vertex} object 103 */ 104 public Color getColor() 105 { 106 return new Color(this.r, this.g, this.b); 107 } 108 109 110 /** 111 Set the {@link Color} of this {@code Vertex} 112 using floats between 0 and 1. 113 114 @param r red color value for this {@code Vertex} as a float between 0 and 1 115 @param g green color value for this {@code Vertex} as a float between 0 and 1 116 @param b blue color value for this {@code Vertex} as a float between 0 and 1 117 */ 118 public void setColor(float r, float g, float b) 119 { 120 this.r = r; 121 this.g = g; 122 this.b = b; 123 124 if ( (r < 0.0) || (r > 1.0) 125 || (g < 0.0) || (g > 1.0) 126 || (b < 0.0) || (b > 1.0) ) 127 { 128 System.err.println("ERROR! Invalid float color for vertex"); 129 System.err.print( this.toString() ); 130 System.err.printf("<r,g,b> = <% .5f % .5f % .5f>\n", r, g, b); 131 Thread.dumpStack(); 132 //System.err.println(Arrays.toString(Thread.currentThread().getStackTrace())); 133 System.exit(-1); 134 } 135 } 136 137 138 /** 139 Set the {@link Color} of this {@code Vertex} 140 using ints between 0 and 255. 141 142 @param r red color value for this {@code Vertex} as an integer between 0 and 255 143 @param g green color value for this {@code Vertex} as an integer between 0 and 255 144 @param b blue color value for this {@code Vertex} as an integer between 0 and 255 145 */ 146 public void setColor(int r, int g, int b) 147 { 148 this.r = ((float)r)/(float)255; 149 this.g = ((float)g)/(float)255; 150 this.b = ((float)b)/(float)255; 151 152 if ( (r < 0) || (r > 255) 153 || (g < 0) || (g > 255) 154 || (b < 0) || (b > 255)) 155 { 156 System.err.println("ERROR! Invalid int color for vertex"); 157 System.err.print( this.toString() ); 158 System.err.printf("<r,g,b> = <%d %d %d>\n", r, g, b); 159 Thread.dumpStack(); 160 //System.err.println(Arrays.toString(Thread.currentThread().getStackTrace())); 161 System.exit(-1); 162 } 163 } 164 165 166 /** 167 Set the {@link Color} of this {@code Vertex} 168 using a {@link Color} object. 169 170 @param c {@link Color} for this {@code Vertex} object 171 */ 172 public void setColor(Color c) 173 { 174 setColor(c.getRed(), c.getGreen(), c.getBlue()); 175 } 176 177 178 /** 179 Set the {@link Color} of this {@code Vertex} 180 using the colors from another {@code Vertex}. 181 182 @param v {@code Vertex} object to get color values from 183 */ 184 public void setColor(Vertex v) 185 { 186 // copy the color from v to this vertex 187 setColor(v.r, v.g, v.b); 188 } 189 190 191 /** 192 Set the {@link Color} of this {@code Vertex} to a random color. 193 */ 194 public void setColorRandom() 195 { 196 Random generator = new Random(); 197 float r = generator.nextFloat(); 198 float g = generator.nextFloat(); 199 float b = generator.nextFloat(); 200 setColor(r, g, b); 201 } 202 203 204 /** 205 For debugging. 206 207 @return {@link String} representation of this {@code Vertex} object 208 */ 209 @Override 210 public String toString() 211 { 212 int precision = 5; // the default precision for the format string 213 return toString(precision); 214 } 215 216 217 /** 218 For debugging. 219 <p> 220 Allow the precision of the formatted output to be specified. 221 222 @param precision precision value for the format string 223 @return {@link String} representation of this {@code Vertex} object 224 */ 225 public String toString(int precision) 226 { 227 int iWidth = 3; // default width of integer part of the format string 228 return toString(precision, iWidth); 229 } 230 231 232 /** 233 For debugging. 234 <p> 235 Allow the precision and width of the formatted output to be specified. 236 By width, we mean the width of the integer part of each number. 237 238 @param precision precision value for the format string 239 @param iWidth width of the integer part of the format string 240 @return {@link String} representation of this {@code Vertex} object 241 */ 242 public String toString(int precision, int iWidth) 243 { 244 // Here is one way to get programmable precision and width. 245 int p = precision; // the precision for the following format string 246 int t = p + iWidth + 2; // the width for the following format string 247 String format = "(x,y,z) = (% "+t+"."+p+"f % "+t+"."+p+"f % "+t+"."+p+"f)\n"; 248 return String.format(format, x, y, z); 249 } 250 251 252 /** 253 For debugging. 254 255 @return {@link String} representation of the color information in this {@code Vertex} 256 */ 257 public String toStringColor() 258 { 259 return String.format("{r,g,b} = {% 10.5f % 10.5f % 10.5f}\n", r, g, b); 260 } 261}