Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program tetrahedron;
- // [a,b]=xa*yb-xb*ya;
- var
- ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz: integer;
- function treug(x1,x2,x3,y1,y2,y3,x0,y0:integer):boolean;
- var a,b,c:integer;
- begin
- a:=(x1 - x0) * (y2 - y1) - (x2 - x1) * (y1 - y0);
- b:=(x2 - x0) * (y3 - y2) - (x3 - x2) * (y2 - y0);
- c:=(x3 - x0) * (y1 - y3) - (x1 - x3) * (y3 - y0);
- if((a<0)and(b<0)and(c<0))or((a>0)and(b>0)and(c>0)) then
- Result := true
- else if ((a=0)and(abs(x1-x0)+abs(x2-x0)=abs(x2-x1))or
- (b=0)and(abs(x3-x0)+abs(x2-x0)=abs(x2-x3))or
- (c=0)and(abs(x3-x0)+abs(x1-x0)=abs(x1-x3))) then
- Result := true
- else
- Result := false
- end;
- function PtInTetrahedron(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz: Integer): integer;
- var
- Det, b, c, d: Integer;
- cdx, cdy, cdz: Integer;
- begin
- Result := 0;
- bx := bx - ax;
- by := by - ay;
- bz := bz - az;
- cx := cx - ax;
- cy := cy - ay;
- cz := cz - az;
- dx := dx - ax;
- dy := dy - ay;
- dz := dz - az;
- px := px - ax;
- py := py - ay;
- pz := pz - az;
- //[(cy,cz);(dy,dz)]
- cdx := cy * dz - cz * dy;
- //[(cz,cx);(dz,dx)]
- cdy := cz * dx - cx * dz;
- //[(cx,cy);(dx,dy)]
- cdz := cx * dy - cy * dx;
- Det := bx * cdx + by * cdy + bz * cdz;
- //если det=a+b+c значит точка лежит в плоскости CBD
- if Det <> 0 then begin
- //если b=0 значит точка лежит в плоскости ADC
- b := px * cdx + py * cdy + pz * cdz;
- //если c=0 значит точка лежит в плоскости ABD
- c := px * (dy * bz - dz * by) + py * (dz * bx - dx * bz) + pz * (dx * by - dy * bx);
- //если d=0 значит точка лежит в плоскости ABC
- d := px * (by * cz - bz * cy) + py * (bz * cx - bx * cz) + pz * (bx * cy - by * cx);
- if (det=0) then
- Result := -2
- else if (Det > 0) and ((b > 0) and (c > 0) and (d > 0) and (b + c + d < Det)) or
- (Det < 0) and ((b < 0) and (c < 0) and (d < 0) and (b + c + d > Det)) then
- Result := 1
- else if
- ((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
- ((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
- ((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
- ((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
- Result := -1
- else
- Result := 0;
- end;
- end;
- begin
- write('первая точка А: ');
- readln(ax, ay, az);
- write('вторая точка Б: ');
- readln(bx, by, bz);
- write('третья точка С: ');
- readln(cx, cy, cz);
- write('четвёртая точка Д: ');
- readln(dx, dy, dz);
- write('искомая точка Р: ');
- readln(px, py, pz);
- case PtInTetrahedron(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz) of
- -2:write('точки в одной плоскости');
- -1: write('точка на стороне тетраэдра');
- 0: write('точка вне тетраэдра');
- 1: write('точка внури тетраэдра');
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement