// find the nearest dot void find_nearest_dot() { // get cursor position Vector3 cursor_position = cursor.transform.position; // check cursor range Vector3 deltaR = cursor_position - dashboard_center; float x_cursor = Vector3.Dot(dashboard_x_axis, deltaR); float y_cursor = Vector3.Dot(dashboard_y_axis, deltaR); float z_cursor = Vector3.Dot(dashboard_z_axis, deltaR); if (!(Mathf.Abs(x_cursor) < dashboard_Lx / 2 && Mathf.Abs(y_cursor) < dashboard_Ly / 2 && Mathf.Abs(z_cursor) < dashboard_Lz / 2)) { if (dot_selected) { dot_selected.GetComponent <dot_template>().isHovered = false; } return; } // find the nearest dot float d_min = 1000f; GameObject dot_min = null; foreach (GameObject dot in dot_list) { Vector3 dot_position = dot.transform.position; dot.GetComponent <dot_template>().isHovered = false; float d = (cursor_position - dot_position).magnitude; if (d < d_min) { d_min = d; dot_min = dot; } } dot_template dot_para = dot_min.GetComponent <dot_template>(); dot_para.isHovered = true; int I_b = dot_para.I_b; List <int> I_b_list = dot_para.I_b_list; // plot line int I_b_hover; int I_b_selected_old = I_b_selected; if (I_b_list.Contains(I_b_selected_old)) { I_b_hover = I_b_selected_old; } else { I_b_hover = I_b; } plot_line(line, line_position_list, I_b_hover); }
//initialization void initialization() { //2020.7.24 dot_template_pool.PushAll(); // import image string fname = "phonons_png/phonons" + DatabaseIndex; bool tf = importImage(fname); I_k_selected = -1; I_b_selected = -1; if (!tf) { //foreach (Transform childObj in ButtonPanel.transform) //{ // Destroy(childObj.gameObject); //} return; } // Button Panel ButtonPanel.SetActive(false); Loom.RunAsync(() => { //////////////////////////////////////////////////////// // import data string fname2 = DataPath + "phonons" + DatabaseIndex + ".json"; string text = File.ReadAllText(fname2); JSONObject dict = (JSONObject)JSON.Parse(text); JSONArray EigenvalueX_ = (JSONArray)dict["EigenvalueX"]; JSONArray EigenvalueY_ = (JSONArray)dict["EigenvalueY"]; EigenvalueX = JSONArray_to_Array_1d(EigenvalueX_); EigenvalueY = JSONArray_to_Array_2d(EigenvalueY_); // calc xlim and ylim x_min = EigenvalueX.Cast <float>().Min(); x_max = EigenvalueX.Cast <float>().Max(); float y1 = EigenvalueY.Cast <float>().Min(); float y2 = EigenvalueY.Cast <float>().Max(); y_min = y1 - (y2 - y1) * gamma; y_max = y2 + (y2 - y1) * gamma; N_k = EigenvalueY.GetLength(0); N_b = EigenvalueY.GetLength(1); float delta_y = (y_max - y_min) * eps; // line position list line_position_list = new Vector3[N_b][]; for (int j = 0; j < N_b; j++) { Vector3[] position_list = new Vector3[N_k]; for (int i = 0; i < N_k; i++) { float x = EigenvalueX[i]; float y = EigenvalueY[i, j]; Vector3 position = calc_position(x, y, alfa, x_min, x_max, y_min, y_max, center.x, center.y, length.x, length.y); position.z = z0; position = Canvas_phonon_rotation * position + Canvas_phonon_position; position_list[i] = position; } line_position_list[j] = position_list; } //////////////////////////////////////////////////////// Loom.QueueOnMainThread(() => { /////////////////////////////////////////////////////// dot_list = new GameObject[N_k * N_b]; for (int i = 0; i < N_k; i++) { for (int j = 0; j < N_b; j++) { // get x and y float x = EigenvalueX[i]; float y = EigenvalueY[i, j]; //calc overlapping band indices var I_b_list = new List <int>(); for (int j_ = 0; j_ < N_b; j_++) { float y_ = EigenvalueY[i, j_]; if (Mathf.Abs(y - y_) < delta_y) { I_b_list.Add(j_); } } //calc dot position Vector3 dot_position = line_position_list[j][i]; dot_position -= transform.forward * 0.05f; //create dot GameObject dot = dot_template_pool.Pop(); dot.transform.position = dot_position; dot_template dot_Template_comp = dot.requireComponent <dot_template>(); dot_Template_comp.I_k = i; dot_Template_comp.I_b = j; dot_Template_comp.I_b_list = I_b_list; //dot.transform.SetParent(ButtonPanel.transform, false); dot_list[i * N_b + j] = dot; //////////////////////////////////////////////////////// } } //////////////////////////////////////////////////////// }); }); }