static int handle_menu(int x1, int y1) { int x, y, a, i, j; /* scaled coordinates 0 - 999 */ x = x1*1000/menubg->w; y = y1*1000/menubg->h; if (Y_REG(LINE2)) { for (i = 0; i < NUM_TATAMIS; i++) { if (X_L(tatami_x[i])) { conf_tatamis[i] = !conf_tatamis[i]; configured_tatamis = 0; for (j = 0; j < NUM_TATAMIS; j++) if (conf_tatamis[j]) configured_tatamis++; for (j = 0; j < NUM_TATAMIS; j++) { if (configured_tatamis) show_tatami[j] = conf_tatamis[j]; else show_tatami[j] = match_list[j][1].blue && match_list[j][1].white; } return TRUE; } } } else if (Y_REG(LINE3)) { if (X_R(R1) && display_type < 2) { display_type++; num_lines = numlines[display_type]; return TRUE; } else if (X_L(L1) && display_type > 0) { display_type--; num_lines = numlines[display_type]; return TRUE; } } else if (Y_REG(LINE4)) { if (X_R(R1) || X_L(L1)) red_background = !red_background; return TRUE; } else if (Y_REG(LINE5)) { if (X_R(L1)) mirror_display = !mirror_display; return TRUE; } else if (Y_REG(LINE7)) { if (BETWEEN(X0, X0_1)) { emscripten_run_script("setfullscreen()"); menu_on = FALSE; return TRUE; } } else if ( x > 38 && x < 119 && y > 840 && y < 960) { menu_on = FALSE; return TRUE; } return FALSE; }
void cholesky_solve(double * A_L, double * A_U, double * B, double * X, int size) { // A[j * size + i] // B[i] // X[i] std::vector<double> X_R(size,0.0); // gauss_solve(&A_L[0], &B[0], &X_R[0], size); for (int i = 0; i <size ; i++) { X_R[i] = B[i]; for (int j = 0; j <i; j++) { X_R[i] -= A_L[i * size + j] * X_R[j]; } X_R[i] /= A_L[i * size + i]; } // gauss_solve(&A_U[0], &X_R[0], X, size); for (int i = size-1; i >=0 ; --i) { X[i] = X_R[i]; for (int j = size-1; j >i; --j) { X[i] -= A_U[i * size + j] * X[j]; } X[i] /= A_U[i * size + i]; } }
bool cholesky_old(double * A, double * B, double * X, int size) { double V = 0.0; std::vector<double> A_U(size*size,0.0); std::vector<double> A_L(size*size,0.0); // inside matrix [L(i,j)] for (int j = 0; j < size; j++) { for(int i = j; i < size; i++) { if(i==j) { // main diagonals [L(i,i)] //for (int i = 0; i < size; i++) //{ V = 0.0; V += A[i*size + i]; for (int k = 0; k <= i-1; k++) { V -= (A_U[k*size + i] * A_U[k * size + i]); } if( V <= 0) { return false; } A_L[i*size + i] = sqrt(V); A_U[i*size + i] = sqrt(V); //} } else { V = 0.0; for (int k = 0; k <= j-1; k++) { V += A_U[k*size + i] * A_U[k*size + j]; } if( A_U[j*size + j] == 0) { return false; } A_U[j*size + i] = (1 / A_U[j*size + j]) * (A[j*size + i] - V); A_L[i*size + j] = A_U[j*size + i]; } } } std::vector<double> X_R(size,0.0); // gauss_solve(&A_L[0], &B[0], &X_R[0], size); for (int i = 0; i <size ; i++) { X_R[i] = B[i]; for (int j = 0; j <i; j++) { X_R[i] -= A_L[i * size + j] * X_R[j]; } X_R[i] /= A_L[i * size + i]; } // gauss_solve(&A_U[0], &X_R[0], X, size); for (int i = size-1; i >=0 ; --i) { X[i] = X_R[i]; for (int j = size-1; j >i; --j) { X[i] -= A_U[i * size + j] * X[j]; } X[i] /= A_U[i * size + i]; } }