Beispiel #1
0
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;

};
Beispiel #2
0
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;}
        }
};