source: trunk/source/graphics_reps/src/HepPolyhedronProcessor.src @ 1202

Last change on this file since 1202 was 1141, checked in by garnier, 15 years ago

update

File size: 5.9 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26// History:
27// 20.10.2009 G.Barrand : creation.
28//
29 
30#include "HepPolyhedronProcessor.h"
31
32#include "globals.hh"
33
34HepPolyhedronProcessor::HepPolyhedronProcessor(){}
35HepPolyhedronProcessor::~HepPolyhedronProcessor(){}
36//private for the moment.
37HepPolyhedronProcessor::HepPolyhedronProcessor(const HepPolyhedronProcessor&){}
38HepPolyhedronProcessor& HepPolyhedronProcessor::operator=(const HepPolyhedronProcessor&){return *this;}
39
40//public
41void HepPolyhedronProcessor::push_back(Operation a_op,const HepPolyhedron& a_polyhedron) {
42  m_ops.push_back(op_t(a_op,a_polyhedron));
43}
44void HepPolyhedronProcessor::clear() { m_ops.clear();}
45
46bool HepPolyhedronProcessor::is_same_op() const {
47  if(!m_ops.size()) return true;
48  Operation op = m_ops[0].first;
49  std::vector<op_t>::const_iterator it;
50  for(it=m_ops.begin();it!=m_ops.end();++it) {
51    if((*it).first!=op) return false;
52  }
53  return true;
54}
55
56#include <list>
57
58static bool is_in(unsigned int a_index,
59                  const std::list<unsigned int>& a_is) {
60  std::list<unsigned int>::const_iterator it;
61  for(it=a_is.begin();it!=a_is.end();++it) {
62    if(*it==a_index) return true;
63  }
64  return false;
65}
66static void dump(const std::vector<unsigned int>& a_is) {
67  unsigned int number = a_is.size();
68  for(unsigned int index=0;index<number;index++) {
69    G4cout << ' ' << a_is[index];
70  }
71  G4cout << G4endl;
72}
73
74namespace HEPVis {
75class bijection_visitor {
76public:
77  typedef std::vector<unsigned int> is_t;
78  virtual bool visit(const is_t&) = 0;
79public:
80  bijection_visitor(unsigned int a_number):m_number(a_number){}
81  bool visitx() {
82    m_is.resize(m_number,0);
83    std::list<unsigned int> is;
84    return visit(0,is);
85  }
86private:
87  bool visit(unsigned int a_level,std::list<unsigned int>& a_is) {
88    for(unsigned int index=0;index<m_number;index++) {
89      if(is_in(index,a_is)) {
90      } else {
91        a_is.push_back(index);
92        m_is[a_level] = index;
93        if(a_level==m_number-1) {
94          if(!visit(m_is)) return false;
95        } else {
96          if(!visit(a_level+1,a_is)) return false;
97        }
98        a_is.pop_back();
99      }
100    }
101    return true;
102  }
103private:
104  unsigned int m_number;
105  is_t m_is;
106};
107
108class bijection_dump : public HEPVis::bijection_visitor {
109public:
110  bijection_dump(unsigned int a_number)
111  : HEPVis::bijection_visitor(a_number)
112  {}
113  virtual bool visit(const is_t& a_is) {
114    dump(a_is);
115    return true;//continue
116  }
117};
118
119} //namespace HEPVis
120
121class HepPolyhedron_exec : public HEPVis::bijection_visitor {
122public:
123  HepPolyhedron_exec(unsigned int a_number,
124       HepPolyhedronProcessor& a_proc,
125       HepPolyhedron& a_poly)
126  : HEPVis::bijection_visitor(a_number)
127  ,m_proc(a_proc)
128  ,m_poly(a_poly)
129  {}
130  virtual bool visit(const is_t& a_is) {
131    if(m_proc.execute1(m_poly,a_is)==true) return false; //stop
132    return true;//continue
133  }
134private:
135  HepPolyhedronProcessor& m_proc;
136  HepPolyhedron& m_poly;
137};
138
139bool HepPolyhedronProcessor::execute(HepPolyhedron& a_poly) {
140  //{for(unsigned int index=0;index<5;index++) {
141  //  printf("debug : bijection : %d\n",index); 
142  //  HEPVis::bijection_dump bd(index);
143  //  bd.visitx();
144  //}}
145
146  HepPolyhedron_exec e(m_ops.size(),*this,a_poly);
147  if(!e.visitx()) return true;
148  //std::cerr << "HepPolyhedronProcessor::execute :"
149  //          << " all shifts and combinatory tried."
150  //          << " Boolean operations failed."
151  //          << std::endl;
152  return false;
153}
154
155bool HepPolyhedronProcessor::execute1(
156 HepPolyhedron& a_poly
157,const std::vector<unsigned int>& a_is
158) {
159  HepPolyhedron result(a_poly);
160  unsigned int number = m_ops.size();
161  int num_shift = BooleanProcessor::get_num_shift();
162  for(int ishift=0;ishift<num_shift;ishift++) {
163    BooleanProcessor::set_shift(ishift);
164
165    result = a_poly;
166    bool done = true;
167    for(unsigned int index=0;index<number;index++) {
168      BooleanProcessor processor; //take a fresh one.
169      const op_t& elem = m_ops[a_is[index]];
170      int err;
171      result = processor.execute(elem.first,result,elem.second,err);
172      if(err) {
173        done = false;
174        break;
175      }
176    }
177    if(done) {
178      a_poly = result;
179      return true;     
180    }
181  }
182
183  //std::cerr << "HepPolyhedronProcessor::execute :"
184  //          << " all shifts tried. Boolean operations failed."
185  //          << std::endl;
186
187  //a_poly = result;
188  return false;
189}
Note: See TracBrowser for help on using the repository browser.