19 static ossimTrace traceExec (
"ossimQuadTreeWarp:exec");
20 static ossimTrace traceDebug (
"ossimQuadTreeWarp:debug");
26 :thePosition(position),
100 const char* prefix)
const 129 const char*
x = kwl.
find(prefix,
131 const char*
y = kwl.
find(prefix,
133 const char* dx = kwl.
find(prefix,
135 const char* dy = kwl.
find(prefix,
137 const char* lockedFlag = kwl.
find(prefix,
139 if(
x&&
y&&dx&&dy&&lockedFlag)
172 theBoundingRect(bounds),
173 theUlVertex(ulVertex),
174 theUrVertex(urVertex),
175 theLrVertex(lrVertex),
176 theLlVertex(llVertex),
248 std::vector<ossimQuadTreeWarpNode*>::iterator iter =
theChildren.begin();
262 const char* prefix)
const 292 if(ul_x&&ul_y&&lr_x&&lr_y)
317 create(boundingRect, ulShift, urShift, lrShift, llShift);
322 theWarpEnabledFlag(
true),
418 out <<
"___________VERTEX LIST____________________\n";
420 out <<
"___________TREE LIST____________________\n";
426 out <<
"<empty tree>\n";
439 double d = (position-
theVertexList[i]->thePosition).length();
490 while((currentNode)&&
493 for(i = 0; i < currentNode->
theChildren.size(); ++i)
495 if(currentNode->
theChildren[i]->theBoundingRect.pointWithin(position))
530 std::vector<ossimQuadTreeWarpVertex*>::iterator iter =
theVertexList.begin();
534 if(position == (*iter)->getPosition())
600 double splitHoriCoefficient,
601 double splitVertCoefficient)
607 if(splitHoriCoefficient == 0.0)
612 if(splitVertCoefficient == 0.0)
618 splitHoriCoefficient,
619 splitVertCoefficient);
625 double splitHoriCoefficient,
626 double splitVertCoefficient)
630 splitHoriCoefficient = splitHoriCoefficient>1?1:splitHoriCoefficient;
631 splitHoriCoefficient = splitHoriCoefficient<0?0:splitHoriCoefficient;
632 splitVertCoefficient = splitVertCoefficient>1?1:splitVertCoefficient;
633 splitVertCoefficient = splitVertCoefficient<0?0:splitVertCoefficient;
635 if( ((splitHoriCoefficient == 0)&&(splitVertCoefficient == 0)) ||
636 ((splitHoriCoefficient == 1)&&(splitVertCoefficient == 1)))
655 double xmid = ul.
x + (ur.
x - ul.
x)*splitHoriCoefficient;
656 double ymid = ul.
y + (ll.
y - ul.
y)*splitVertCoefficient;
705 if(ulNode&&urNode&&lrNode&&llNode)
750 midV->addSharedNode(ulNode);
751 midV->addSharedNode(urNode);
752 midV->addSharedNode(lrNode);
753 midV->addSharedNode(llNode);
765 if( !ulSharedV || !urSharedV|| !lrSharedV || !llSharedV )
779 <<
"FATAL: ossimQuadTreeWarp::split, can't locating shared vertices. This Shouldn't happen!!!\n";
827 bottomSharedV->addSharedNode(llNode);
828 bottomSharedV->addSharedNode(lrNode);
829 leftSharedV->addSharedNode(ulNode);
830 leftSharedV->addSharedNode(llNode);
831 rightSharedV->addSharedNode(urNode);
832 rightSharedV->addSharedNode(lrNode);
835 urSharedV->addSharedNode(urNode);
836 lrSharedV->addSharedNode(lrNode);
837 llSharedV->addSharedNode(llNode);
839 ulNode->theUlVertex = ulSharedV;
840 ulNode->theUrVertex = topSharedV;
841 ulNode->theLrVertex = midV;
842 ulNode->theLlVertex = leftSharedV;
887 double horizontalPercent = fabs((pt.
x-ul.
x))/
890 double verticalPercent = fabs((pt.
y - ul.
y))/
893 ossimDpt upper = ulShift + (urShift - ulShift)*horizontalPercent;
894 ossimDpt lower = llShift + (lrShift - llShift)*horizontalPercent;
896 result = upper + (lower - upper)*verticalPercent;
916 if(ulV&&urV&&lrV&&llV)
924 urV->addSharedNode(node);
925 lrV->addSharedNode(node);
926 llV->addSharedNode(node);
939 if(!node||node->
isLeaf())
return;
1006 if(node->
theChildren[i]->theBoundingRect.pointWithin(pt))
1066 if(node->
theChildren[i]->theBoundingRect.pointWithin(pt))
1084 result.push_back(node);
1092 if(node->
theChildren[i]->theBoundingRect.pointWithin(pt))
1109 result.push_back(node);
1117 if(node->
theChildren[i]->theBoundingRect.pointWithin(pt))
1128 std::vector<ossimQuadTreeWarpVertex*>::iterator iter =
theVertexList.begin();
1132 if( !(*iter)->isShared())
1146 std::vector<ossimQuadTreeWarpVertex*>::iterator iter = std::find(
theVertexList.begin(),
1162 out << (*node) <<
"\n";
1194 if(!node)
return false;
1202 return ( (point.
x == minx) ||
1203 (point.
x == miny) ||
1204 (point.
y == miny) ||
1205 (point.
y == maxy) );
1214 if(!node)
return false;
1224 std::vector<ossimQuadTreeWarpNode*> nodeList;
1262 std::vector<ossimQuadTreeWarpVertex*>::iterator iter =
theVertexList.begin();
1363 if(top&&bottom&&left&&right)
1365 v->
theDelta = (topBottomDelta+leftRightDelta)*.5;
1371 std::vector<ossimQuadTreeWarpVertex*>::iterator iter =
theVertexList.begin();
1403 const char* prefix)
const 1431 while(numberOfMatches < result)
1478 const char* prefix)
const 1480 if(!node)
return false;
1514 if(!node)
return false;
1627 out <<
"ulVertex:\n" << *rhs.
theUlVertex<< std::endl;
1631 out <<
"urVertex:\n" << *rhs.
theUrVertex<< std::endl;
1635 out <<
"lrVertex:\n" << *rhs.
theLrVertex<< std::endl;
ossimDrect theBoundingRect
void removeNode(ossimQuadTreeWarpNode *node)
virtual std::ostream & print(std::ostream &out) const
Generic print method.
ossimQuadTreeWarpNode * theParent
bool pointWithin(const ossimDpt &pt, double epsilon=0.0) const
std::ostream & operator<<(std::ostream &out, const ossimQuadTreeWarpVertex &rhs)
ossimQuadTreeWarpVertex * findClosestVertex(ossimDpt &position)
ossim_uint32 getNumberOfSubstringKeys(const ossimString ®ularExpression) const
bool isOnEdge(ossimQuadTreeWarpNode *node, const ossimDpt &point) const
ossim_float64 width() const
ossimQuadTreeWarpNode * theTree
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Represents serializable keyword/value map.
void removeChild(ossimQuadTreeWarpNode *node)
static const char * LR_X_KW
const char * find(const char *key) const
bool saveState(ossimKeywordlist &kwl, const char *prefix) const
const ossimDpt & ul() const
bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
static ossimString toString(bool aValue)
Numeric to string methods.
void updateDelta(ossimQuadTreeWarpVertex *v)
ossimQuadTreeWarpVertex * theLrVertex
virtual void forward(const ossimDpt &pt, ossimDpt &result) const
void findAllNodes(std::vector< ossimQuadTreeWarpNode *> &result, const ossimDpt &pt)
void getShift(ossimDpt &result, const ossimDpt &pt) const
void split(const ossimDpt &point, double splitHoriCoefficient=0.0, double splitVertCoefficient=0.0)
const ossimDpt & getPosition() const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
~ossimQuadTreeWarpVertex()
void recursivePrint(std::ostream &out, ossimQuadTreeWarpNode *node) const
void setDelta(const ossimDpt &delta)
void pruneTree(ossimQuadTreeWarpNode *node)
bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
bool recursiveLoad(ossimQuadTreeWarpNode *node, const ossimKeywordlist &kwl, const char *prefix)
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
static const char * LR_Y_KW
static const char * UL_X_KW
void recursivePruneTree(ossimQuadTreeWarpNode *node)
void pruneSharedVertices()
bool toBool() const
String to numeric methods.
const ossimDpt & getDelta() const
unsigned int ossim_uint32
virtual ossimObject * dup() const
std::vector< ossimQuadTreeWarpNode * > theChildren
void removeVertex(ossimQuadTreeWarpVertex *v)
ossimQuadTreeWarpVertex * theUlVertex
const std::vector< ossimQuadTreeWarpVertex * > & getVertices() const
bool recursiveSave(ossimQuadTreeWarpNode *node, ossimKeywordlist &kwl, const char *prefix) const
static const char * UL_Y_KW
ossimQuadTreeWarpNode * findNode(const ossimDpt &pt)
ossimQuadTreeWarpVertex * theLlVertex
void getNewQuads(ossimQuadTreeWarpNode *parent, const ossimDrect &ul, const ossimDrect &ur, const ossimDrect &lr, const ossimDrect &ll, ossimQuadTreeWarpNode *&ulNode, ossimQuadTreeWarpNode *&urNode, ossimQuadTreeWarpNode *&lrNode, ossimQuadTreeWarpNode *&llNode)
ossimQuadTreeWarpVertex * getVertex(const ossimDpt &position)
ossimQuadTreeWarpVertex * theUrVertex
ossim_float64 height() const
bool isOnPoint(ossimQuadTreeWarpNode *node, const ossimDpt &point) const
void create(const ossimDrect &boundingRect, const ossimDpt &ulShift=ossimDpt(0, 0), const ossimDpt &urShift=ossimDpt(0, 0), const ossimDpt &lrShift=ossimDpt(0, 0), const ossimDpt &llShift=ossimDpt(0, 0))
void recursiveDelete(ossimQuadTreeWarpNode *node)
ossimQuadTreeWarpVertex(const ossimDpt &position=ossimDpt(0, 0), const ossimDpt &delta=ossimDpt(0, 0))
bool loadState(const ossimKeywordlist &kwl, const char *prefix)
virtual ~ossimQuadTreeWarp()
ossimDpt midPoint() const
virtual ossimDpt getOrigin() const
void addSharedNode(ossimQuadTreeWarpNode *node)
void updateAllVericeLockFlags()
const ossimDpt & ur() const
ossimQuadTreeWarpVertex * findVertex(const ossimDpt &position)
bool hasValidVertices() const
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string's contents...
void removeSharedVertex(ossimQuadTreeWarpVertex *v)
ossimQuadTreeWarpNode * getRoot()
const ossimDpt & ll() const
std::vector< ossimQuadTreeWarpVertex * > theVertexList
void getBounds(double &minx, double &miny, double &maxx, double &maxy) const
RTTI_DEF1(ossimQuadTreeWarp, "ossimQuadTreeWarp", ossim2dTo2dTransform)
std::vector< ossimQuadTreeWarpNode * > theSharedNodeList
const ossimDpt & lr() const
void setPosition(const ossimDpt &position)
void updateLockFlag(ossimQuadTreeWarpVertex *v)
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
void setWarpEnabledFlag(bool flag)
virtual void printVertices(std::ostream &out) const