source: GTP/trunk/Lib/Vis/Preprocessing/src/Mutation.h @ 2022

Revision 2022, 2.8 KB checked in by bittner, 17 years ago (diff)
Line 
1#ifndef _Mutation_H__
2#define _Mutation_H__
3
4#include <vector>
5using namespace std;
6
7#include "common.h"
8#include "Halton.h"
9
10namespace GtpVisibilityPreprocessor {
11
12class Vector2;
13class Vector3;
14class VssRay;
15class Preprocessor;
16struct SimpleRay;
17class SimpleRayContainer;
18
19struct VssRayContainer;
20
21class MutationBasedDistribution: public SamplingStrategy
22{
23public:
24  MutationBasedDistribution(Preprocessor &preprocessor);
25  virtual void Update(VssRayContainer &vssRays);
26
27  virtual bool RequiresRays() { return true; }
28
29private:
30  virtual bool GenerateSample(SimpleRay &ray);
31
32  bool
33  GenerateMutation(const int index, SimpleRay &ray);
34  bool
35  GenerateSilhouetteMutation(const int index, SimpleRay &ray);
36
37  bool
38  GenerateMutationCandidate(const int index,
39                                                        SimpleRay &ray,
40                                                        Intersectable *object,
41                                                        const AxisAlignedBox3 &box
42                                                        );
43
44
45 
46  struct RayEntry {
47        // halton sequence for generatin gmutations of this ray
48        VssRay *mRay;
49        short mMutations;
50        short mUnsuccessfulMutations;
51        HaltonSequence mHalton;
52        float mImportance;
53        float mCdf;
54
55        Vector3 mutatedOrigin;
56        Vector3 mutatedTermination;
57       
58        float GetSamplingFactor() const { return mMutations/mImportance; }
59       
60        friend bool operator<(const RayEntry &a, const RayEntry &b) {
61          return a.GetSamplingFactor() > b.GetSamplingFactor();
62        }
63       
64        RayEntry() {}
65        RayEntry(VssRay *r):mRay(r),
66                                                mMutations(0),
67                                                mUnsuccessfulMutations(0),
68                                                mHalton(),
69                                                mImportance(1.0f)
70        {
71          ResetReverseMutation();
72        }
73
74        void ResetReverseMutation() {
75          mutatedOrigin = mutatedTermination = Vector3(0,0,0);
76        }
77        bool HasReverseMutation() const {
78          return !(mutatedOrigin == mutatedTermination);
79        }
80       
81        void SetReverseMutation(const Vector3 &a, const Vector3 &b) {
82          mutatedOrigin = a;
83          mutatedTermination = b;
84        }
85
86  };
87 
88
89  Vector3
90  ComputeOriginMutation(const VssRay &ray,
91                                                const Vector3 &U,
92                                                const Vector3 &V,
93                                                const Vector2 vr2,
94                                                const float radius
95                                                );
96
97  Vector3
98  ComputeTerminationMutation(const VssRay &ray,
99                                                         const Vector3 &U,
100                                                         const Vector3 &V,
101                                                         const Vector2 vr2,
102                                                         const float radius
103                                                         );
104
105
106  Vector3
107  ComputeSilhouetteTerminationMutation(const VssRay &ray,
108                                                                           const Vector3 &origin,
109                                                                           const AxisAlignedBox3 &box,
110                                                                           const Vector3 &U,
111                                                                           const Vector3 &V,
112                                                                           const float radius
113                                                                           );
114
115
116  bool
117  ComputeReverseMutation(
118                                                 const VssRay &oldRay,
119                                                 const VssRay &newRay,
120                                                 Vector3 &origin,
121                                                 Vector3 &termination
122                                                 );
123
124  RayEntry &GetEntry(const int index);
125
126 
127  vector<RayEntry> mRays;
128  int mMaxRays;
129  float mOriginMutationSize;
130  int mBufferStart;
131  int mLastIndex;
132};
133
134
135}
136
137#endif
138
Note: See TracBrowser for help on using the repository browser.