~ubuntu-branches/ubuntu/saucy/gfan/saucy-proposed

« back to all changes in this revision

Viewing changes to traverser_sphere.cpp

  • Committer: Package Import Robot
  • Author(s): Cédric Boutillier
  • Date: 2013-07-09 10:44:01 UTC
  • mfrom: (2.1.2 experimental)
  • Revision ID: package-import@ubuntu.com-20130709104401-5q66ozz5j5af0dak
Tags: 0.5+dfsg-3
* Upload to unstable.
* modify remove_failing_tests_on_32bits.patch to replace command of
  0009RenderStairCase test with an empty one instead of deleting it.
* remove lintian override about spelling error

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "traverser_sphere.h"
 
2
#include "determinant.h"
 
3
 
 
4
#include "printer.h"
 
5
 
 
6
//void updatePolyhedralCone();
 
7
SphereTraverser::SphereTraverser(vector<PolyhedralCone> const &cones_, map<IntegerVector,list<int> > const &adjacency_, IntegerVector const &startCone, IntegerVector const &normal):
 
8
  adjacency(adjacency_),
 
9
  cones(cones_)
 
10
{
 
11
  currentConeIndex=0;
 
12
  for(;currentConeIndex<cones.size();currentConeIndex++)
 
13
    {
 
14
      if(cones[currentConeIndex].contains(startCone))
 
15
        break;
 
16
    }
 
17
  assert(currentConeIndex!=cones.size());
 
18
 
 
19
  currentNormal=normal;
 
20
}
 
21
 
 
22
void SphereTraverser::changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector)
 
23
{
 
24
  list<int> const &candidates=adjacency[ridgeVector];
 
25
  for(list<int>::const_iterator i=candidates.begin();i!=candidates.end();i++)
 
26
    {
 
27
        PolyhedralCone l=cones[*i].link(ridgeVector);
 
28
        if(l.contains(rayVector))
 
29
          {
 
30
            IntegerVectorList M;
 
31
            M.push_back(cones[currentConeIndex].getRelativeInteriorPoint());
 
32
            M.push_back(currentNormal);
 
33
            currentConeIndex=*i;
 
34
            IntegerVectorList eq=cones[*i].getEquations();
 
35
            assert(eq.size()==1);
 
36
 
 
37
            MatrixTermOrder T(M);
 
38
            if(!T(*eq.begin(),currentNormal-currentNormal))//HERE
 
39
            //            if(dotLong(currentNormal,*eq.begin())>0)
 
40
              {currentNormal=*eq.begin();}
 
41
            else
 
42
              {currentNormal=-*eq.begin();}
 
43
 
 
44
            break;
 
45
          }
 
46
//        assert(0);
 
47
    }
 
48
}
 
49
 
 
50
IntegerVectorList SphereTraverser::link(IntegerVector const &ridgeVector)
 
51
{
 
52
  list<int> const &candidates=adjacency[ridgeVector];
 
53
 
 
54
  PolyhedralCone ridge=cones[currentConeIndex].faceContaining(ridgeVector);
 
55
  ridge.canonicalize();
 
56
//  IntegerVectorList partialBasis=ridge.getEquations();
 
57
  IntegerVectorList partialBasis=ridge.link(ridge.getRelativeInteriorPoint()).dualCone().getEquations();
 
58
 
 
59
  IntegerVector myRay=cones[currentConeIndex].link(ridgeVector).getUniquePoint();
 
60
 
 
61
  partialBasis.push_back(currentNormal);
 
62
  partialBasis.push_back(myRay);
 
63
  int sign=determinantSign(partialBasis);
 
64
  partialBasis.pop_back();
 
65
  partialBasis.pop_back();
 
66
 
 
67
  IntegerVectorList c2;
 
68
 
 
69
  for(list<int>::const_iterator i=candidates.begin();i!=candidates.end();i++)
 
70
    {
 
71
      debug << "TESTET\n";
 
72
      PolyhedralCone temp=cones[*i].link(ridgeVector);
 
73
      IntegerVector v=temp.getUniquePoint();
 
74
      if(dotLong(v,currentNormal)>=0)c2.push_back(v);
 
75
    }
 
76
  assert(c2.size()>0);
 
77
  IntegerVectorList ret2;
 
78
  ret2.push_back(myRay);
 
79
  IntegerVector ret;
 
80
  for(IntegerVectorList::const_iterator i=c2.begin();i!=c2.end();i++)
 
81
    if(*i!=myRay){
 
82
      ret=*i;
 
83
      break;
 
84
    }
 
85
 
 
86
  if(ret.size()==0)
 
87
    {
 
88
      PolyhedralFan f(theCone.ambientDimension());
 
89
      f.insert(theCone);
 
90
      f.printWithIndices(&pout);
 
91
      pout<<currentNormal;
 
92
    }
 
93
  for(IntegerVectorList::const_iterator i=c2.begin();i!=c2.end();i++)
 
94
    {
 
95
      if(*i==myRay) continue;
 
96
      partialBasis.push_back(ret);
 
97
      partialBasis.push_back(*i);
 
98
      int s=determinantSign(partialBasis);
 
99
      partialBasis.pop_back();
 
100
      partialBasis.pop_back();
 
101
      if(sign==s)
 
102
        {
 
103
          ret=*i;
 
104
        }
 
105
    }
 
106
  ret2.push_back(ret);
 
107
 
 
108
  debug<<ret2;
 
109
 
 
110
  return ret2;
 
111
}
 
112
 
 
113
 
 
114
PolyhedralCone  & SphereTraverser::refToPolyhedralCone()
 
115
{
 
116
  theCone=cones[currentConeIndex];
 
117
  return theCone;//cones[currentCone];
 
118
}