File: xyz.cpp

package info (click to toggle)
evolvotron 0.7.1-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,336 kB
  • sloc: cpp: 10,425; python: 162; sh: 138; makefile: 8
file content (120 lines) | stat: -rw-r--r-- 3,010 bytes parent folder | download | duplicates (4)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**************************************************************************/
/*  Copyright 2012 Tim Day                                                */
/*                                                                        */
/*  This file is part of Evolvotron                                       */
/*                                                                        */
/*  Evolvotron is free software: you can redistribute it and/or modify    */
/*  it under the terms of the GNU General Public License as published by  */
/*  the Free Software Foundation, either version 3 of the License, or     */
/*  (at your option) any later version.                                   */
/*                                                                        */
/*  Evolvotron is distributed in the hope that it will be useful,         */
/*  but WITHOUT ANY WARRANTY; without even the implied warranty of        */
/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         */
/*  GNU General Public License for more details.                          */
/*                                                                        */
/*  You should have received a copy of the GNU General Public License     */
/*  along with Evolvotron.  If not, see <http://www.gnu.org/licenses/>.   */
/**************************************************************************/

/*! \file
  \brief Implementation for class XYZ.
*/

#include "xyz.h"

#include "random.h"
#include "xy.h"

/*! Outputs whitespace-separated co-ordinates.
 */
std::ostream& XYZ::write(std::ostream& out) const
{
  return out << x() << " " << y() << " " << z();
}

RandomXYZInUnitCube::RandomXYZInUnitCube(Random01& rng)
:XYZ()
{
  x(rng());
  y(rng());
  z(rng());
}

RandomXYZInBox::RandomXYZInBox(Random01& rng,const XYZ& bounds)
:XYZ()
{
  x(-bounds.x()+2.0*bounds.x()*rng());
  y(-bounds.y()+2.0*bounds.y()*rng());
  z(-bounds.z()+2.0*bounds.z()*rng());
}

RandomXYZInSphere::RandomXYZInSphere(Random01& rng,real radius)
:XYZ(0.0,0.0,0.0)
{
  if (radius!=0.0)
    {
      do
	{
	  x(2.0*rng()-1.0);
	  y(2.0*rng()-1.0);
	  z(2.0*rng()-1.0);
	}
      while (magnitude2()>1.0);
      (*this)*=radius;
    }
}

RandomXYZSphereNormal::RandomXYZSphereNormal(Random01& rng)
:XYZ(0.0,0.0,0.0)
{
  real m2;
  do
    {
      assign(RandomXYZInSphere(rng,1.0));
      m2=magnitude2();
    }
  while (m2==0.0);
  
  (*this)/=sqrt(m2);
}

/*! Must handle case of individual axes being zero.
 */
RandomXYZInEllipsoid::RandomXYZInEllipsoid(Random01& rng,const XYZ& axes)
:XYZ()
{
  do
    {
      assign(RandomXYZInBox(rng,axes));
    }
  while (
	  (axes.x()==0.0 ? 0.0 : sqr(x()/axes.x()))
	 +(axes.y()==0.0 ? 0.0 : sqr(y()/axes.y()))
	 +(axes.z()==0.0 ? 0.0 : sqr(z()/axes.z()))
	 >1.0
	 );
}

RandomXYZInXYDisc::RandomXYZInXYDisc(Random01& rng,real radius)
:XYZ(0.0,0.0,0.0)
{
  if (radius!=0.0)
    {
      do
	{
	  x(2.0*rng()-1.0);
	  y(2.0*rng()-1.0);
	}
      while (magnitude2()>1.0);
      (*this)*=radius;
    }
}