Advertisement
Guest User

Untitled

a guest
Jun 30th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. using std::vector;
  8. using std::string;
  9.  
  10. typedef long double ldouble;
  11.  
  12. const ldouble eps = 1E-15;
  13.  
  14. typedef struct _vector {
  15.  
  16. ldouble x, y, z;
  17.  
  18. _vector(ldouble _x = 0., ldouble _y = 0., ldouble _z = 0.) {
  19. x = _x;
  20. y = _y;
  21. z = _z;
  22. }
  23.  
  24. } my_vector;
  25.  
  26. typedef vector<my_vector> points;
  27.  
  28. typedef struct _plane {
  29.  
  30. ldouble a, b, c, d;
  31.  
  32. _plane(ldouble x1 = 0., ldouble y1 = 0., ldouble z1 = 0.,
  33. ldouble x2 = 0., ldouble y2 = 0., ldouble z2 = 0.,
  34. ldouble x3 = 0., ldouble y3 = 0., ldouble z3 = 0.) {
  35. a = -y2 * z1 + y3 * z1 + y1 * z2 - y3 * z2 - y1 * z3 + y2 * z3;
  36. b = x2 * z1 - x3 * z1 - x1 * z2 + x3 * z2 + x1 * z3 - x2 * z3;
  37. c = -x2 * y1 + x3 * y1 + x1 * y2 - x3 * y2 - x1 * y3 + x2 * y3;
  38. d = x3 * y2 * z1 - x2 * y3 * z1 - x3 * y1 * z2 +
  39. x1 * y3 * z2 + x2 * y1 * z3 - x1 * y2 * z3;
  40. }
  41.  
  42. void set(ldouble _a, ldouble _b, ldouble _c, ldouble _d) {
  43. a = _a;
  44. b = _b;
  45. c = _c;
  46. d = _d;
  47. }
  48.  
  49. } plane;
  50.  
  51. typedef struct _line {
  52. my_vector a, b;
  53.  
  54. _line(ldouble x1 = 0., ldouble y1 = 0., ldouble z1 = 0.,
  55. ldouble x2 = 0., ldouble y2 = 0., ldouble z2 = 0.) {
  56. a = my_vector(x1, y1, z1);
  57. b = my_vector(x2 - x1, y2 - y1, z2 - z1);
  58. }
  59.  
  60. } line;
  61.  
  62. typedef struct _parallelepiped {
  63.  
  64. plane planes[6];
  65.  
  66. _parallelepiped(ldouble x2 = 0., ldouble y2 = 0., ldouble z2 = 0.) {
  67. planes[0].set(1, 0, 0, 0);
  68. planes[1].set(0, 1, 0, 0);
  69. planes[2].set(0, 0, 1, 0);
  70. planes[3].set(-1, 0, 0, x2);
  71. planes[4].set(0, -1, 0, y2);
  72. planes[5].set(0, 0, -1, z2);
  73. }
  74.  
  75. } parallelepiped;
  76.  
  77. typedef struct _triangle {
  78.  
  79. line a, b, c;
  80.  
  81. plane p;
  82.  
  83. _triangle(ldouble x1 = 0., ldouble y1 = 0., ldouble z1 = 0.,
  84. ldouble x2 = 0., ldouble y2 = 0., ldouble z2 = 0.,
  85. ldouble x3 = 0., ldouble y3 = 0., ldouble z3 = 0.) {
  86. my_vector temp = my_vector(x2 - x1, y2 - y1, z2 - z1);
  87. a = line(x1, y1, z1, x2, y2, z2);
  88. b = line(x2, y2, z2, x3, y3, z3);
  89. c = line(x3, y3, z3, x1, y1, z1);
  90. p = plane(x1, y1, z1, x2, y2, z2, x3, y3, z3);
  91. }
  92.  
  93. } triangle;
  94.  
  95. ldouble length(my_vector a) {
  96. return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
  97. }
  98.  
  99. my_vector norm_vector(my_vector v) {
  100. ldouble l = length(v);
  101. v = my_vector(v.x / l, v.y / l, v.z / l);
  102. return v;
  103. }
  104.  
  105. my_vector cross_vectors(my_vector a, my_vector b) {
  106. my_vector temp;
  107. temp.x = a.y * b.z - a.z * b.y;
  108. temp.y = a.z * b.x - a.x * b.z;
  109. temp.z = a.x * b.y - a.y * b.x;
  110. return temp;
  111. }
  112.  
  113. typedef struct _basis {
  114.  
  115. my_vector x, y, z;
  116.  
  117. _basis(triangle t) {
  118. z = norm_vector(my_vector(t.p.a, t.p.b, t.p.c));
  119. y = norm_vector(t.a.b);
  120. x = norm_vector(my_vector(cross_vectors(z, y)));
  121. }
  122.  
  123. } basis;
  124.  
  125. typedef struct _matrix {
  126.  
  127. ldouble values[3][3];
  128.  
  129. _matrix(basis b) {
  130. values[0][0] = b.x.x; values[0][1] = b.x.y; values[0][2] = b.x.z;
  131. values[1][0] = b.y.x; values[1][1] = b.y.y; values[1][2] = b.y.z;
  132. values[2][0] = b.z.x; values[2][1] = b.z.y; values[2][2] = b.z.z;
  133. };
  134.  
  135. } matrix;
  136.  
  137. my_vector mul(my_vector v, matrix m) {
  138. my_vector res;
  139. res.x = v.x * m.values[0][0] + v.y * m.values[0][1] + v.z * m.values[0][2];
  140. res.y = v.x * m.values[1][0] + v.y * m.values[1][1] + v.z * m.values[1][2];
  141. res.z = v.x * m.values[2][0] + v.y * m.values[2][1] + v.z * m.values[2][2];
  142. return res;
  143. }
  144.  
  145. my_vector line_plane_intersection(line l, plane p) {
  146. ldouble t = -(p.d + p.a * l.a.x + p.b * l.a.y + p.c * l.a.z) /
  147. (p.a * l.b.x + p.b * l.b.y + p.c * l.b.z);
  148. if (t != t) return my_vector(t, t, t);
  149. return my_vector(l.a.x + l.b.x * t, l.a.y + l.b.y * t, l.a.z + l.b.z * t);
  150. }
  151.  
  152. ldouble dot_vectors(my_vector a, my_vector b) {
  153. ldouble res = 0;
  154. res += a.x * b.x;
  155. res +=
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement