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; }
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; }
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; } }
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(); }
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; }
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; }
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; }
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); }
static long calculate_height(gpr_avl_node *node) { return node == NULL ? 0 : 1 + GPR_MAX(calculate_height(node->left), calculate_height(node->right)); }
int Node::get_balance(Node *root) { if(root) return calculate_height(root->left) - calculate_height(root->right); return 0; }