示例#1
0
int Node::calculate_height(Node *root)
{
    if (!root)
        return 0;
    root->height = max(calculate_height(root->left), calculate_height(root->right)) + 1;
    return root->height;
}
示例#2
0
void Node::rotate_clockwise(Node *&root)
{
    Node * temp = root;
    root = temp->left;
    temp->left = root->right;
    root->right = temp;
    calculate_height(root);
    calculate_height(temp);
    //cout << "rotation right";
}
node* left_rotate(node* root)
{
    node* oldRoot = root;
    root = oldRoot->right;
    oldRoot->right = root->left;
    root->left = oldRoot;

    oldRoot->ht = calculate_height(oldRoot);
    root->ht = calculate_height(root);

    return root;
}
示例#4
0
文件: lab4-4.c 项目: Grulfen/tsbk07
void check_keys(void){
        VectorSub(&obj_pos, &cam_pos, &vdiff);
        if(!fly){
                vdiff.y = 0;
        }
        if(keyIsDown('w')){
                ScalarMult(&vdiff, move_speed, &vdiff);
                Normalize(&vdiff);
                VectorAdd(&vdiff, &cam_pos, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorAdd(&vdiff, &obj_pos, &obj_pos);
        } else if (keyIsDown('s')) {
                ScalarMult(&vdiff, move_speed, &vdiff);
                Normalize(&vdiff);
                VectorSub(&cam_pos, &vdiff, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorSub(&obj_pos, &vdiff, &obj_pos);
        } else if (keyIsDown('a')) {
                CrossProduct(&up, &vdiff, &vdiff);
                Normalize(&vdiff);
                ScalarMult(&vdiff, move_speed, &vdiff);
                VectorAdd(&vdiff, &cam_pos, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorAdd(&vdiff, &obj_pos, &obj_pos);
        } else if (keyIsDown('d')) {
                CrossProduct(&up, &vdiff, &vdiff);
                Normalize(&vdiff);
                ScalarMult(&vdiff, move_speed, &vdiff);
                VectorSub(&cam_pos, &vdiff, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorSub(&obj_pos, &vdiff, &obj_pos);                                
        } else if (keyIsDown('q')) {
                exit(0);
        } else if (keyIsDown('p')) {
                printf("Your position is; x=%f, y=%f, z=%f\n", cam_pos.x, cam_pos.y, cam_pos.z);
                printf("Ground height is; y=%f\n", calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray));
        } else if (keyIsDown('f')){
                fly = !fly; 
        }
}
示例#5
0
文件: lab4-4.c 项目: Grulfen/tsbk07
void display(void)
{
	// clear the screen
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	GLfloat modelView[16], camMatrix[16], cam_Matrix_skybox[16], total[16];
	
	printError("pre display");
	
	check_keys();

        t += 1;

	glUseProgram(program);

	// Build matrix
	
	lookAt(&cam_pos, &obj_pos, up.x, up.y, up.z, camMatrix);
        CopyMatrix(camMatrix, cam_Matrix_skybox);
        cam_Matrix_skybox[3] = 0;
        cam_Matrix_skybox[7] = 0;
        cam_Matrix_skybox[11] = 0;
        cam_Matrix_skybox[15] = 1;
        // disable z-buffer for skybox
        glDisable(GL_DEPTH_TEST);

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Draw skybox
        // Set the skybox variable 
        glUniform1i(glGetUniformLocation(program, "skybox"), 1);
        T(0,-0.5,0,modelView);
        Mult(cam_Matrix_skybox, modelView, total);
        glUniformMatrix4fv(glGetUniformLocation(program, "mdlMatrix"), 1, GL_TRUE, total);
        glBindTexture(GL_TEXTURE_2D, skytex);
        DrawModel(skybox, program, "inPosition", "inNormal", "inTexCoord");

        glUniform1i(glGetUniformLocation(program, "skybox"), 0);
        glEnable(GL_DEPTH_TEST);
        // Bind terrain
	IdentityMatrix(modelView);
	Mult(camMatrix, modelView, total);
	glUniformMatrix4fv(glGetUniformLocation(program, "mdlMatrix"), 1, GL_TRUE, total);
	// Bind Our Texture tex1
	glBindTexture(GL_TEXTURE_2D, tex1);		
	DrawModel(tm, program, "inPosition", "inNormal", "inTexCoord");

        // Draw sphere
        sphere_pos = update_sphere(t, total);
        sphere_pos.y = calculate_height(sphere_pos.x, sphere_pos.z, ttex.width, vertexArray);
        T(sphere_pos.x, sphere_pos.y, sphere_pos.z, trans);
        Mult(camMatrix, trans, total);
        //Ry(0.01*t, roty);
	glUniformMatrix4fv(glGetUniformLocation(program, "mdlMatrix"), 1, GL_TRUE, total);
	glBindTexture(GL_TEXTURE_2D, spheretex);		
	DrawModel(sphere, program, "inPosition", "inNormal", "inTexCoord");

	printError("display 2");
	
	glutSwapBuffers();
}
示例#6
0
文件: avl.c 项目: AlexTalks/bazel
static gpr_avl_node *assert_invariants(gpr_avl_node *n) {
  if (n == NULL) return NULL;
  assert_invariants(n->left);
  assert_invariants(n->right);
  assert(calculate_height(n) == n->height);
  assert(labs(node_height(n->left) - node_height(n->right)) <= 1);
  return n;
}
示例#7
0
int PanelMenu::popup()
{
    m_open = true;
    redraw(); // push down button
    calculate_height();
    int retval = Fl_Menu_::popup(0, 0-Height);//, w(), h());
    m_open = false;
    redraw();
    return retval;
}
示例#8
0
int MainMenu::popup(int X, int Y, int W, int H)
{
    if(Fl::event_button()==1) {
        m_open = true;
        init_entries();
        int newy=Y-calculate_height()-h()-1;
        // mainmenu is inside a group:
        if (parent()->parent()->y()+newy<1) newy=Y;
        int ret = Fl_Menu_::popup(X, newy, W, H);
        clear();
        m_open = false;
        return ret;
    }
    return 0;
}
示例#9
0
void task_button_cb(TaskButton *b, Window w)
{
    if(Fl::event_button()==FL_RIGHT_MOUSE) {
        TaskButton::pushed = b;

        TaskButton::menu->color(b->color());
        TaskButton::menu->popup(Fl::event_x(), Fl::event_y()-calculate_height(TaskButton::menu));

    } else {
        if(TaskBar::active==w) {
            XIconifyWindow(fl_display, w, fl_screen);
            XSync(fl_display, True);
            TaskBar::active = 0;
        } else {
            Fl_WM::set_active_window(w);
        }
    }
}
node* insert(node* root, int val)
{
    if (val < root->val) {
        if (root->left == NULL) {
            root->left = create_node(val);
        } else {
            root->left = insert(root->left, val);
        }
    } else if (val > root->val) {
        if (root->right == NULL) {
            root->right = create_node(val);
        } else {
            root->right = insert(root->right, val);
        }
    }

    root->ht = calculate_height(root);

    return balance(root);
}
示例#11
0
文件: avl.c 项目: AlexTalks/bazel
static long calculate_height(gpr_avl_node *node) {
  return node == NULL ? 0 : 1 + GPR_MAX(calculate_height(node->left),
                                        calculate_height(node->right));
}
示例#12
0
int Node::get_balance(Node *root)
{
    if(root)
        return calculate_height(root->left) - calculate_height(root->right);
    return 0;
}