Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/graphics/spatial_separation/quadtree.cc @ 4924

Last change on this file since 4924 was 4924, checked in by patrick, 19 years ago

orxonox/trunk: the last cleanups, now the classes look better

File size: 5.2 KB
RevLine 
[4790]1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
[4924]11### File Specific:
[4790]12   main-programmer: Patrick Boenzli
13   co-programmer: ...
14*/
15
[4808]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_SPATIAL_SEPARATION
[4790]17
18#include "quadtree.h"
[4923]19
[4845]20#include "quadtree_node.h"
[4917]21#include "vector.h"
[4790]22
[4924]23#include "material.h"
24
25
[4790]26using namespace std;
27
28
29/**
[4836]30 *  standard constructor
[4924]31 */
[4898]32Quadtree::Quadtree (modelInfo* pModelInfo, const int treeDepth)
[4790]33{
[4924]34  this->setClassID(CL_QUADTREE, "Quadtree");
35  this->pModelInfo = pModelInfo;
36  this->treeDepth = treeDepth;
[4845]37
[4924]38  /* initialize the materials for debug draw */
39  this->materials = new Material*[4];
40  for(int i = 0; i < 4; ++i)
41  {
42    materials[i] = new Material();
43    materials[i]->setIllum(3);
44  }
45  materials[0]->setAmbient(0.0, 0.3, 0.0);
46  materials[1]->setAmbient(0.4, 0.0, 0.2);
47  materials[2]->setAmbient(1.0, 0.0, 0.0);
48  materials[3]->setAmbient(5.0, 3.0, 1.0);
[4901]49
[4924]50  /* build the tree */
51  this->rootNode = new QuadtreeNode(this->pModelInfo, this, this->treeDepth);
[4901]52
[4924]53  /* make an array with access to the leafs of the Quad-Tree */
54  this->nodes = new QuadtreeNode*[(int)pow(4, treeDepth)];
55  int* index = new int; *index = 0;
56  for(int i = 0; i < (int)pow(2, treeDepth); ++i)
57  {
58    this->rootNode->buildHashTable(this->nodes, index);
59  }
60  /* sort and revert the hash table to fit the right position */
61  this->sortHashTable(this->nodes);
62  this->revertHashTable(this->nodes);
[4920]63
[4924]64  /* define some important and often used variables */
65  this->quadLength = this->nodes[0]->getDimension()->getAxis() * 2.0f;
66  Rectangle* r = this->rootNode->getDimension();
67  Vector* offset = new Vector();
68  float xOff = r->getCenter()->x - r->getAxis();
69  float yOff = r->getCenter()->z - r->getAxis();
70  this->offset->x = xOff;
71  this->offset->z = yOff;
72  this->maxIndex = (int)pow(2, this->treeDepth);
[4790]73}
74
75
76/**
[4836]77 *  standard deconstructor
[4924]78 */
[4790]79Quadtree::~Quadtree ()
80{
81  // delete what has to be deleted here
[4907]82  delete [] this->nodes;
83  delete this->rootNode;
[4922]84  delete offset;
[4790]85}
[4812]86
87
88/**
[4924]89 *  this function rotates the array and mirrors it in the middle
90 * @param nodes: the nodes to translate
[4915]91
92  since the original matrix is counted from the right upper edge to the right lower one, we have to reorganize the elements
93  to be able to easily correlate the hashtable array indexes with the coorindates.
94 */
95void Quadtree::revertHashTable(QuadtreeNode** nodes)
96{
97  int                  len         = (int)pow(2, this->treeDepth);          //!< the length of a quadtree side
98  int                  iterator    = 0;                                     //!< iterator used for mapping
99  QuadtreeNode*        tmpNode     = NULL;                                  //!< temp saving place
100  int                  offset      = 0;                                     //!< offset used in the calc
101
102  for(int i = len - 1; i >= 0; --i)
103  {
104    for(int j = len - 1; j >= 0; --j)
105    {
106      offset = j * len + i;
107      /* only swap the elements in one direction */
108      if( offset > iterator)
109      {
110        tmpNode = nodes[offset];
111        nodes[offset] = nodes[iterator];
112        nodes[iterator] = tmpNode;
113      }
114      ++iterator;
115    }
116  }
117}
118
[4924]119
[4922]120/**
[4924]121 *  sorts the hash table using their positions
122 * @param nodes the nodes to use
[4922]123 */
[4920]124void Quadtree::sortHashTable(QuadtreeNode** nodes)
125{
126  int                  len         = (int)pow(2, this->treeDepth);          //!< the length of a quadtree side
[4922]127  float                a;                                                   //!< temp place for float a
128  float                b;                                                   //!< temp place for float b
129  QuadtreeNode*        tmpNode;                                             //!< tmp place for a QuadtreeNode
[4920]130
[4922]131  for( int i = 0; i < len; ++i)
[4920]132  {
[4922]133    for( int j = 0; j < len; ++j)
[4920]134    {
[4922]135      for( int k = j + 1; k < len; ++k)
[4920]136      {
137        a = this->nodes[i * len + j]->getDimension()->getCenter()->z;
138        b = this->nodes[i * len + k]->getDimension()->getCenter()->z;
139
140        if( b > a)
141        {
142          tmpNode = this->nodes[i * len + j];
143          this->nodes[i * len + j] = this->nodes[i * len + k];
144          this->nodes[i * len + k] = tmpNode;
145        }
146      }
147    }
[4922]148  }
[4920]149
150}
151
152
[4922]153/**
[4924]154 *  maps a position to a quadtree
155 * @param position the position so look for
156 * @return the quadtree
[4920]157
[4922]158  this function will return the quadtree that contains the position
159 */
[4917]160QuadtreeNode* Quadtree::getQuadtreeFromPosition(const Vector& position)
161{
[4920]162  /* shift into model space */
[4922]163  Vector v = position - *this->offset;
[4920]164  /* map */
[4922]165  int i = (int)(v.x / quadLength);
166  int j = (int)(v.z / quadLength);
[4917]167
[4922]168  /* check if object is still inside the terrain */
169  if( i < this->maxIndex && j < this->maxIndex)
170    this->nodes[i + j * this->maxIndex]->includesPoint(position);
[4920]171  else
[4922]172    PRINTF(0)("Object has left terrain\n");
[4917]173}
174
175
[4915]176/**
[4836]177 *  draws the debug quadtree boxes around the model
[4812]178 */
[4922]179void Quadtree::drawTree() const
[4889]180{
[4922]181  this->rootNode->drawTree();
182//   for(int i = 0; i < (int)pow(4, this->treeDepth); ++i)
183//   {
184//     this->nodes[i]->draw();
185//   }
[4889]186}
Note: See TracBrowser for help on using the repository browser.