Advertisement
Guest User

Untitled

a guest
Jul 1st, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.68 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 namespace std;
  8.  
  9. typedef struct _vector {
  10.  
  11.     long double x, y, z;
  12.  
  13.     _vector(long double _x = 0., long double _y = 0., long double _z = 0.) {
  14.         x = _x;
  15.         y = _y;
  16.         z = _z;
  17.     }
  18.  
  19. } my_vector;
  20.  
  21. typedef vector<my_vector> points;
  22.  
  23. typedef struct _plane {
  24.  
  25.     long double a, b, c, d;
  26.  
  27.     _plane(long double x1 = 0., long double y1 = 0., long double z1 = 0.,
  28.         long double x2 = 0., long double y2 = 0., long double z2 = 0.,
  29.         long double x3 = 0., long double y3 = 0., long double z3 = 0.) {
  30.         a = -y2 * z1 + y3 * z1 + y1 * z2 - y3 * z2 - y1 * z3 + y2 * z3;
  31.         b = x2 * z1 - x3 * z1 - x1 * z2 + x3 * z2 + x1 * z3 - x2 * z3;
  32.         c = -x2 * y1 + x3 * y1 + x1 * y2 - x3 * y2 - x1 * y3 + x2 * y3;
  33.         d = x3 * y2 * z1 - x2 * y3 * z1 - x3 * y1 * z2 +
  34.             x1 * y3 * z2 + x2 * y1 * z3 - x1 * y2 * z3;
  35.     }
  36.  
  37.     void set(long double _a, long double _b, long double _c, long double _d) {
  38.         a = _a;
  39.         b = _b;
  40.         c = _c;
  41.         d = _d;
  42.     }
  43.  
  44. } plane;
  45.  
  46. typedef struct _line {
  47.     my_vector a, b;
  48.  
  49.     _line(long double x1 = 0., long double y1 = 0., long double z1 = 0.,
  50.         long double x2 = 0., long double y2 = 0., long double z2 = 0.) {
  51.         a = my_vector(x1, y1, z1);
  52.         b = my_vector(x2 - x1, y2 - y1, z2 - z1);
  53.     }
  54.  
  55. } line;
  56.  
  57. typedef struct _parallelepiped {
  58.  
  59.     plane planes[6];
  60.  
  61.     _parallelepiped(long double x2 = 0., long double y2 = 0., long double z2 = 0.) {
  62.         planes[0].set(1, 0, 0, 0);
  63.         planes[1].set(0, 1, 0, 0);
  64.         planes[2].set(0, 0, 1, 0);
  65.         planes[3].set(-1, 0, 0, x2);
  66.         planes[4].set(0, -1, 0, y2);
  67.         planes[5].set(0, 0, -1, z2);
  68.     }
  69.  
  70. } parallelepiped;
  71.  
  72. typedef struct _triangle {
  73.  
  74.     line a, b, c;
  75.  
  76.     plane p;
  77.  
  78.     _triangle(long double x1 = 0., long double y1 = 0., long double z1 = 0.,
  79.         long double x2 = 0., long double y2 = 0., long double z2 = 0.,
  80.         long double x3 = 0., long double y3 = 0., long double z3 = 0.) {
  81.         my_vector temp = my_vector(x2 - x1, y2 - y1, z2 - z1);
  82.         a = line(x1, y1, z1, x2, y2, z2);
  83.         b = line(x2, y2, z2, x3, y3, z3);
  84.         c = line(x3, y3, z3, x1, y1, z1);
  85.         p = plane(x1, y1, z1, x2, y2, z2, x3, y3, z3);
  86.     }
  87.  
  88. } triangle;
  89.  
  90. long double length(my_vector a) {
  91.     return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
  92. }
  93.  
  94. my_vector norm_vector(my_vector v) {
  95.     long double l = length(v);
  96.     v = my_vector(v.x / l, v.y / l, v.z / l);
  97.     return v;
  98. }
  99.  
  100. my_vector cross_vectors(my_vector a, my_vector b) {
  101.     my_vector temp;
  102.     temp.x = a.y * b.z - a.z * b.y;
  103.     temp.y = a.z * b.x - a.x * b.z;
  104.     temp.z = a.x * b.y - a.y * b.x;
  105.     return temp;
  106. }
  107.  
  108. typedef struct _basis {
  109.  
  110.     my_vector x, y, z;
  111.  
  112.     _basis(triangle t) {
  113.         z = norm_vector(my_vector(t.p.a, t.p.b, t.p.c));
  114.         y = norm_vector(t.a.b);
  115.         x = norm_vector(my_vector(cross_vectors(z, y)));
  116.     }
  117.  
  118. } basis;
  119.  
  120. typedef struct _matrix {
  121.  
  122.     long double values[3][3];
  123.  
  124.     _matrix(basis b) {
  125.         values[0][0] = b.x.x; values[0][1] = b.x.y; values[0][2] = b.x.z;
  126.         values[1][0] = b.y.x; values[1][1] = b.y.y; values[1][2] = b.y.z;
  127.         values[2][0] = b.z.x; values[2][1] = b.z.y; values[2][2] = b.z.z;
  128.     };
  129.  
  130. } matrix;
  131.  
  132. my_vector mul(my_vector v, matrix m) {
  133.     my_vector res;
  134.     res.x = v.x * m.values[0][0] + v.y * m.values[0][1] + v.z * m.values[0][2];
  135.     res.y = v.x * m.values[1][0] + v.y * m.values[1][1] + v.z * m.values[1][2];
  136.     res.z = v.x * m.values[2][0] + v.y * m.values[2][1] + v.z * m.values[2][2];
  137.     return res;
  138. }
  139.  
  140. my_vector line_plane_intersection(line l, plane p) {
  141.     long double t = -(p.d + p.a * l.a.x + p.b * l.a.y + p.c * l.a.z) /
  142.         (p.a * l.b.x + p.b * l.b.y + p.c * l.b.z);
  143.     if (t != t) return my_vector(t, t, t);
  144.     return my_vector(l.a.x + l.b.x * t, l.a.y + l.b.y * t, l.a.z + l.b.z * t);
  145. }
  146.  
  147. long double dot_vectors(my_vector a, my_vector b) {
  148.     long double res = 0;
  149.     res += a.x * b.x;
  150.     res += a.x * b.x;
  151.     res += a.y * b.y;
  152.     res += a.z * b.z;
  153.     return res;
  154. }
  155.  
  156. long double area(points pt) {
  157.     if (pt.size() <= 2) return 0.;
  158.     long double sum = 0.;
  159.     for (size_t i = 0; i < pt.size() - 1; ++i) sum +=
  160.         (pt[i].x + pt[i + 1].x) * (pt[i].y - pt[i + 1].y);
  161.     sum += (pt[pt.size() - 1].x + pt[0].x) * (pt[pt.size() - 1].y - pt[0].y);
  162.     return fabs(sum) / 2.0;
  163. }
  164.  
  165. void cut(plane pl, parallelepiped p, int i, points* pt) {
  166.     vector<my_vector> new_points;
  167.     for (size_t i = 0; i < pt->size(); ++i) {
  168.         my_vector a = (*pt)[i], b = i == pt->size() - 1 ? (*pt)[0] : (*pt)[i + 1];
  169.         int ain = dot_vectors(a, my_vector(pl.a, pl.b, pl.c)) + pl.d >= 0, bin = dot_vectors(b, my_vector(pl.a, pl.b, pl.c)) + pl.d >= 0;
  170.         if (ain && !bin) new_points.push_back(line_plane_intersection(line(a.x, a.y, a.z, b.x, b.y, b.z), pl));
  171.         else if (!ain && bin) {
  172.             new_points.push_back(line_plane_intersection(line(a.x, a.y, a.z, b.x, b.y, b.z), pl));
  173.             new_points.push_back(b);
  174.         }
  175.         else if (bin) new_points.push_back(b);
  176.     }
  177.     pt->clear();
  178.     pt->resize(new_points.size());
  179.     for (size_t i = 0; i < new_points.size(); ++i) (*pt)[i] = new_points[i];
  180. }
  181.  
  182. triangle t;
  183. parallelepiped p;
  184. points pt;
  185.  
  186. int main() {
  187.     freopen("input.txt", "r", stdin);
  188.     freopen("output.txt", "w", stdout);
  189.     long double x1, y1, z1, x2, y2, z2, x3, y3, z3;
  190.     scanf("%Lf%Lf%Lf%Lf%Lf%Lf", &x1, &y1, &z1, &x2, &y2, &z2);
  191.     p = parallelepiped(x2 - x1, y2 - y1, z2 - z1);
  192.     long double dx = x1, dy = y1, dz = z1;
  193.     scanf("%Lf%Lf%Lf%Lf%Lf%Lf%Lf%Lf%Lf", &x1, &y1, &z1, &x2, &y2, &z2, &x3, &y3, &z3);
  194.     t = triangle(x1 - dx, y1 - dy, z1 - dz, x2 - dx, y2 - dy, z2 - dz, x3 - dx, y3 - dy, z3 - dz);
  195.     pt.push_back(t.a.a);
  196.     pt.push_back(t.b.a);
  197.     pt.push_back(t.c.a);
  198.     my_vector temp;
  199.     for (int i = 0; i < 6; ++i) cut(p.planes[i], p, i, &pt);
  200.     basis b(t);
  201.     matrix m(b);
  202.     for (size_t i = 0; i < pt.size(); ++i) pt[i] = mul(pt[i], m);
  203.     long double s = area(pt);
  204.     printf("%.5lf", s);
  205.     return 0;
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement