Esempio n. 1
0
void KdTree::buildAgentTreeRecursive(size_t begin, size_t end, size_t node)
{
    agentTree_[node].begin = begin;
    agentTree_[node].end = end;
    agentTree_[node].minX = agentTree_[node].maxX = agents_[begin]->position_.x();
    agentTree_[node].minY = agentTree_[node].maxY = agents_[begin]->position_.y();

    for (size_t i = begin + 1; i < end; ++i) {
        agentTree_[node].maxX = std::max(agentTree_[node].maxX, agents_[i]->position_.x());
        agentTree_[node].minX = std::min(agentTree_[node].minX, agents_[i]->position_.x());
        agentTree_[node].maxY = std::max(agentTree_[node].maxY, agents_[i]->position_.y());
        agentTree_[node].minY = std::min(agentTree_[node].minY, agents_[i]->position_.y());
    }

    if (end - begin > MAX_LEAF_SIZE) {
        /* No leaf node. */
        const bool isVertical = (agentTree_[node].maxX - agentTree_[node].minX > agentTree_[node].maxY - agentTree_[node].minY);
        const float splitValue = (isVertical ? 0.5f * (agentTree_[node].maxX + agentTree_[node].minX) : 0.5f * (agentTree_[node].maxY + agentTree_[node].minY));

        size_t left = begin;
        size_t right = end;

        while (left < right) {
            while (left < right && (isVertical ? agents_[left]->position_.x() : agents_[left]->position_.y()) < splitValue) {
                ++left;
            }

            while (right > left && (isVertical ? agents_[right-1]->position_.x() : agents_[right-1]->position_.y()) >= splitValue) {
                --right;
            }

            if (left < right) {
                std::swap(agents_[left], agents_[right-1]);
                ++left;
                --right;
            }
        }

        size_t leftSize = left - begin;

        if (leftSize == 0) {
            ++leftSize;
            ++left;
            ++right;
        }

        agentTree_[node].left = node + 1;
        agentTree_[node].right = node + 1 + (2 * leftSize - 1);

        buildAgentTreeRecursive(begin, left, agentTree_[node].left);
        buildAgentTreeRecursive(left, end, agentTree_[node].right);
    }
}
Esempio n. 2
0
void KdTree::buildAgentTree()
{
	agents_ = sim_->agents_;

	if (!agents_.empty()) {
		agentTree_.resize(2 * agents_.size() - 1);
		buildAgentTreeRecursive(0, agents_.size(), 0);
	}
}
Esempio n. 3
0
	void KdTree::buildAgentTree()
	{
		if (agents_.size() < sim_->agents_.size()) {
			for (size_t i = agents_.size(); i < sim_->agents_.size(); ++i) {
				agents_.push_back(sim_->agents_[i]);
			}

			agentTree_.resize(2 * agents_.size() - 1);//TODO
		}

		if (!agents_.empty()) {
			buildAgentTreeRecursive(0, agents_.size(), 0);
		}
	}
Esempio n. 4
0
void KdTree::buildAgentTree()
{
    agents_.resize(0);
    for (size_t i = 0; i < sim_->agents_.size(); ++i) {
        if (sim_->agents_[i] != NULL) {
            agents_.push_back(sim_->agents_[i]);

        }
    }

    if (!agents_.empty()) {
        if (agents_.size() * 2 > agentTree_.size() + 1) {
            agentTree_.resize(2 * agents_.size() - 1);
        }
        buildAgentTreeRecursive(0, agents_.size(), 0);
    }
}
Esempio n. 5
0
void KdTree::buildAgentTreeRecursive(size_t begin, size_t end, size_t node)
{
	agentTree_[node].begin = begin;
	agentTree_[node].end = end;
	agentTree_[node].minCoord = agents_[begin]->position_;
	agentTree_[node].maxCoord = agents_[begin]->position_;

	for (size_t i = begin + 1; i < end; ++i) {
		agentTree_[node].maxCoord[0] = std::max(agentTree_[node].maxCoord[0], agents_[i]->position_.x());
		agentTree_[node].minCoord[0] = std::min(agentTree_[node].minCoord[0], agents_[i]->position_.x());
		agentTree_[node].maxCoord[1] = std::max(agentTree_[node].maxCoord[1], agents_[i]->position_.y());
		agentTree_[node].minCoord[1] = std::min(agentTree_[node].minCoord[1], agents_[i]->position_.y());
		agentTree_[node].maxCoord[2] = std::max(agentTree_[node].maxCoord[2], agents_[i]->position_.z());
		agentTree_[node].minCoord[2] = std::min(agentTree_[node].minCoord[2], agents_[i]->position_.z());
	}

	if (end - begin > RVO_MAX_LEAF_SIZE) {
		/* No leaf node. */
		size_t coord;

		if (agentTree_[node].maxCoord[0] - agentTree_[node].minCoord[0] > agentTree_[node].maxCoord[1] - agentTree_[node].minCoord[1] && agentTree_[node].maxCoord[0] - agentTree_[node].minCoord[0] > agentTree_[node].maxCoord[2] - agentTree_[node].minCoord[2]) {
			coord = 0;
		}
		else if (agentTree_[node].maxCoord[1] - agentTree_[node].minCoord[1] > agentTree_[node].maxCoord[2] - agentTree_[node].minCoord[2]) {
			coord = 1;
		}
		else {
			coord = 2;
		}

		const float splitValue = 0.5f * (agentTree_[node].maxCoord[coord] + agentTree_[node].minCoord[coord]);

		size_t left = begin;

		size_t right = end;

		while (left < right) {
			while (left < right && agents_[left]->position_[coord] < splitValue) {
				++left;
			}

			while (right > left && agents_[right - 1]->position_[coord] >= splitValue) {
				--right;
			}

			if (left < right) {
				std::swap(agents_[left], agents_[right - 1]);
				++left;
				--right;
			}
		}

		size_t leftSize = left - begin;

		if (leftSize == 0) {
			++leftSize;
			++left;
			++right;
		}

		agentTree_[node].left = node + 1;
		agentTree_[node].right = node + 1 + (2 * leftSize - 1);

		buildAgentTreeRecursive(begin, left, agentTree_[node].left);
		buildAgentTreeRecursive(left, end, agentTree_[node].right);
	}
}