Example #1
0
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;
}
Example #2
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);
    }
}
Example #3
0
// ------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
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;
}