7#include "GeoModelKernel/GeoTube.h"
8#include "GeoModelKernel/GeoPcon.h"
31 while (nextRay.
valid() && !exit) {
41 if (nextPoint.
last()) {
44 nextRay.
set(nextPoint, nextRay.
end());
46 exit = nextPoint.
exit();
47 if (nextPoint.
child()) {
56 m_segments.add(zone->label(), start, end, zone->rotated());
65 const Zone* child = *iter;
71 nextPoint =
nearestPoint(zone->findExit(ray), nextPoint);
72 if (!nextPoint.
valid()) {
81 if (!point2.
valid())
return point1;
83 if (!point1.
valid())
return point2;
85 if ((point2.
r() == point1.
r() && point2.
z() < point1.
z()) ||
86 (point2.
z() == point1.
z() && point2.
r() < point1.
r())) {
101 const Zone* child = *iter;
159 m_zmin(zOffset - shape->getZHalfLength()),
160 m_zmax(zOffset + shape->getZHalfLength()),
168 return(
inZ(point.
z()) &&
inR(point.
r()));
197 std::cout <<
"Unexpected case" << std::endl;
219 std::cout <<
"Unexpected case" << std::endl;
231 for (
unsigned int i = 0; i < shape->getNPlanes(); ++i) {
232 addPlane(shape->getZPlane(i), shape->getRMinPlane(i), shape->getRMaxPlane(i));
246 for (
unsigned int i = 0; i + 1 <
m_z.size(); i += 2) {
247 if (
inZ(i, point.
z()) &&
inR(i, point.
r()))
return true;
254 return(
z >=
m_z[i] &&
z <
m_z[i + 1]);
259 if (i >=
m_z.size())
return false;
268 for (
unsigned int i = 0; i + 1 <
m_z.size(); i += 2) {
276 for (
unsigned int i = 0; i + 1 <
m_z.size(); i += 2) {
284 std::cout <<
"Unexpected case" << std::endl;
294 for (
unsigned int i = 0; i + 1 <
m_z.size(); i += 2) {
302 for (
unsigned int i = 0; i + 1 <
m_z.size(); i += 2) {
310 std::cout <<
"Unexpected case" << std::endl;
398 for (std::vector<Segment>::const_iterator iter =
m_segments.begin(); iter !=
m_segments.end(); ++iter) {
418 os << ray.
start() <<
" --> " << ray.
end();
425 if (!point.
valid()) {
428 os <<
"(" << point.
z() <<
", " << point.
r() <<
")";
PconZone(const std::string &label, bool rotated=false)
virtual Point findExit(const Ray &ray) const
std::vector< double > m_z
std::vector< double > m_rmax
virtual bool inSide(const Point &point) const
std::vector< double > m_rmin
bool inZ(unsigned int i, double z) const
virtual Point findEntry(const Ray &ray) const
void addPlane(double z, double rmin, double rmax)
bool inR(unsigned int i, double r) const
const Zone * child() const
void set(const Point &start, const Point &end)
const Point & end() const
const Point & start() const
void add(const std::string &label, const Point &start, const Point &end, bool rotated=false)
unsigned int size() const
std::vector< Segment > m_segments
void addSegment(const Zone *, const Point &start, const Point &end)
const SegmentList & split(const Zone *, const Ray &)
Ray searchPoint(const Zone *zone, const Ray &ray)
Point getNextBoundary(const Zone *, const Ray &)
Point nearestPoint(const Point &point1, const Point &point2)
Ray addChildSegment(const Zone *, const Ray &)
const std::string & label() const
Segment(const std::string &label, const Point &start, const Point &end, bool rotated=false)
TubeZone(const std::string &label, double zmin, double zmax, double rmin, double rmax, bool rotated=false)
virtual bool inSide(const Point &point) const
virtual Point findExit(const Ray &ray) const
virtual Point findEntry(const Ray &ray) const
UnboundedZone(const std::string &label)
virtual Point findExit(const Ray &ray) const
virtual Point findEntry(const Ray &ray) const
virtual bool inSide(const Point &point) const
ChildIterator begin() const
std::vector< constZone * >::const_iterator ChildIterator
const std::string & label() const
virtual bool inSide(const Point &point) const =0
virtual Point findEntry(const Ray &ray) const =0
std::vector< const Zone * > m_children
ChildIterator end() const
Zone(const std::string &label, bool rotated=false)
std::string label(const std::string &format, int i)
std::ostream & operator<<(std::ostream &os, const SiCellId &cellId)
Point(double x_, double y_, double slope_)
Single point and slope to next point.