/
EtmLine2D.cc
65 lines (46 loc) · 2.16 KB
/
EtmLine2D.cc
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
55
56
57
58
59
60
61
62
63
64
65
#include <assert.h>
#include <math.h>
#include <EtmLine2D.h>
// -------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------
EtmLine2D::EtmLine2D(const TVector2 &x, const TVector2 &v): mX(x), mV(v.Unit())
{
CalculateNormal();
} // EtmLine2D::EtmLine2D()
// -------------------------------------------------------------------------------------------
EtmLine2D::EtmLine2D(const TVector2 &x, double alfa): mX(x) {
mV = TVector2(cos(alfa), sin(alfa));
CalculateNormal();
} // EtmLine2D::EtmLine2D()
// -------------------------------------------------------------------------------------------
void EtmLine2D::CalculateNormal( void )
{
mN = mV.Rotate(M_PI/2);
} // EtmLine2D::CalculateNormal()
// -------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------
TVector2 EtmLine2D::Cross(const EtmLine2D &line) const
{
// Efficiency is least of concerns for this code;
const TVector2 &x1 = mX, &v1 = mV, &x2 = line.mX, &v2 = line.mV;
double x1v2 = x1*v2, x1v1 = x1*v1, v1v2 = v1*v2, x2v2 = x2*v2, x2v1 = x2*v1;
// FIXME: do it better later;
assert(v1v2*v1v2 != 1.0);
double t1 = (x2v2*v1v2 - x2v1 + x1v1 - x1v2*v1v2)/(v1v2*v1v2 - 1.0);
return x1 + t1*v1;
} // EtmLine2D::Cross()
// -------------------------------------------------------------------------------------------
double EtmLine2D::Distance(const TVector2 &point) const
{
return (point - mX)*mN;
} // EtmLine2D::Distance()
// -------------------------------------------------------------------------------------------
bool EtmLine2D::IsParallel(const EtmLine2D &line) const
{
// FIXME: do it better later; for now I'm only interested in EtmLine2D::Cross() to work;
double v1v2 = mV*line.mV;
return (v1v2*v1v2 == 1.0);
} // EtmLine2D::IsParallel()
// -------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------
ClassImp(EtmLine2D)