Point3D Line3D::intersect_coplanar(Line3D another) { Point3D line_a_origpt = orig_pt(); Vector3D line_a_versor = versor(); Point3D line_b_origpt = another.orig_pt(); Vector3D line_b_versor = another.versor(); // creates a triplet of coplanar, non-coincident points double delta_distance = 100.0; Vector3D displ_vector_a = line_a_versor.scale(delta_distance); Vector3D displ_vector_b = line_b_versor.scale(delta_distance); Point3D point_a = Point3D(line_a_origpt.x(), line_a_origpt.y(), line_a_origpt.z()); Point3D point_b = displ_vector_b.move_pt(point_a); Point3D point_c = displ_vector_a.move_pt(point_a); CartesianPlane colinear_plane = CartesianPlane(point_a, point_b, point_c); //code inspired to: http://geomalgorithms.com/a05-_intersect-1.html#intersect2D_2Segments() Vector3D w_vect = Vector3D( line_a_origpt, line_b_origpt ); Vector3D vers_a_perp = colinear_plane.perp_versor_in_plane(line_a_versor); double factor_numerator = - vers_a_perp.scalar_prod(w_vect); double factor_denominator = vers_a_perp.scalar_prod(line_b_versor); double factor_scaling = factor_numerator / factor_denominator; Point3D intersection_pt3d = line_b_versor.scale(factor_scaling).move_pt(line_b_origpt); return intersection_pt3d; };
bool Line3D::isparallel(Line3D another) { Vector3D vers_a = versor(); Vector3D vers_b = another.versor(); if (vers_a.isodirection(vers_b)) { return true; } else { return false;}; };