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::iscoincident(Line3D another) { if (not isparallel(another)) { return false; }; Point3D orig_pt_a = orig_pt(); Point3D orig_pt_b = another.orig_pt(); if (orig_pt_a.is_coincident(orig_pt_b)) { return true; } else { Vector3D test_line = Vector3D(orig_pt_a, orig_pt_b); if (test_line.isodirection(versor())) { return true;} else { return false;} } };