示例#1
0
void KDTree<Dim>::buildKDTree(int dimension, int bottom, int top)
{
    if(top == bottom)
    {
        return; //"base case"
    }

    int middle = (top+bottom)/2;//declare middle

    //call the "choose" helper function to sort of split this thing
    choose(middle, bottom, top, dimension);



    if(top > middle) //check upper end
    {
        //make recursive call
        buildKDTree((dimension+1)%Dim, middle+1, top); //call this thing on the upper end
    }

    if(bottom < middle) //check lower end
    {
        //make recursive call
        buildKDTree((dimension+1)%Dim, bottom, middle-1); //call this thing on the lower end
    }



}
示例#2
0
Node* buildKDTree(const PrimList& prims, const Aabb& box, int depth = 0) {
    if (prims.size() < 4)
        return Node::make(prims);

    if (depth >= 20)
        return Node::make(prims);

    Aabb           leftBox, rightBox;
    uint8_t        axis = 3;
    const floating split = getOptimalSplitPosition(prims, box, axis);
    box.split_at(leftBox, rightBox, axis, split);

    if (leftBox.volume() <= epsilon || rightBox.volume() <= epsilon)
        return Node::make(prims);

    PrimList lefts, rights;
    for (auto p : prims) {
        if (p->getLeftExtreme(axis) < split) {
            lefts.push_back(p);
        }

        if (p->getRightExtreme(axis) >= split) {
            rights.push_back(p);
        }
    }

    Node* out = Node::make();
    out->m_split = split;
    out->m_axis = axis;
    out->m_left = buildKDTree(lefts, leftBox, depth + 1);
    out->m_right = buildKDTree(rights, rightBox, depth + 1);
    return out;
}
void IntegralImages::load(QString path, QStringList fileNameList, bool treeNeeded, Parameter parameter_p){

	clean(); // clean the last round

	parameter = parameter_p;

	//compute the parameter related variable
	patchStepUpper = parameter.patchSizeUpper - parameter.OverlapSizeUpper;
	numIndexPatchColUpper = (imageCol - parameter.patchSizeUpper)/patchStepUpper + 1;
    numIndexPatchRowUpper = (imageRow - parameter.patchSizeUpper)/patchStepUpper + 1;

	patchStepLower = parameter.patchSizeLower - parameter.OverlapSizeLower;
    numIndexPatchColLower = (imageCol - parameter.patchSizeLower)/patchStepLower + 1;
    numIndexPatchRowLower = (imageRow - parameter.patchSizeLower)/patchStepLower + 1;

    commonTool.log(QString("Loading %1 images from path %2.").arg(fileNameList.size()).arg(qPrintable(path)));

    for (int i = 0; i < fileNameList.size(); i++) {
        QString imagePath;
        imagePath = path + "/" + fileNameList.at(i);
        commonTool.log(QString("Loading %1.").arg(fileNameList.at(i)));
        IntegralImage* const image = new IntegralImage(imagePath);
        integralImages.push_back(image);
    }

	imageRow = integralImages[0]->getImageRow();
	imageCol = integralImages[0]->getImageCol();

	if (treeNeeded == true){
        commonTool.log("Building upper face synthesize tree.");
		buildKDTree(_INTEGRALIMAGES_UPPER_);
        commonTool.log("Building lower face synthesize tree.");
		buildKDTree(_INTEGRALIMAGES_LOWER_);
	}
}
示例#4
0
文件: KDTree.cpp 项目: SatanWoo/RVO
void KDTree::buildKDTree(KDNode *root, const std::vector<KDTuple> &points, KDSplitAxis axis)
{
    if (root == NULL || points.size() <= 0) return;
    if (points.size() == 1)
    {
        root->points.push_back(points[0]);
        return;
    }
    
    std::vector<double> splitValues;
    for (size_t i = 0; i < points.size(); i++)
    {
        splitValues.push_back(points[i][axis]);
    }
    std::sort(splitValues.begin(), splitValues.end());
    
    double middle = findMiddleValue(splitValues);
    
    KDSplitAxis next = (KDSplitAxis)(1 - axis);
    
    std::vector<KDTuple> leftPoints;
    std::vector<KDTuple> rightPoints;
    for (size_t i = 0; i < points.size(); i++)
    {
        double val = points[i][axis];
        if (val < middle)
        {
            leftPoints.push_back(points[i]);
        }
        else if (val > middle)
        {
            rightPoints.push_back(points[i]);
        }
        else
        {
            root->points.push_back(points[i]);
        }
    }
    
    if (leftPoints.size() > 0)
    {
        root->left = new KDNode(next);
        root->left->parent = root;
        buildKDTree(root->left, leftPoints, next);
    }
    
    if (rightPoints.size() > 0) {
        root->right = new KDNode(next);
        root->right->parent = root;
        buildKDTree(root->right, rightPoints, next);
    }
}
示例#5
0
void Shape::init(VertexList& vertexList, FaceList& faceList, STLVectorf& UVList)
{
  setVertexList(vertexList);
  setFaceList(faceList);
  setUVCoord(UVList);

  color_list.resize(vertex_list.size(), 0.5);

  std::cout<<"Building face adjacent list...\n";
  buildFaceAdj();

  std::cout<<"Building 1-ring neighbors list...\n";
  buildVertexShareFaces();

  std::cout<<"Building vertex adjacent list...\n";
  buildVertexAdj();

  std::cout << "Building edge connectivity...\n";
  computeEdgeConnectivity();

  std::cout<<"Computing bounding box...\n";
  computeBounds();

  std::cout<<"Computing face normals...\n";
  computeFaceNormal();
  computeVertexNormal();

  buildKDTree();
}
示例#6
0
void Shape::updateShape(VertexList& new_vertex_list)
{
  vertex_list = new_vertex_list;

  computeFaceNormal();

  computeVertexNormal();

  computeBounds();

  buildKDTree();
}
示例#7
0
KDTree<Dim>::KDTree(const vector< Point<Dim> > & newPoints)
{
    /**
     * @todo Implement this function!
     */

    points = newPoints;

    if(points.size() != 0)//if points isn't empty
    {
        //call the helper and build this thing!
        buildKDTree(0, 0, newPoints.size()-1);//dont forget -1 to account for zeroth term;
    }
}
示例#8
0
void KdTreePrimitiveManager::init() {
    if (m_prims.empty())
        return;

    for (uint8_t i = 0; i < 3; ++i) {
        m_bbox.m_p1[i] = m_prims.front()->getLeftExtreme(i);
        m_bbox.m_p2[i] = m_prims.front()->getRightExtreme(i);
    }

    for (auto prim : m_prims) {
        for (uint8_t i = 0; i < 3; ++i) {
            const floating l = prim->getLeftExtreme(i);
            const floating r = prim->getRightExtreme(i);
            m_bbox.m_p1[i] = fmin(m_bbox.m_p1[i], l);
            m_bbox.m_p2[i] = fmax(m_bbox.m_p2[i], r);
        }
    }

    m_root = buildKDTree(m_prims, m_bbox);
    std::cerr << "KD Tree built! Tree has " << m_root->treeSize()
              << " nodes and has " << m_root->depth() << " levels."
              << std::endl;
}
void KDTreeRayTracer::setScene(Scene &sc)
{
	scene = sc;
	buildKDTree();
}
示例#10
0
KDNode* KDNode::buildKDTree(vector<Point*> points, int depth, KDNode* p){
	//DEBUG_MSG("Got " << points.size() << " points" <<endl);
	if(points.empty()){
		return NULL;
	}

	_workingAxis = depth % NUM_DIMENSIONS;

	//DEBUG_MSG("Set axis="<< _workingAxis <<endl);


	//Sort vector of points
	sort(points.begin(), points.end(), axisSort);

	int medianIndex = (points.size()>>1);

	//DEBUG_MSG("medianIndex="<< medianIndex <<endl);


	vector<Point*>::iterator median = points.begin()+medianIndex;

	//DEBUG_MSG("Newing KDNode"<<endl);

	KDNode* node = new KDNode(p);

	//DEBUG_MSG("Newed"<<endl);

	if(points.size() > 0){
		node->topLeft = *points.front();
		node->bottomRight = *points.front();
	}

	for(uint32_t i=0; i<points.size(); i++){
		Point* p=points[i];

		if(p->x < node->topLeft.x){
			node->topLeft.x = p->x;
		}
		if(p->x > node->bottomRight.x){
			node->bottomRight.x = p->x;
		}

		if(p->y > node->topLeft.y){
			node->topLeft.y = p->y;
		}
		if(p->y < node->bottomRight.y){
			node->bottomRight.y = p->y;
		}
	}

	node->depth = depth;
	node->direction = _workingAxis;

	//DEBUG_MSG("**median"<<endl);

	node->location = **median;

	//DEBUG_MSG("Building left"<<endl);

	vector<Point*> leftPoints = vector<Point*>(points.begin(), median);

	//DEBUG_MSG("leftPoints has "<< leftPoints.size() << "elements" << endl);

	node->left = buildKDTree(leftPoints, depth+1, node);

	//DEBUG_MSG("Building right"<<endl);

	vector<Point*> rightPoints = vector<Point*>(median+1, points.end());

	//DEBUG_MSG("rightPoints has "<< rightPoints.size() << "elements" << endl);

	node->right = buildKDTree(rightPoints, depth+1, node);

	return node;
}
示例#11
0
bool BkgdObsKDLoader::loadBkgdObs(QList<real> &bgIn)
{
  int time;
  real lat, lon, alt, u, v, w, t, qv, rhoa, qr;
  real Pi = acos(-1);

  KD_tree *kdTree;

  QDateTime startTime = frameVector.front().getTime();
  QDateTime endTime = frameVector.back().getTime();

  std::cout << "Start time: " << startTime.toTime_t() << " "
	    << startTime.toString("yyyy-MM-dd-HH:mm:ss").toLatin1().data() << std::endl;
  std::cout << "End  time:  " << endTime.toTime_t()  << " "
	    << endTime.toString("yyyy-MM-dd-HH:mm:ss").toLatin1().data() << std::endl;
  
  // background is in km, ROI is gridpoints
  // TODO that comment doesn't seem correct. These are set to 45.0 in the config file...
  
  iROI = configHash->value("i_background_roi").toFloat() / iincr;
  jROI = configHash->value("j_background_roi").toFloat() / jincr;

  maxGridDist = 3.0;
  
  int timeProblem = 0;
  int domainProblem = 0;

  int debugKd = 0;
  if (configHash->contains("debug_kd") ) {
    debugKd = configHash->value("debug_kd").toInt();
    std::cout << "*** dbugKD: " << debugKd << std::endl;    
  }

  int debugKdStep = 0;
  if (configHash->contains("debug_kd_step") ) {
    debugKdStep = configHash->value("debug_kd_step").toInt();
    std::cout << "*** Debug KD Step: " << debugKdStep << std::endl;
  }
  
  while( bkgdAdapter->next(time, lat, lon, alt, u, v, w, t, qv, rhoa, qr) ) {
    // Process the bkgdObs into Observations
    int tci;
    if (! timeCheck(time, startTime, endTime, tci)) {
      timeProblem++;
      continue;
    }
      
    real Um = frameVector[tci].getUmean();
    real Vm = frameVector[tci].getVmean();

    // Get the X, Y & Z
    real tcX, tcY, metX, metY;
    real referenceLon = configHash->value("ref_lon").toFloat();
    
    projection.Forward(referenceLon, frameVector[tci].getLat() , frameVector[tci].getLon(),
		       tcX, tcY);
    projection.Forward(referenceLon, lat, lon , metX, metY);
    bgX = (metX - tcX) / 1000.;
    bgY = (metY - tcY) / 1000.;

    real heightm = (alt > 10.0) ? alt : 10;	// don't want to take log of zero below...
    
    bgZ = heightm / 1000.;
    bgRadius = sqrt(bgX * bgX + bgY * bgY);
    bgTheta = 180.0 * atan2(bgY, bgX) / Pi;
    if (configHash->value("allow_negative_angles") != "true")
      if (bgTheta < 0)
	bgTheta += 360.0;

    // Make sure the ob is in the Interpolation domain
    
    if (runMode == RUN_MODE_XYZ) {
      if ((bgX < (imin - iincr - (iROI * iincr * maxGridDist))) or
	  (bgX > (imax + iincr + (iROI * iincr * maxGridDist))) or
	  (bgY < (jmin - jincr - (jROI * jincr * maxGridDist))) or
	  (bgY > (jmax + jincr + (jROI * jincr * maxGridDist))) or
	  (bgZ < kmin)) { //Allow for higher values for interpolation purposes
	domainProblem++;
	continue;
      }
    } else if (runMode == RUN_MODE_RTZ) {
      if ((bgRadius < (imin - iincr - (iROI * iincr * maxGridDist))) or
	  (bgRadius > (imax + iincr + (iROI * iincr * maxGridDist))) or
	  (bgTheta < jmin - jincr - (jROI * jincr * maxGridDist)) or
	  (bgTheta > jmax + jincr + (jROI * jincr * maxGridDist)) or
	  (bgZ < kmin)) { //Exceeding the Theta domain only makes sense for sectors
	domainProblem++;
	continue;
      }
      real cylUm = (Um * bgX + Vm * bgY) / bgRadius;
      real cylVm = (-Um * bgY + Vm * bgX) / bgRadius;
      Um = cylUm;
      Vm = cylVm;
    }

    // Reference states
    real rhoBar = refstate->getReferenceVariable(ReferenceVariable::rhoaref, heightm);
    real qBar = refstate->getReferenceVariable(ReferenceVariable::qvbhypref, heightm);
    real tBar = refstate->getReferenceVariable(ReferenceVariable::tempref, heightm);

    real rho = rhoa + rhoa * qv / 1000.;
    real rhou = rho * (u - Um);
    real rhov = rho * (v - Vm);
    real rhow = rho * w;
    real tprime = t - tBar;
    qv = refstate->bhypTransform(qv);
    real qvprime = qv - qBar;
    real rhoprime = (rhoa - rhoBar) * 100;
    real logZ = log(bgZ);

    if (configHash->value("qr_variable") == "qr")
      qr = refstate->bhypTransform(qr);
    
    // We assume here that the background precipitation field is always zero
    // real qr = 0.;

    if (runMode == RUN_MODE_XYZ) {
      bgIn << bgX << bgY << logZ << time << rhou << rhov << rhow << tprime << qvprime << rhoprime << qr ;
    } else if (runMode == RUN_MODE_RTZ)
      bgIn << bgRadius << bgTheta << logZ << time << rhou << rhov << rhow << tprime
	   << qvprime << rhoprime << qr;

  } // each obs

  std::cout << "timeProblem: " << timeProblem << ", domainProblem: " << domainProblem
            << std::endl;
  
  int numbgObs = bgIn.size() / 11; // 11 entries per ob
  
  if (numbgObs <= 0) {
    std::cout << "No background observations loaded" << std::endl;
    return false;
  }
  
  std::cout << numbgObs << " background observations loaded" << std::endl;
  
  if (isTrue("debug_bgIn"))
    dumpBgIn(0, numbgObs, bgIn);

  // All the obs are now loaded in bgIn. Build a KD tree
  
  kdTree = buildKDTree(bgIn);
  QVector<int> emptybg;
  
  KD_real *centerLoc = new KD_real[3];	// 3 dim
  int nbrMax  = configHash->value("bkgd_kd_num_neighbors").toInt();
  if (nbrMax <= 0) {
    std::cerr << "Number of neighbors must be greater than 0." << std::endl;
    return false;
  }
  float maxDist = configHash->value("bkgd_kd_max_distance").toFloat();
  // KD tree returns the square of the distance...
  maxDist *= maxDist;

  // For each point on the mish

  std::cout << "*** idim: " << idim << ", jdim: " << jdim << ", kdim: " << kdim << std::endl;
  
  if (debugKd)
    std::cout << "--- start of debug kd" << std::endl;
  
  for (int ii = -1; ii < (idim); ii++) {
    for (int imu = -1; imu <= 1; imu += 2) {
      real iPos = imin + iincr * (ii + (0.5 * sqrt(1. / 3.) * imu + 0.5));
	    
      for (int ji = -1; ji < (jdim); ji++) {
	for (int jmu = -1; jmu <= 1; jmu += 2) {
	  real jPos = jmin + jincr * (ji + (0.5 * sqrt(1. / 3.) * jmu + 0.5));
		
	  for (int ki = -1; ki < (kdim); ki++) {
	    for (int kmu = -1; kmu <= 1; kmu += 2) {
	      real kPos = kmin + kincr * (ki + (0.5 * sqrt(1. / 3.) * kmu + 0.5));
	
	      int bgI = (ii + 1) * 2 + (imu + 1) / 2;
	      int bgJ = (ji + 1) * 2 + (jmu + 1) / 2;
	      int bgK = (ki + 1) * 2 + (kmu + 1) / 2;

	      // std::cout << "iPos: " << iPos << ", jPos: " << jPos << ", kPos: " << kPos << std::endl;
	      // std::cout << "bgI: " << bgI << ", bgJ: " << bgJ << ", bgK " << bgK << std::endl;
	      // continue;
	      
	      // index into bgU (flat array)
	      int bIndex = numVars * (idim + 1) * 2 * (jdim + 1) * 2 * bgK
		+ numVars * (idim + 1) * 2 * bgJ + numVars * bgI;

	      // Do the KD tree here.
	      // give me the n nearest neighbors and average.

	      centerLoc[0] = iPos;
	      centerLoc[1] = jPos;
	      centerLoc[2] = kPos;

	      fillBguEntry(centerLoc, nbrMax, maxDist, bgIn, kdTree, bgU, bIndex, emptybg, debugKd);
	      if (debugKd > 0)
		debugKd -= debugKdStep;
	    }
	  }
	}
      }
    }
  }

  if (emptybg.size() > 0)
    std::cout << "** KD left " << emptybg.size() << " holes in bgU" << std::endl;
  
  if (debugKd)
    std::cout << "--- end of debug kd" << std::endl;

  if (configHash->contains("debug_bgU_overwrite"))
    overwriteBgu(configHash->value("debug_bgU_overwrite").toLatin1().data());
  
  if (isTrue("debug_bgU")) {
    dumpBgU(0, uStateSize, bgU);
  }
  
  if (configHash->contains("debug_bgU_nc"))
    bgu2nc(configHash->value("debug_bgU_nc").toLatin1().data(), bgU);
  
  return true;
}