«« Site Rescued »»

While the site is still going to move from its current host, a new site will now take its place. More Info.

The new site may have less content, but the core will now remain. And it will now play nicely with phones! Keep an eye on the DelphiDabbler Blog for news.

» Help

How to calculate intersection points of lines or line sections with rectangles

   
function fuzz(x, fuzzFactor: double): double;
var
  s: string;
begin
  s := format('%.6f', [x]);
  result := StrToFloat(s);
end;

Warning: the following function assumes a fuzz factor in comparing values of doubles. This is because of the tendency of zero sloped edges to need some help in avoiding div-by-zero errors.

function Intersection (p1, p2, p3, p4: pt; var err: boolean): pt;
var
  m1, m2, b1, b2: double;
  pResult: pt;
begin
  err := false;
  if p2.x = p1.x then
    m1 := MaxReal
  else
    m1 := (p2.y - p1.y) / (p2.x - p1.x);
  if p4.x = p3.x then
    m2 := MaxReal
  else
    m2 := (p4.y - p3.y) / (p4.x - p3.x);
  if m1 = m2 then
  begin  {parallel lines never intersect}
    err := true;
    exit;
  end;
  b1 := (p1.y) - (m1 * p1.x);
  b2 := (p3.y) - (m2 * p3.x);
  if m2 = 0 then
    pResult.y := p3.y
  else
    if m1 = 0 then
      pResult.y := p1.y
    else
      pResult.y := ((m1*b2) - (m2 * b1)) / (m1-m2);
    if (fuzz(m1, 0.0001)) = fuzz(MaxReal, 0.00001) then
      pResult.x := p1.x
    else
      if m1 = 0 then
        if fuzz(m2, 0.00001) = fuzz(MaxReal, 0.00001) then
          pResult.x := p3.x
      else
        pResult.x := (pResult.y - b1)  {/ 0.00001}
      else
        pResult.x := (pResult.y - b1) / m1;
      Result := pResult;
end;
Original resource: The Delphi Pool
Author: Cliff W. Estes
Added: 2013-04-09
Last updated: 2013-04-09

« Return to contents »