VR-Forces 5.0.1 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ssChordIntersector.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2005 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 /******************************************************************************
6 ** $RCSfile: ssChordIntersector.h,v $ $Revision: 1.6 $ $State: Exp $
7 ******************************************************************************/
8 #ifndef ssChordIntersector_H_
9 #define ssChordIntersector_H_
10 
11 #include <vlutil/vlConfig.h>
12 #include <vlutil/vlPrint.h>
13 
15 #include "geometry/ssFunctor.h"
17 
18 #include "geometry/chord.h"
19 #include "geometry/point.h"
20 #include "geometry/plane.h"
21 #include "geometry/extent.h"
22 
23 
25 // Note: Must use this macro to get around issues with VC 6.0 vs .Net/gcc.
26 // 6.0 complains if you use the typename qualifier outside of a class definition,
27 // but it is incorrect to not specify that the cell type is a type when using it
28 // as a template parameter.
30 #ifdef DtSPATIAL_SUB_CELL_TYPE
31 #undef DtSPATIAL_SUB_CELL_TYPE
32 #endif
33 
34 #if _MSC_VER == 1200 // Visual Studio 6.0
35 #define DtSPATIAL_SUB_CELL_TYPE DtSpatialSubdivision< T >::DtSpatialSubCellType
36 #else
37 #define DtSPATIAL_SUB_CELL_TYPE typename DtSpatialSubdivision< T >::DtSpatialSubCellType
38 #endif
39 
40 
41 
42 //
43 // The DtSsChordIntersector is *solely* responsible for intersecting a DtChord and a
44 // DtSpatialSubdivision together. It does not know what to do with the intersection
45 // results, nor does it rely on the specific contents of the spatial subdivision.
46 //
47 // This is one of the basic SS intersection classes provided by the toolkit.
48 //
49 template <typename T>
51 {
52 public:
53 
54  // Constructor
56 
57  // Destructor
58  virtual ~DtSsChordIntersector();
59 
60  // Intersects the specified chord and spatial subdivision together.
61  // @returns A boolean indicating whether or not the chord intersected the
62  // spatial subdivision at all.
63  // @note Technically, this returns true if the chord's @b extent intersects
64  // the spatial subdivision at all. It does not do a true mathematical
65  // intersection of the chord and the SS.
66  virtual bool intersect(const DtChord& chord, DtSpatialSubdivision< T >& spatialSubdivision) const;
67 
68  // Intersects the specified chord and spatial subdivision together. Applies
69  // the functor to the intersection results, in order, until the functor
70  // is done processing (returns true).
71  //
72  // @returns A boolean indicating whether or not the chord intersected the
73  // spatial subdivision or not. Has nothing to do with the functor's success
74  // or failure in its own processing.
75  //
76  // @note Unlike the above intersection function, this function only returns
77  // true if the chord intersected the SS, not just the chord's extent. And the
78  // functor is applied to the cells in the SS in the order that the chord intersects
79  // them.
80  //
81  virtual bool intersect(const DtChord& chord,
82  DtSpatialSubdivision< T >& spatialSubdivision,
84 
85 protected:
86 
87  // Trims the specified chord to the spatial subdivision.
88  bool trimChordToSubdivision(const DtChord& chord,
89  const DtSpatialSubdivision<T>& spatialSubdivision,
90  int xIndexStart, int yIndexStart, int zIndexStart,
91  int xIndexEnd, int yIndexEnd, int zIndexEnd,
92  double& tMin, double& tMax) const;
93 
94  // A utility function used when trimming the chord to the spatial subdivision.
95  // Given the specified chord, the specified starting/ending indices - in a single
96  // dimension, the min and max planes in that dimension, and the actual starting
97  // and ending indices, it computes the minimum and maximum time along the chord
98  // in the specified dimension (basically when along the chord it intersects
99  // the min and max planes.
100  //
101  // @returns a boolean indicating whether or not any part of the chord is inside
102  // the specified planes. If the chord lies before the minPlane or after the maxPlane,
103  // then the function returns false.
104  bool trimChordInSingleDimension(const DtChord& chord,
105  int minIndex, int maxIndex, DtPlane& minPlane, DtPlane& maxPlane,
106  int indexStart, int indexEnd, double& tMin, double& tMax) const;
107 
108  // Performs a recursive intersection of the chord with the spatial subdivision,
109  // starting in the specified cell. Intersects the chord with the initial cell,
110  // and then, if the functor is not done processing, creates a new chord from the
111  // intersection point of the chord and the cell wall, and the endpoint of the
112  // chord, and continues traversing/intersecting with that chord until no more
113  // of the chord lies in the spatial subdivision or is entirely contained within
114  // a single cell.
115  //
116  //@returns A boolean indicating whether or not the intersection succeeded or not.
117  bool intersectStartingIn(const DtChord& chord,
118  DtSpatialSubdivision< T >& spatialSubdivision,
119  int xIndexStart, int yIndexStart, int zIndexStart,
120  int xIndexEnd, int yIndexEnd, int zIndexEnd,
122 
123  // A utility function used in determining chord traversal in the x, y, z dimensions.
124  // If the start is greater than the end, then we are traversing backwards in
125  // the dimension. If the start is less than the end, then we are traversing
126  // forwards in the dimension.
127  // Specifically if the
128  // start < end, then direction = 1
129  // start > end, then direction = -1
130  // start == end, then direction = 0
131  int getRelativeDirection(int start, int end) const;
132 
133  // A utility function used in determining chord traversal. This function
134  // determines the nearest time along the chord until it intersects a cell wall
135  // in the spatial subdivision, given the starting indices and the directions
136  // of traversal in the different dimensions.
137  void determineDirectionOfTraversal(const DtChord& chord,
138  DtSpatialSubdivision<T>& spatialSubdivision,
139  double& nearestTime, double& cellTime, int* offsetToNext,
140  int xDir, int yDir, int zDir,
141  int xIndexStart, int yIndexStart, int zIndexStart) const;
142 
143 private:
144  // Copy constructor & Assignment operator - not implemented
147 
148 };
149 
150 #define SSCHORDINTERSECTOR_HEADER
151 #include "geometry/ssChordIntersector.inl"
152 #undef SSCHORDINTERSECTOR_HEADER
153 
154 #ifdef DtSPATIAL_SUB_CELL_TYPE
155 #undef DtSPATIAL_SUB_CELL_TYPE
156 #endif
157 
158 #endif
NOTE: This entire class is deprecated, in favor of Dt3dChord.
Definition: chord.h:40
virtual bool intersect(const DtChord &chord, DtSpatialSubdivision< T > &spatialSubdivision) const
Definition: plane.h:25
void determineDirectionOfTraversal(const DtChord &chord, DtSpatialSubdivision< T > &spatialSubdivision, double &nearestTime, double &cellTime, int *offsetToNext, int xDir, int yDir, int zDir, int xIndexStart, int yIndexStart, int zIndexStart) const
bool trimChordToSubdivision(const DtChord &chord, const DtSpatialSubdivision< T > &spatialSubdivision, int xIndexStart, int yIndexStart, int zIndexStart, int xIndexEnd, int yIndexEnd, int zIndexEnd, double &tMin, double &tMax) const
DtSsChordIntersector & operator=(const DtSsChordIntersector &orig)
int getRelativeDirection(int start, int end) const
Definition: ssFunctor.h:46
bool intersectStartingIn(const DtChord &chord, DtSpatialSubdivision< T > &spatialSubdivision, int xIndexStart, int yIndexStart, int zIndexStart, int xIndexEnd, int yIndexEnd, int zIndexEnd, DtSsFunctor< const DtChord, DtSPATIAL_SUB_CELL_TYPE > &functor) const
A DtChord is a finite line segment in 3-space, represented by two points. Data derived from the two e...
Contains the declaration of the DtExtent class.
bool trimChordInSingleDimension(const DtChord &chord, int minIndex, int maxIndex, DtPlane &minPlane, DtPlane &maxPlane, int indexStart, int indexEnd, double &tMin, double &tMax) const
Definition: ssChordIntersector.h:50
Definition: spatialSubdivision.h:68
virtual ~DtSsChordIntersector()

Document ID: Generated on Mon Jun 20 00:38:30 EDT 2022 from SVN revision 244029
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)