MATH.PAS 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. Unit Math;
  2. Interface
  3. Uses TypeLib;
  4. {---------------------------------------------------------------}
  5. function min(a,b : real) : real;
  6. {}
  7. function max(a,b : real) : real;
  8. {}
  9. function RayCrossL(Ray,L : TRay; var P : TPoint) :boolean;
  10. {Функция возвращает true если луч Ray пересекает отрезок L;
  11. P- Координаты пересечения}
  12. {---------------------------------------------------------------}
  13. Implementation
  14. {---------------------------------------------------------------}
  15. function min;
  16. begin
  17. if a>b then min:=b
  18. else min:=a;
  19. end;
  20. function max;
  21. begin
  22. if a>b then max:=a
  23. else max:=b;
  24. end;
  25. function RayCrossL;
  26. var
  27. a1,b1,c1 : real;
  28. a2,b2,c2 : real;
  29. x,y : real;
  30. begin
  31. RayCrossL:=false;
  32. with Ray do begin a1:=y2-y1; b1:=x1-x2; c1:=-x1*a1-y1*b1; end;
  33. with L do begin a2:=y2-y1; b2:=x1-x2; c2:=-x1*a2-y1*b2; end;
  34. if A2*B1-A1*B2=0 then exit;
  35. x:=(B1*C2-B2*C1)/(B2*A1-B1*A2);
  36. y:=(a1*c2-a2*c1)/(a2*b1-a1*b2);
  37. {Проверяем на принадлежность точки пересечения отрезку}
  38. with L do
  39. if not ((((x2>=x1) and (x2>=x) and (x>=x1)) or ((x2<x1) and (x2<x) and (x<x1)))
  40. and (((y2>=y1) and (y2>=y) and (y>=y1)) or ((y2<y1) and (y2<y) and (y<y1))))
  41. then Exit;
  42. {Проверяем на принадлежность лучу}
  43. with Ray do
  44. if not ((((x2>=x1) and (x2>=x) and (x>=x1)) or ((x2<x1) and (x2<x) and (x<x1)))
  45. and (((y2>=y1) and (y2>=y) and (y>=y1)) or ((y2<y1) and (y2<y) and (y<y1))))
  46. then Exit;
  47. P.x:=x; P.y:=y;
  48. RayCrossL:=true;
  49. end;
  50. {---------------------------------------------------------------}
  51. End.