int main() { int primes = 0; int corners = 1; int side_length; for (side_length = 3; ; side_length += 2) { corners += 4; primes += calculate_side(side_length); if (primes / (double) corners < .1) break; } printf("%d\n", side_length); return 0; }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ void cKdtree::m_draw_rec(cNodeKdtree *node, VVector &eye) { if(!node) return; if(!node->back && !node->front) { // eh uma folha m_draw_node(node); return; } VVector nor, p; get_att(node->axis, node->axis_value, nor, p); //int t = node->tri; int s = calculate_side(nor, p, eye); if(s == FRONT) { // estou na frente do no m_draw_rec(node->back, eye); //m_draw_node(node); m_draw_rec(node->front, eye); } else if(s == BACK) { //estou atras do no m_draw_rec(node->front, eye); //m_draw_node(node); m_draw_rec(node->back, eye); } else { m_draw_rec(node->front, eye); m_draw_rec(node->back, eye); } }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ cNodeKdtree* cKdtree::m_insert_rec(std::vector<cTriangle> &vet_tri, std::vector<VVector> &vet_vertex, std::vector<VVector> &vet_nor, int depth) { cNodeKdtree *node = NULL; if(vet_tri.empty()) { // ja eh uma folha return node; } if((int)vet_tri.size() == 1) { // vai ser a folha // insere no noh o indice do triangulo node = new cNodeKdtree(); add_triangle(vet_vertex[vet_tri[0].m_v[0]], vet_vertex[vet_tri[0].m_v[1]], vet_vertex[vet_tri[0].m_v[2]], m_data_tri, m_data_vet, m_data_nor); node->is_leaf = true; node->tri = (int) m_data_tri.size() - 1; return node; } std::vector<cTriangle> vet_tri_front; std::vector<VVector> vet_vertex_front, vet_nor_front; std::vector<cTriangle> vet_tri_back; std::vector<VVector> vet_vertex_back, vet_nor_back; // escolher o eixo e o valor do eixo int axis, axis_value; selected_plane_kdtree(vet_tri, vet_vertex, vet_nor, axis, axis_value, depth); printf("Axis: %d\tvalue: %d\n", axis, axis_value); VVector normal_plane, point; get_att(axis, axis_value, normal_plane, point); // cria o noh node = new cNodeKdtree(); node->is_leaf = false; node->axis = axis; node->axis_value = axis_value; vet_tri_front.clear(); vet_vertex_front.clear(); vet_nor_front.clear(); vet_tri_back.clear(); vet_vertex_back.clear(); vet_nor_back.clear(); // separar os triangulos for(int i = 0; i < (int)vet_tri.size(); i++) { int side = calculate_side(normal_plane, point, vet_vertex[vet_tri[i].m_v[0]], vet_vertex[vet_tri[i].m_v[1]], vet_vertex[vet_tri[i].m_v[2]]); if(side == CUT) { cut_triangle(normal_plane, point, i, vet_tri, vet_vertex, vet_nor, vet_tri_front, vet_vertex_front, vet_nor_front, vet_tri_back, vet_vertex_back, vet_nor_back); } else if(side == FRONT) { add_triangle(vet_vertex[vet_tri[i].m_v[0]], vet_vertex[vet_tri[i].m_v[1]], vet_vertex[vet_tri[i].m_v[2]], vet_tri_front, vet_vertex_front, vet_nor_front); } else// if(side == BACK) { add_triangle(vet_vertex[vet_tri[i].m_v[0]], vet_vertex[vet_tri[i].m_v[1]], vet_vertex[vet_tri[i].m_v[2]], vet_tri_back, vet_vertex_back, vet_nor_back); } } //vet_tri.clear(); vet_vertex.clear(); vet_nor.clear(); node->front = m_insert_rec(vet_tri_front, vet_vertex_front, vet_nor_front, depth + 1); node->back = m_insert_rec(vet_tri_back, vet_vertex_back, vet_nor_back, depth + 1); //vet_tri_front.clear(); vet_vertex_front.clear(); vet_nor_front.clear(); //vet_tri_back.clear(); vet_vertex_back.clear(); vet_nor_back.clear(); return node; }