Advertisement
Guest User

Untitled

a guest
Nov 11th, 2016
2,207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.33 KB | None | 0 0
  1. /**
  2. * Triangle.cpp
  3. *
  4. * EECS 183, Fall 2016
  5. * Project 4: CoolPics
  6. *
  7. * Patrick Ahimovic, John Dorsey
  8. * paddya, jsdorsey
  9. *
  10. * functions for the triangle subclass
  11. */
  12.  
  13. #include "Triangle.h"
  14. #include "Graphics.h"
  15. #include "Shape.h"
  16. #include <cmath>
  17. using namespace std;
  18.  
  19.  
  20. Triangle::Triangle() {
  21. return;
  22. }
  23.  
  24.  
  25. Triangle::Triangle(Point pt1, Point pt2, Point pt3, Color color) {
  26. Point vertexOne = pt1;
  27. Point vertexTwo = pt2;
  28. Point vertexThree = pt3;
  29. Color vertexOneColor = color;
  30. Color vertexTwoColor = color;
  31. Color vertexThreeColor = color;
  32. }
  33.  
  34.  
  35. Triangle::Triangle(Point pt1, Color color1,
  36. Point pt2, Color color2,
  37. Point pt3, Color color3) {
  38.  
  39. Point vertexOne = pt1;
  40. Point vertexTwo = pt2;
  41. Point vertexThree = pt3;
  42. Color vertexOneColor = color1;
  43. Color vertexTwoColor = color2;
  44. Color vertexThreeColor = color3;
  45. }
  46.  
  47.  
  48. void Triangle::setColor(Color color) {
  49. Color vertexOneColor = color;
  50. Color vertexTwoColor = color;
  51. Color vertexThreeColor = color;
  52. }
  53.  
  54.  
  55. void Triangle::setVertexOne(Point pt) {
  56. vertexOne = pt;
  57. }
  58.  
  59.  
  60. void Triangle::setVertexTwo(Point pt) {
  61. vertexTwo = pt;
  62. }
  63.  
  64.  
  65. void Triangle::setVertexThree(Point pt) {
  66. vertexThree = pt;
  67. }
  68.  
  69.  
  70. Point Triangle::getVertexOne() {
  71. return vertexOne;
  72. }
  73.  
  74.  
  75. Point Triangle::getVertexTwo() {
  76. return vertexTwo;
  77. }
  78.  
  79.  
  80. Point Triangle::getVertexThree() {
  81. return vertexThree;
  82. }
  83.  
  84.  
  85. void Triangle::setVertexOneColor(Color color) {
  86. vertexOneColor = color;
  87. }
  88.  
  89.  
  90. void Triangle::setVertexTwoColor(Color color) {
  91. vertexTwoColor = color;
  92. }
  93.  
  94.  
  95. void Triangle::setVertexThreeColor(Color color) {
  96. vertexThreeColor = color;
  97. }
  98.  
  99.  
  100. Color Triangle::getVertexOneColor() {
  101. return vertexOneColor;
  102. }
  103.  
  104.  
  105. Color Triangle::getVertexTwoColor() {
  106. return vertexTwoColor;
  107. }
  108.  
  109.  
  110. Color Triangle::getVertexThreeColor() {
  111. return vertexThreeColor;
  112. }
  113.  
  114.  
  115. void Triangle::read(istream& ins) {
  116. // values for each vertex and color
  117. Point vertex1;
  118. Point vertex2;
  119. Point vertex3;
  120. Color color;
  121. Color vertex1Color;
  122. Color vertex2Color;
  123. Color vertex3Color;
  124.  
  125. ins >> vertex1 >> vertex1Color >>
  126. vertex2 >> vertex2Color >>
  127. vertex3;
  128.  
  129. // checks if ins has entered a fail state
  130. if (ins.fail()) {
  131. ins.clear();
  132. ins >> vertex1 >> vertex2 >> vertex3 >> color;
  133.  
  134. Triangle(vertex1, vertex2, vertex3, color);
  135. }
  136. else {
  137. ins >> vertex3Color;
  138.  
  139. Triangle(vertex1, vertex1Color,
  140. vertex2, vertex2Color,
  141. vertex3, vertex3Color);
  142. }
  143. }
  144.  
  145.  
  146. void Triangle::write(ostream& outs) {
  147. Point out_vertex1 = getVertexOne();
  148. Point out_vertex2 = getVertexTwo();
  149. Point out_vertex3 = getVertexThree();
  150. Color out_vertex1Color = getVertexOneColor();
  151. Color out_vertex2Color = getVertexTwoColor();
  152. Color out_vertex3Color = getVertexThreeColor();
  153.  
  154. outs << out_vertex1 << " " << out_vertex1Color <<
  155. " " << out_vertex2 << " " << out_vertex2Color <<
  156. " " << out_vertex3 << " " << out_vertex3Color;
  157. }
  158.  
  159.  
  160. // Your code goes above this line.
  161. // Don't change the implementations below!
  162.  
  163. istream& operator >> (istream& ins, Triangle& tri)
  164. {
  165. tri.read(ins);
  166. return ins;
  167. }
  168.  
  169. ostream& operator << (ostream& outs, Triangle tri)
  170. {
  171. tri.write(outs);
  172. return outs;
  173. }
  174.  
  175. void Triangle::draw (Graphics& drawer) {
  176.  
  177. int xa = checkRange(getVertexOne().getX());
  178. int ya = checkRange(getVertexOne().getY());
  179. int xb = checkRange(getVertexTwo().getX());
  180. int yb = checkRange(getVertexTwo().getY());
  181. int xc = checkRange(getVertexThree().getX());
  182. int yc = checkRange(getVertexThree().getY());
  183. float red1 = (float)(getVertexOneColor().getRed()/255.0);
  184. float green1 = (float)(getVertexOneColor().getGreen()/255.0);
  185. float blue1 = (float)(getVertexOneColor().getBlue()/255.0);
  186. float red2 = (float)(getVertexTwoColor().getRed()/255.0);
  187. float green2 = (float)(getVertexTwoColor().getGreen()/255.0);
  188. float blue2 = (float)(getVertexTwoColor().getBlue()/255.0);
  189. float red3 = (float)(getVertexThreeColor().getRed()/255.0);
  190. float green3 = (float)(getVertexThreeColor().getGreen()/255.0);
  191. float blue3 = (float)(getVertexThreeColor().getBlue()/255.0);
  192.  
  193. float a01, a02, a03, b01, b02, b03, c01, c02, c03, beta1, beta2, beta3;
  194. float lowX = 0, lowY = 0, highX = 0, highY = 0, i, j, R, G, B, t1, t2, t3;
  195. float triangleArea = 0;
  196.  
  197. a01 = (float)(ya - yb);
  198. a02 = (float)(ya - yc);
  199. a03 = (float)(yb - yc);
  200. b01 = (float)(xb - xa);
  201. b02 = (float)(xc - xa);
  202. b03 = (float)(xc - xb);
  203. c01 = -(a01 * (xa+xb)+ b01 * (ya + yb)) / 2;
  204. c02 = -(a02 *(xa+xc) + b02 * (ya + yc)) / 2;
  205. c03 = -(a03 *(xb+xc) + b03 * (yb + yc)) / 2;
  206.  
  207. if (evalFunc(xc,yc, (int)a01, (int)b01, (int)c01) < 0) {
  208. a01 = a01 * (-1);
  209. b01 = b01 * (-1);
  210. c01 = c01 * (-1);
  211. }
  212. if (evalFunc(xb,yb, (int)a02, (int)b02, (int)c02) < 0) {
  213. a02 = a02 * (-1);
  214. b02 = b02 * (-1);
  215. c02 = c02 * (-1);
  216. }
  217. if (evalFunc(xa,ya, (int)a03, (int)b03, (int)c03) < 0) {
  218. a03 = a03 * (-1);
  219. b03 = b03 * (-1);
  220. c03 = c03 * (-1);
  221. }
  222. if (xa > xb) { highX = (float)xa; } else { highX = (float)xb; }
  223. if (xc > highX) { highX = (float)xc; }
  224. if (ya > yb) { highY = (float)ya; } else { highY = (float)yb; }
  225. if (yc > highY) { highY = (float)yc; }
  226. if (xa < xb) { lowX = (float)xa; } else { lowX = (float)xb; }
  227. if (xc < lowX) { lowX = (float)xc; }
  228. if (ya < yb) { lowY = (float)ya; } else { lowY = (float)yb; }
  229. if (yc < lowY) { lowY = (float)yc; }
  230.  
  231. triangleArea = triArea(xa, ya, xb, yb, xc, yc);
  232.  
  233. for (i = lowX; i < (highX+1); i++) {
  234. for (j = lowY; j < (highY+1); j++) {
  235. t1 = (float)evalFunc((int)i,(int)j, (int)a01, (int)b01, (int)c01);
  236. t2 = (float)evalFunc((int)i,(int)j, (int)a02, (int)b02, (int)c02);
  237. t3 = (float)evalFunc((int)i,(int)j, (int)a03, (int)b03, (int)c03);
  238. if ((t1 >= 0)&&(t2 >= 0)&&(t3 >= 0)){
  239. t1 = triArea(xb, yb, xc, yc, (int)i, (int)j);
  240. t2 = triArea(xc, yc, xa, ya, (int)i, (int)j);
  241. t3 = triArea(xa, ya, xb, yb, (int)i, (int)j);
  242. beta1 = triArea(xb, yb, xc, yc, (int)i, (int)j)/triangleArea;
  243. beta2 = triArea(xc, yc, xa, ya, (int)i, (int)j)/triangleArea;
  244. beta3 = triArea(xa, ya, xb, yb, (int)i, (int)j)/triangleArea;
  245. R = (beta1*red1 + beta2*red2 + beta3*red3) * 255;
  246. G = (beta1*green1 + beta2*green2 + beta3*green3) * 255;
  247. B = (beta1*blue1 + beta2*blue2 + beta3*blue3) * 255;
  248. drawer.setPixel((int)i,(int)j,Color((int)R,(int)G,int(B)));
  249. }
  250. }
  251. }
  252. }
  253.  
  254. int Triangle::checkRange(int val)
  255. {
  256. if (val < 0)
  257. return 0;
  258. else if (val > DIMENSION)
  259. return DIMENSION;
  260. else
  261. return val;
  262. }
  263.  
  264. int Triangle::evalFunc(int x, int y, int a, int b, int c) {
  265. int e = a*x+b*y+c;
  266. return(e);
  267. }
  268.  
  269. float Triangle::triArea(int xa, int ya, int xb, int yb, int xref, int yref) {
  270. xa -= xref;
  271. xb -= xref;
  272. ya -= yref;
  273. yb -= yref;
  274. return((float)(sqrt(pow((double)(yb*xa)-(xb*ya), (double)2))*0.5));
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement