Program Listing for File segment.hxx¶
↰ Return to documentation for file (src/acme/segment.hxx)
/*
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                                                                     *
 * The ACME project                                                    *
 *                                                                     *
 * Copyright (c) 2020, Davide Stocco and Enrico Bertolazzi.            *
 *                                                                     *
 * The ACME project and its components are supplied under the terms of *
 * the open source BSD 2-Clause License. The contents of the ACME      *
 * project and its components may not be copied or disclosed except in *
 * accordance with the terms of the BSD 2-Clause License.              *
 *                                                                     *
 * URL: https://opensource.org/licenses/BSD-2-Clause                   *
 *                                                                     *
 *    Davide Stocco                                                    *
 *    Department of Industrial Engineering                             *
 *    University of Trento                                             *
 *    e-mail: davide.stocco@unitn.it                                   *
 *                                                                     *
 *    Enrico Bertolazzi                                                *
 *    Department of Industrial Engineering                             *
 *    University of Trento                                             *
 *    e-mail: enrico.bertolazzi@unitn.it                               *
 *                                                                     *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
#pragma once
#ifndef INCLUDE_ACME_SEGMENT_HXX
#define INCLUDE_ACME_SEGMENT_HXX
#include "aabb.hxx"
#include "point.hxx"
namespace acme
{
  /*\
   |                                       _
   |   ___  ___  __ _ _ __ ___   ___ _ __ | |_
   |  / __|/ _ \/ _` | '_ ` _ \ / _ \ '_ \| __|
   |  \__ \  __/ (_| | | | | | |  __/ | | | |_
   |  |___/\___|\__, |_| |_| |_|\___|_| |_|\__|
   |            |___/
  \*/
  class segment : public entity
  {
  private:
    point m_vertex[2] = {NAN_POINT, NAN_POINT};
  public:
    segment(segment const &) = default;
    segment(segment &&) = default;
    segment & operator=(const segment &) = default;
    segment & operator=(segment &&) = default;
    ~segment(void) override = default;
    segment(void);
    segment(
      real vertex0_x,
      real vertex0_y,
      real vertex0_z,
      real vertex1_x,
      real vertex1_y,
      real vertex1_z
    );
    segment(
      point const & vertex0,
      point const & vertex1
    );
    segment(
      point const vertex[2]
    );
    bool
    isApprox(
      segment const & segment_in,
      real            tolerance = EPSILON
    ) const;
    point
    centroid(void)
    const;
    point const &
    vertex(
      integer i
    ) const;
    point &
    vertex(
      integer i
    );
    point const &
    operator[](
      integer i
    ) const;
    point &
    operator[](
      integer i
    );
    vec3
    toVector(void)
    const;
    vec3
    toUnitVector(void)
    const;
    void
    swap(void);
    real
    length(void)
    const;
    void
    translate(
      vec3 const & vector_in
    ) override;
    void
    transform(
      affine const & affine_in
    ) override;
    bool
    isInside(
      point const & point_in,
      real          tolerance = EPSILON
    ) const;
    bool
    isDegenerated(
      real tolerance = EPSILON
    ) const override;
    inline
    integer
    level(void)
      const override
    {
      return integer(6);
    }
    inline
    std::string
    type(void)
      const override
    {
      return "segment";
    }
    inline
    bool
    isNone(void)
      const override
    {
      return false;
    }
    inline
    bool
    isPoint(void)
      const override
    {
      return false;
    }
    inline
    bool
    isLine(void)
      const override
    {
      return false;
    }
    inline
    bool
    isRay(void)
      const override
    {
      return false;
    }
    inline
    bool
    isPlane(void)
      const override
    {
      return false;
    }
    inline
    bool
    isSegment(void)
      const override
    {
      return true;
    }
    inline
    bool
    isTriangle(void)
      const override
    {
      return false;
    }
    inline
    bool
    isDisk(void)
      const override
    {
      return false;
    }
    inline
    bool
    isBall(void)
      const override
    {
      return false;
    }
    inline
    bool
    isClampable(void)
      const override
    {
      return true;
    }
    inline
    bool
    isNonClampable(void)
      const override
    {
      return false;
    }
    bool
    clamp(
      vec3 & min,
      vec3 & max
    ) const override;
    bool
    clamp(
      real & min_x,
      real & min_y,
      real & min_z,
      real & max_x,
      real & max_y,
      real & max_z
    ) const override;
  }; // class segment
  static segment const & NAN_SEGMENT   = * new segment(NAN_POINT, NAN_POINT);
  static segment       & DUMMY_SEGMENT = * new segment(NAN_POINT, NAN_POINT);
} // namespace acme
#endif