Advertisement
vatman

tetrahedron

Sep 29th, 2020 (edited)
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.49 KB | None | 0 0
  1. program tetrahedron;
  2. // [a,b]=xa*yb-xb*ya;
  3. var
  4.   ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz: integer;
  5. function treug(x1,x2,x3,y1,y2,y3,x0,y0:integer):boolean;
  6. var a,b,c:integer;
  7. begin
  8.   a:=(x1 - x0) * (y2 - y1) - (x2 - x1) * (y1 - y0);
  9.   b:=(x2 - x0) * (y3 - y2) - (x3 - x2) * (y2 - y0);
  10.   c:=(x3 - x0) * (y1 - y3) - (x1 - x3) * (y3 - y0);
  11.   if((a<0)and(b<0)and(c<0))or((a>0)and(b>0)and(c>0)) then
  12.   Result := true
  13.   else if ((a=0)and(abs(x1-x0)+abs(x2-x0)=abs(x2-x1))or
  14.            (b=0)and(abs(x3-x0)+abs(x2-x0)=abs(x2-x3))or
  15.            (c=0)and(abs(x3-x0)+abs(x1-x0)=abs(x1-x3))) then
  16.   Result := true
  17.   else
  18.   Result := false  
  19. end;
  20.  
  21. function PtInTetrahedron(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz: Integer): integer;
  22. var
  23.   Det, b, c, d: Integer;
  24.   cdx, cdy, cdz: Integer;
  25. begin
  26.   Result := 0;
  27.   bx := bx - ax;
  28.   by := by - ay;
  29.   bz := bz - az;
  30.   cx := cx - ax;
  31.   cy := cy - ay;
  32.   cz := cz - az;
  33.   dx := dx - ax;
  34.   dy := dy - ay;
  35.   dz := dz - az;
  36.   px := px - ax;
  37.   py := py - ay;
  38.   pz := pz - az;
  39.   //[(cy,cz);(dy,dz)]
  40.   cdx := cy * dz - cz * dy;
  41.   //[(cz,cx);(dz,dx)]
  42.   cdy := cz * dx - cx * dz;
  43.   //[(cx,cy);(dx,dy)]
  44.   cdz := cx * dy - cy * dx;
  45.   Det := bx * cdx + by * cdy + bz * cdz;
  46.   //если det=a+b+c значит точка лежит в плоскости CBD
  47.   if Det <> 0 then begin
  48.   //если b=0 значит точка лежит в плоскости ADC
  49.     b := px * cdx + py * cdy + pz * cdz;
  50.     //если c=0 значит точка лежит в плоскости ABD
  51.     c := px * (dy * bz - dz * by) + py * (dz * bx - dx * bz) + pz * (dx * by - dy * bx);
  52.     //если d=0 значит точка лежит в плоскости ABC
  53.     d := px * (by * cz - bz * cy) + py * (bz * cx - bx * cz) + pz * (bx * cy - by * cx);
  54.     if (det=0) then
  55.       Result := -2
  56.     else if (Det > 0) and ((b > 0) and (c > 0) and (d > 0) and (b + c + d < Det)) or
  57.             (Det < 0) and ((b < 0) and (c < 0) and (d < 0) and (b + c + d > Det)) then
  58.       Result := 1
  59.     else if
  60.     ((b = 0)and treug(ay,az,dy+ay,dz+az,cy+ay,cz+az,py+ay,pz+az)and treug(ax,az,dx+ax,dz+az,cx,cz+az,px,pz+az)and treug(ax,ay,dx+ax,dy+ay,cx+ax,cy+ay,px+ax,py+ay)) or
  61.     ((c = 0)and treug(ax,az,bx+ax,bz+az,dx+ax,dz+az,px+ax,pz+az)and treug(ay,az,by+ay,bz+az,dy+ay,dz+az,py+ay,pz+az)and treug(ax,ay,bx+ax,by+ay,dx+ax,dy+ay,px+ax,py+ay)) or
  62.     ((d = 0)and treug(ax,ay,bx+ax,by+ay,cx+ax,cy+ay,px+ax,py+ay)and treug(ay,az,by+ay,bz+az,cy+ay,cz+az,py+ay,pz+az)and treug(ax,az,bx+ax,bz+az,cx+ax,cz+az,px+ax,pz+az)) or
  63.     ((b + c + d = Det)and treug(cy+ay,cz+az,by+ay,bz+az,dy+ay,dz+az,py+ay,pz+az)and treug(cx+ax,cz+az,bx+ax,bz+az,dx+ax,dz+az,px+ax,pz+az)and treug(cy+ay,cx+ax,by+ay,bx+ax,dy+ay,dx+ax,py+ay,px+ax)) then
  64.       Result := -1
  65.     else
  66.       Result := 0;
  67.   end;
  68. end;
  69.  
  70. begin
  71.   write('первая точка А: ');
  72.   readln(ax, ay, az);
  73.   write('вторая точка Б: ');
  74.   readln(bx, by, bz);
  75.   write('третья точка С: ');
  76.   readln(cx, cy, cz);
  77.   write('четвёртая точка Д: ');
  78.   readln(dx, dy, dz);  
  79.   write('искомая точка Р: ');
  80.   readln(px, py, pz);
  81.   case PtInTetrahedron(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz) of
  82.     -2:write('точки в одной плоскости');
  83.     -1: write('точка на стороне тетраэдра');
  84.     0: write('точка вне тетраэдра');
  85.     1: write('точка внури тетраэдра');
  86.   end;
  87.  
  88. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement