Trigonometry Formulas for Delphi / Pascal


type
tdPoint= record x,y,z:double; end;
tdLine= record Point1,Point2:tdPoint; end;
tdArc= record Center:tdPoint; r,sa,ea:double; end;
const
RADIANS=57.29577951;

Find Distance Between Two Points:

function distance2d(x1,y1,x2,y2:double):double;
var a,b,c:double;
begin
 a:=abs(x1-x2);
 b:=abs(y1-y2);
 c:=sqr(a)+sqr(b);
 if c>0 then result:=sqrt(c) else result:=0; 
end;
function distance3d(x1,y1,z1,x2,y2,z2:double):double;
var c:double;
begin
 c:=sqr(abs(x1-x2))+sqr(abs(y1-y2))+sqr(abs(z1-z2));
 if c>0 then result:=sqrt(c) else result:=0;
end;
   

Find Midpoint Between Two Points

function midpoint(x1,y1,z1,x2,y2,z2:double):tdpoint;
var point1:tdpoint;
begin
 point1.x:=((x2-x1)/2)+x1;
 point1.y:=((y2-y1)/2)+y1;
 point1.z:=((z2-z1)/2)+z1;
 result:=point1;
end;

Get Angle in Degrees

// angle going from x1,y1 to x2,y2
function get_angle_degrees(x1,y1,x2,y2:double):double; 
var
 part1, part2:double;
 angle:double;
begin
 if (x1=x2) and (y1=y2) then
  begin
   result:=0.0;
   exit;
  end;
 part1:=abs(y2-y1);
 if (part1=0) then begin part1:=0.0000001; y1:=y1+0.0000001; end;
 part2:=abs(x2-x1);
 if (part2=0) then begin part2:=0.0000001; x1:=x1+0.0000001; end;
 angle:=arctan(part1/part2)*RADIANS;
 if ((x1>x2) and (y1<y2)) then angle:=180-angle;
 if ((x1>x2) and (y1>y2)) then angle:=angle +180;
 if ((x1<x2) and (y1>y2)) then angle:=360-angle;
 angle:=fix_angle(angle);
 result:=angle;
end;

Fix Angle

// if angle is outside of 0-360 then put it within 0-360
function fix_angle(angle:double):double;
begin
 while angle>= 360.0 do
  angle := angle - 360.0;
 while angle < 0 do
  angle := angle + 360.0;
 result:=angle;
end;

Point On an Arc at an Angle

function point_arc_angle(circle1:TDArc;angle:double):TDPoint;
var a9:double;
  point1:tdPoint;
begin
 if circle1.r=0 then
  begin
   result:=circle1.center;
   exit;
  end;
 a9:=angle/RADIANS;
 point1.x:=circle1.center.x+circle1.r*cos(a9);
 point1.y:=circle1.center.y+circle1.r*sin(a9);
 point1.z:=circle1.center.z;
 result:=point1;
end;

Get Closest Point to a Line

function get_closest_point_line(line1:TDLine;pick_point:TDPoint):TDPoint;
var angle:double;
 arc1:TDArc;
 temp_point:TDPoint;
 TDLine2:TDLine;
 return_point:tdPoint;
begin
 angle:=get_angle_degrees(line1.point1.x,line1.point1.y,line1.point2.x,line1.point2.y);
 arc1.center.x:=pick_point.x;
 arc1.center.y:=pick_point.y;
 arc1.center.z:=pick_point.z;
 arc1.r:=1;
 temp_point:=point_arc_angle(arc1,angle+90);
 line_2_points(pick_point,temp_point,TDLine2);
 point_inter_2_lines(line1,TDLine2,return_point);
end;

Offset a Line

function offset_line(orig_line:TDLine;dist:double;pick_point:TDPoint):TDLine);
var angle1:double;
 temp_point,new_end_point1,new_end_point2:TDPoint;
 temp_line:T2DLine;
 temp_circle:TDArc;
begin
 get_closest_point_line(orig_line,pick_point,temp_point);
 temp_line.point1:=temp_point;
 temp_line.point2:=pick_point;
 angle1:=get_angle_line(temp_line);
 temp_circle.center:=orig_line.point1;
temp_circle.r:=dist;
point_arc_angle(temp_circle,angle1,new_end_point1);
temp_circle.center:=orig_line.point2;
point_arc_angle(temp_circle,angle1,new_end_point2);
new_line.point1:=new_end_point1;
new_line.point2:=new_end_point2;
end;

Find Point at the Intersection of Two Lines

function point_inter_2_lines(line1,line2:TDLine;var point1:TDPoint):integer;
var x1_start,y1_start,x1_end,y1_end,
 x2_start,y2_start,x2_end,y2_end,
 k1,b1,k2,b2:double;
 ka,xa,xb:double;
begin
 point_inter_2_lines:=0;

 x1_start:=line1.point1.x;
 y1_start:=line1.point1.y;
 x1_end:=line1.point2.x;
 y1_end:=line1.point2.y;

 x2_start:=line2.point1.x;
 y2_start:=line2.point1.y;
 x2_end:=line2.point2.x;
 y2_end:=line2.point2.y;

 xa:=(x1_start-x1_end);
 if abs(xa)<0.000001 then
  begin
   xa:=0.000001;
  end;
 k1:=(y1_start-y1_end)/xa;
 b1:=(y1_start-(k1*x1_start));

 xb:=(x2_start-x2_end);
 if abs(xb)<0.000001 then
  begin
   xb:=0.000001;
  end;

 k2:=(y2_start-y2_end)/xb;
 b2:=(y2_start-(k2*x2_start));

 ka:=(k1-k2);
 if ka=0.0 then begin point_inter_2_lines:=902;{Parallel Lines} exit; end;
 if abs(ka)<0.000001 then
  begin
   ka:=0.000001;
  end;

 point1.x :=(b2-b1)/ka;
 point1.y:=(k1*point1.x)+b1;
end;

function line_2_points(point1,point2:TDPoint;var line1:TDLine):integer;
begin
 if (point1.x=point2.x)and(point1.y=point2.y)then line_2_points:=903{undefined line} else line_2_points:=0;
 line1.point1.x:=point1.x;
 line1.point1.y:=point1.y;
 line1.point1.z:=point1.z;
 line1.point2.x:=point2.x;
 line1.point2.y:=point2.y;
 line1.point2.z:=point2.z;
end;