VS:LineCircleIntersect

From Vectorworks Developer
Revision as of 14:34, 12 August 2013 by Root (talk | contribs) (1 revision)
Jump to navigation Jump to search

.VectorScript|VectorScript ..VS:Function Reference|Function Reference ..VS:Function_Reference_Appendix|Appendix

Description

Finds the intersection points of a line and a circle.

Returns false if there is no intersection.

FUNCTION LineCircleIntersect(
begPtX, begPtY, begPtZ :REAL;
endPtX, endPtY, endPtZ :REAL;
cenPtX, cenPtY, cenPtZ :REAL;
radius :REAL;
VAR pt1X, pt1Y, pt1Z :REAL;
VAR pt2X, pt2Y, pt2Z :REAL) :BOOLEAN;
def vs.LineCircleIntersect(begPt, endPt, cenPt, radius):
    return (BOOLEAN, pt1, pt2)

Parameters

begPtX, begPtY, begPtZ REAL
endPtX, endPtY, endPtZ REAL
cenPtX, cenPtY, cenPtZ REAL
radius REAL
pt1X, pt1Y, pt1Z REAL Output parameter.
pt2X, pt2Y, pt2Z REAL Output parameter.

Example

PROCEDURE Example;
VAR
   cen_pt, beg_pt, end_pt :VECTOR;
   startAng, sweepAng, Radius :REAL;
   pt1, pt2 :VECTOR;

   PROCEDURE ArcInfo(h :HANDLE; VAR cen_pt :VECTOR; VAR startAng, sweepAng, Radius :REAL);
   BEGIN
      Hcenter(h, cen_pt.x, cen_pt.y);
      GetArc (h, startAng, sweepAng);
      IF GetType(h) = 6 THEN Radius := Hperim(h) / Deg2Rad(sweepAng) ELSE
      IF GetType(h) = 89 THEN Radius := 5729.28 / ((100 * Hangle(h)) / Hlength(h));
   END;

BEGIN
   CallTool(-205); ArcInfo(FSActLayer, cen_pt, startAng, sweepAng, Radius);
   CallTool(-201);
   GetSegPt1(FSActLayer, beg_pt.x, beg_pt.y);
   GetSegPt2(FSActLayer, end_pt.x, end_pt.y);
   IF LineCircleIntersect(beg_pt, end_pt, cen_pt, Radius, pt1, pt2) THEN BEGIN
      Locus(pt1.x, pt1.y);
      Locus(pt2.x, pt2.y);
   END;
END;
RUN(Example);

Version

Availability: from All Versions

This is drop-in function.