Welcome to mirror list, hosted at ThFree Co, Russian Federation.

triangle2d.hpp « geometry - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e63e8ee83245af025491fe27b183c43cd9d3df8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once

#include "point2d.hpp"

#include "std/vector.hpp"

namespace m2
{

template <typename T> struct Triangle
{
  Point<T> m_points[3];

  Triangle(Point<T> const & p1, Point<T> const & p2, Point<T> const & p3)
  {
    m_points[0] = p1;
    m_points[1] = p2;
    m_points[2] = p3;
  }

  Point<T> const & p1() const { return m_points[0]; }
  Point<T> const & p2() const { return m_points[1]; }
  Point<T> const & p3() const { return m_points[2]; }
};

using TriangleF = Triangle<float>;
using TriangleD = Triangle<double>;

template <class T>
double GetTriangleArea(Point<T> const & p1, Point<T> const & p2, Point<T> const & p3)
{
  return 0.5 * fabs((p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y));
}

m2::PointD GetRandomPointInsideTriangle(m2::TriangleD const & t);
m2::PointD GetRandomPointInsideTriangles(vector<m2::TriangleD> const & v);

// Project point to the nearest edge of the nearest triangle from list of triangles.
// pt must be outside triangles.
m2::PointD ProjectPointToTriangles(m2::PointD const & pt, vector<m2::TriangleD> const & v);

/// @param[in] pt - Point to check
/// @param[in] p1, p2, p3 - Triangle
//@{
bool IsPointInsideTriangle(m2::PointD const & pt, m2::PointD const & p1,
                           m2::PointD const & p2, m2::PointD const & p3);

bool IsPointStrictlyInsideTriangle(m2::PointD const & pt, m2::PointD const & p1,
                                   m2::PointD const & p2, m2::PointD const & p3);

bool IsPointInsideTriangles(m2::PointD const & pt, vector<m2::TriangleD> const & v);
//@}

} // namespace m2