Скопировать
////// global data var d_field; var p_objects = null; var d_xspace = 5,d_xsize = 200,d_yspace = 5,d_ysize = 20; var d_panel; var d_width = 600,d_height = 600; var d_xmin = -1,d_xmax = 1,d_ymin = -1,d_ymax = 1,d_zmin = -0.25,d_zmax = 0.25; var d_viewdir = 2; var d_minpos = 0.000001; var d_mindist = 0.03; var d_velmul = 0.1; var d_kinmul = 0.5; var d_octsize = 0.25; var d_cubesize = 0.25; var d_ownrigid = 10; var d_outrigid = 10; var d_xforce = 0,d_yforce = 0,d_zforce = 0; var d_pointsize = 3; var d_octs = 3,d_cubes = 3; var d_octmass = 2,d_cubemass = 1; var d_timer; var d_msecs = 100; var d_timestep = 0.01; var d_colldir = 0; var d_fx,d_fy,d_fz; ////// label function f_label(d_div,d_id,d_text,d_left,d_top) { var d_label = document.createElement("div"); d_label.id = d_id; d_label.innerText = d_text; d_label.style.left = d_left + "px"; d_label.style.top = d_top + "px"; d_label.style.width = d_xsize + "px"; d_label.style.height = d_ysize + "px"; d_label.style.position = "absolute"; d_label.style.backgroundColor = "whiteSmoke"; d_label.style.color = "black"; d_label.style.FontSize = 16; d_label.style.textAlign = "center"; d_div.appendChild(d_label); return; } ////// halflabel function f_halflabel(d_div,d_id,d_text,d_left,d_top) { var d_label = document.createElement("div"); d_label.id = d_id; d_label.innerText = d_text; d_label.style.left = d_left + "px"; d_label.style.top = d_top + "px"; d_label.style.width = (d_xsize / 2) + "px"; d_label.style.height = d_ysize + "px"; d_label.style.position = "absolute"; d_label.style.backgroundColor = "whiteSmoke"; d_label.style.color = "black"; d_label.style.FontSize = 16; d_label.style.textAlign = "center"; d_div.appendChild(d_label); return; } ////// area function f_area(d_div,d_id,d_text,d_left,d_top) { var d_area = document.createElement("textarea"); d_area.id = d_id; d_area.value = d_text; d_area.style.left = d_left + "px"; d_area.style.top = d_top + "px"; d_area.style.width = d_xsize + "px"; d_area.style.height = d_ysize + "px"; d_area.style.position = "absolute"; d_area.style.backgroundColor = "white"; d_area.style.color = "black"; d_area.style.FontSize = 16; d_area.style.textAlign = "left"; d_div.appendChild(d_area); return d_area; } ////// halfarea function f_halfarea(d_div,d_id,d_text,d_left,d_top) { var d_area = document.createElement("textarea"); d_area.id = d_id; d_area.value = d_text; d_area.style.left = d_left + "px"; d_area.style.top = d_top + "px"; d_area.style.width = (d_xsize / 2) + "px"; d_area.style.height = d_ysize + "px"; d_area.style.position = "absolute"; d_area.style.backgroundColor = "white"; d_area.style.color = "black"; d_area.style.FontSize = 16; d_area.style.textAlign = "left"; d_div.appendChild(d_area); return d_area; } ////// button function f_button(d_div,d_id,d_text,d_left,d_top) { var d_button = document.createElement("button"); d_button.id = d_id; d_button.innerText = d_text; d_button.style.left = d_left + "px"; d_button.style.top = d_top + "px"; d_button.style.width = d_xsize + "px"; d_button.style.height = d_ysize + "px"; d_button.style.position = "absolute"; d_button.style.backgroundColor = "whiteSmoke"; d_button.style.color = "black"; d_button.style.FontSize = 16; d_button.style.textAlign = "center"; d_div.appendChild(d_button); return d_button; } ////// halfbutton function f_halfbutton(d_div,d_id,d_text,d_left,d_top) { var d_button = document.createElement("button"); d_button.id = d_id; d_button.innerText = d_text; d_button.style.left = d_left + "px"; d_button.style.top = d_top + "px"; d_button.style.width = (d_xsize / 2) + "px"; d_button.style.height = d_ysize + "px"; d_button.style.position = "absolute"; d_button.style.backgroundColor = "whiteSmoke"; d_button.style.color = "black"; d_button.style.FontSize = 16; d_button.style.textAlign = "center"; d_div.appendChild(d_button); return d_button; } ////// check function f_check(d_div,d_id,d_var,d_left,d_top) { var d_check = document.createElement("input"); d_check.type = "checkbox"; d_check.id = d_id; if(d_var == 0) d_check.checked = false; else d_check.checked = true; d_check.style.left = d_left + "px"; d_check.style.top = d_top + "px"; d_check.style.width = d_ysize + "px"; d_check.style.height = d_ysize + "px"; d_check.style.position = "absolute"; d_div.appendChild(d_check); return d_check; } ////// radio function f_radio(d_div,d_id,d_name,d_value,d_var,d_left,d_top) { var d_radio = document.createElement("input"); d_radio.type = "radio"; d_radio.id = d_id; d_radio.name = d_name; d_radio.value = d_value; if(d_var == d_value) d_radio.checked = true; else d_radio.checked = false; d_radio.style.left = d_left + "px"; d_radio.style.top = d_top + "px"; d_radio.style.width = d_ysize + "px"; d_radio.style.height = d_ysize + "px"; d_radio.style.position = "absolute"; d_div.appendChild(d_radio); return d_radio; } ////// width function f_width() { var d_extent,d_left; var d_point; var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) {//2 if(d_new == Math.round(d_new)) {//3 if(d_new == d_width) return; d_width = d_new; d_field.style.width = d_width + "px"; d_panel.style.left = d_width + "px"; if(p_objects == null) return; var d_div = d_field.firstChild; var d_object = p_objects; if(d_viewdir == 0) d_extent = d_ymax - d_ymin;//y right,z down else { if(d_viewdir == 1) d_extent = d_zmax - d_zmin;//z right,x down else d_extent = d_xmax - d_xmin;//d_viewdir = 2,x right,y down } for(;;) {//4 d_point = d_object.p_points; for(;;) {//5 if(d_extent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else {//6 if(d_viewdir == 0) d_left = Math.round((((d_point.d_sy - d_ymin) / d_extent) * d_width) - (d_pointsize / 2)); else { if(d_viewdir == 1) d_left = Math.round((((d_point.d_sz - d_zmin) / d_extent) * d_width) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sx - d_xmin) / d_extent) * d_width) - (d_pointsize / 2)); } }//6 if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; d_point = d_point.d_nextpoint; if(d_point == null) break; d_div = d_div.nextSibling; }//5 d_object = d_object.d_nextobject; if(d_object == null) break; d_div = d_div.nextSibling; }//4 return; }//3 }//2 }//1 this.value = d_width; return; } ////// height function f_height() { var d_extent,d_top; var d_point; var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) {//2 if(d_new == Math.round(d_new)) {//3 if(d_new == d_height) return; d_height = d_new; d_field.style.height = d_height + "px"; if(p_objects == null) return; var d_div = d_field.firstChild; var d_object = p_objects; if(d_viewdir == 0) d_extent = d_zmax - d_zmin;//y right,z down else { if(d_viewdir == 1) d_extent = d_xmax - d_xmin;//z right,x down else d_extent = d_ymax - d_ymin;//d_viewdir = 2,x right,y down } for(;;) {//4 d_point = d_object.p_points; for(;;) {//5 if(d_extent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else {//6 if(d_viewdir == 0) d_top = Math.round((((d_point.d_sz - d_zmin) / d_extent) * d_height) - (d_pointsize / 2)); else { if(d_viewdir == 1) d_top = Math.round((((d_point.d_sx - d_xmin) / d_extent) * d_height) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sy - d_ymin) / d_extent) * d_height) - (d_pointsize / 2)); } }//6 if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; d_point = d_point.d_nextpoint; if(d_point == null) break; d_div = d_div.nextSibling; }//5 d_object = d_object.d_nextobject; if(d_object == null) break; d_div = d_div.nextSibling; }//4 return; }//3 }//2 }//1 this.value = d_height; return; } ////// cleanfield function f_cleanfield() { var d_point; var d_nextdiv; var d_nextobject; var d_nextpoint; if(p_objects == null) return; var d_div = d_field.firstChild; var d_object = p_objects; for(;;) {//1 d_nextobject = d_object.d_nextobject; d_point = d_object.p_points; for(;;) { d_nextdiv = d_div.nextSibling; d_nextpoint = d_point.d_nextpoint; d_field.removeChild(d_div); delete d_point;//? if(d_nextpoint == null) break; d_div = d_nextdiv; d_point = d_nextpoint; } delete d_object;//? if(d_nextobject == null) break; d_div = d_nextdiv; d_object = d_nextobject; }//1 p_objects = null; return; } ////// xmin function f_xmin() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new <= d_xmax) { if(d_new == d_xmin) return; d_xmin = d_new; f_cleanfield(); return; } }//1 this.value = d_xmin; return; } ////// xmax function f_xmax() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new >= d_xmin) { if(d_new == d_xmax) return; d_xmax = d_new; f_cleanfield(); return; } }//1 this.value = d_xmax; return; } ////// ymin function f_ymin() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new <= d_ymax) { if(d_new == d_ymin) return; d_ymin = d_new; f_cleanfield(); return; } }//1 this.value = d_ymin; return; } ////// ymax function f_ymax() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new >= d_ymin) { if(d_new == d_ymax) return; d_ymax = d_new; f_cleanfield(); return; } }//1 this.value = d_ymax; return; } ////// zmin function f_zmin() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new <= d_zmax) { if(d_new == d_zmin) return; d_zmin = d_new; f_cleanfield(); return; } }//1 this.value = d_zmin; return; } ////// zmax function f_zmax() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new >= d_zmin) { if(d_new == d_zmax) return; d_zmax = d_new; f_cleanfield(); return; } }//1 this.value = d_zmax; return; } ////// showfield function f_showfield() { var d_left,d_top; var d_point; if(p_objects == null) return; var d_div = d_field.firstChild; var d_object = p_objects; var d_xextent = d_xmax - d_xmin; var d_yextent = d_ymax - d_ymin; var d_zextent = d_zmax - d_zmin; for(;;) {//1 d_point = d_object.p_points; for(;;) {//2 if(d_viewdir == 0)//y right,z down { if(d_yextent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sy - d_ymin) / d_yextent) * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; if(d_zextent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sz - d_zmin) / d_zextent) * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; } else {//3 if(d_viewdir == 1)//z right,x down { if(d_zextent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sz - d_zmin) / d_zextent) * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; if(d_xextent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sx - d_xmin) / d_xextent) * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; } else { //d_viewdir = 2,x right,y down if(d_xextent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sx - d_xmin) / d_xextent) * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; if(d_yextent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sy - d_ymin) / d_yextent) * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; } }//3 d_point = d_point.d_nextpoint; if(d_point == null) break; d_div = d_div.nextSibling; }//2 d_object = d_object.d_nextobject; if(d_object == null) break; d_div = d_div.nextSibling; }//1 return; } ////// viewdir function f_viewdir() { var d_new = Number(this.value); if(d_new == d_viewdir) return; d_viewdir = d_new; f_showfield(); return; } ////// minpos function f_minpos() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_minpos = d_new; return; } }//1 this.value = d_minpos; return; } ////// mindist function f_mindist() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_mindist = d_new; return; } }//1 this.value = d_mindist; return; } ////// velmul function f_velmul() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_velmul = d_new; return; } }//1 this.value = d_velmul; return; } ////// kinmul function f_kinmul() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_kinmul = d_new; return; } }//1 this.value = d_kinmul; return; } ////// octsize function f_octsize() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_octsize = d_new; return; } }//1 this.value = d_octsize; return; } ////// cubesize function f_cubesize() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_cubesize = d_new; return; } }//1 this.value = d_cubesize; return; } ////// ownrigid function f_ownrigid() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_ownrigid = d_new; return; } }//1 this.value = d_ownrigid; return; } ////// outrigid function f_outrigid() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_outrigid = d_new; return; } }//1 this.value = d_outrigid; return; } ////// xforce function f_xforce() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) { d_xforce = d_new; return; } this.value = d_xforce; return; } ////// yforce function f_yforce() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) { d_yforce = d_new; return; } this.value = d_yforce; return; } ////// zforce function f_zforce() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) { d_zforce = d_new; return; } this.value = d_zforce; return; } ////// pointsize function f_pointsize() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) {//2 if(d_new == Math.round(d_new)) {//3 if(d_new == d_pointsize) return; d_pointsize = d_new; var d_div = d_field.firstChild; if(d_div == null) return; var d_lastdiv = d_field.lastChild; if(d_lastdiv == null) return; for(;;) { d_div.style.width = d_pointsize + "px"; d_div.style.height = d_pointsize + "px"; if(d_div == d_lastdiv) break; d_div = d_div.nextSibling; } f_showfield(); return; }//3 }//2 }//1 this.value = d_pointsize; return; } ////// octs function f_octs() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new >= 0) {//2 if(d_new == Math.round(d_new)) { if(d_new == d_octs) return; d_octs = d_new; f_cleanfield(); return; } }//2 }//1 this.value = d_octs; return; } ////// cubes function f_cubes() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new >= 0) {//2 if(d_new == Math.round(d_new)) { if(d_new == d_cubes) return; d_cubes = d_new; f_cleanfield(); return; } }//2 }//1 this.value = d_cubes; return; } ////// octmass function f_octmass() { var d_point; var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) {//2 if(d_new == d_octmass) return; d_octmass = d_new; if(p_objects == null) return; var d_object = p_objects; for(;;) {//3 if(d_oblect.d_type == 6) { for(d_point = d_oblect.p_points;d_point != null;d_point = d_point.d_nextpoint) d_point.d_mass = d_octmass; } d_object = d_object.d_nextobject; if(d_object == null) break; }//3 return; }//2 }//1 this.value = d_octmass; return; } ////// cubemass function f_cubemass() { var d_point; var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) {//2 if(d_new == d_cubemass) return; d_cubemass = d_new; if(p_objects == null) return; var d_object = p_objects; for(;;) {//3 if(d_oblect.d_type == 8) { for(d_point = d_oblect.p_points;d_point != null;d_point = d_point.d_nextpoint) d_point.d_mass = d_cubemass; } d_object = d_object.d_nextobject; if(d_object == null) break; }//3 return; }//2 }//1 this.value = d_cubemass; return; } ////// msecs function f_msecs() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) {//2 if(d_new == Math.round(d_new)) { d_msecs = d_new; return; } }//2 }//1 this.value = d_msecs; return; } ////// timestep function f_timestep() { var d_new = Number(this.value); if(Number.isFinite(d_new) != 0) {//1 if(d_new > 0) { d_timestep = d_new; return; } }//1 this.value = d_timestep; return; } ////// adjustpoint function f_adjustpoint(d_div,d_point) { var d_sx,d_sy,d_sz; var d_left,d_top; var d_xextent = d_xmax - d_xmin; var d_yextent = d_ymax - d_ymin; var d_zextent = d_zmax - d_zmin; if(d_viewdir == 0)//y right,z down { if(d_yextent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sy - d_ymin) / d_yextent) * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; if(d_zextent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sz - d_zmin) / d_zextent) * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; return; } if(d_viewdir == 1)//z right,x down { if(d_zextent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sz - d_zmin) / d_zextent) * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; if(d_xextent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sx - d_xmin) / d_xextent) * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; return; } //d_viewdir = 2,x right,y down if(d_xextent <= d_minpos) d_left = Math.round((d_width / 2) - (d_pointsize / 2)); else d_left = Math.round((((d_point.d_sx - d_xmin) / d_xextent) * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; if(d_yextent <= d_minpos) d_top = Math.round((d_height / 2) - (d_pointsize / 2)); else d_top = Math.round((((d_point.d_sy - d_ymin) / d_yextent) * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; return; } ////// impekin function f_impekin() { var d_point,d_pointmass; if(p_objects == null) return; var d_mass = 0; var d_mvx = 0; var d_mvy = 0; var d_mvz = 0; var d_oldekin = 0; var d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_pointmass = d_point.d_mass; d_mass += d_pointmass; d_mvx += d_point.d_vx * d_pointmass; d_mvy += d_point.d_vy * d_pointmass; d_mvz += d_point.d_vz * d_pointmass; d_oldekin += (d_pointmass / 2) * ((d_point.d_vx * d_point.d_vx) + ((d_point.d_vy * d_point.d_vy) + (d_point.d_vz * d_point.d_vz))); d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 if(Number.isFinite(d_oldekin) == 0) return; if(d_oldekin < d_minpos) return; d_mvx /= d_mass; d_mvy /= d_mass; d_mvz /= d_mass; var d_newekin = 0; d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_point.d_vx -= d_mvx; d_point.d_vy -= d_mvy; d_point.d_vz -= d_mvz; d_newekin += (d_point.d_mass / 2) * ((d_point.d_vx * d_point.d_vx) + ((d_point.d_vy * d_point.d_vy) + (d_point.d_vz * d_point.d_vz))); d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 if(Number.isFinite(d_newekin) == 0) return; if(d_newekin < d_minpos) return; var d_rootmul = Math.sqrt(d_oldekin / d_newekin); if(Number.isFinite(d_rootmul) == 0) return; d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_point.d_vx *= d_rootmul; d_point.d_vy *= d_rootmul; d_point.d_vz *= d_rootmul; d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 return; } ////// ownforce function f_ownforce(d_dist,d_dist0) { return (2 * d_ownrigid) * ((((d_dist0 * d_dist0) * d_dist0) / (d_dist * d_dist)) - d_dist); } ////// ownupot function f_ownupot(d_dist,d_dist0) { var d_dist02 = d_dist0 * d_dist0; return d_ownrigid * (((2 / d_dist) * (d_dist02 * d_dist0)) + ((d_dist * d_dist) - (3 * d_dist02))); } ////// outforce function f_outforce(d_dist) { if(d_dist >= d_mindist) return 0; return d_outrigid / (d_dist * d_dist); } ////// outupot function f_outupot(d_dist) { if(d_dist >= d_mindist) return 0; return d_outrigid * ((1 / d_dist) - (1 / d_mindist)); } ////// addownfu function f_addownfu(d_x,d_y,d_z,d_point,d_dist0) { var d_sign,d_cosx,d_cosy,d_cosz; var d_dx = d_point.d_sx - d_x; var d_dy = d_point.d_sy - d_y; var d_dz = d_point.d_sz - d_z; var d_dist = Math.sqrt((d_dx * d_dx) + ((d_dy * d_dy) + (d_dz * d_dz))); if(d_dist < d_minpos) {//1 if(Math.random() >= 0.5) d_sign = 1; else d_sign = -1; if(d_colldir == 0) { d_cosx = d_sign; d_cosy = 0; d_cosz = 0; } else { if(d_colldir == 1) { d_cosx = 0; d_cosy = d_sign; d_cosz = 0; } else { d_cosx = 0; d_cosy = 0; d_cosz = d_sign; } } d_colldir++; if(d_colldir > 2) d_colldir = 0; d_dist = d_minpos; }//1 else { d_cosx = d_dx / d_dist; d_cosy = d_dy / d_dist; d_cosz = d_dz / d_dist; } var d_f = f_ownforce(d_dist,d_dist0); d_fx -= d_f * d_cosx; d_fy -= d_f * d_cosy; d_fz -= d_f * d_cosz; return f_ownupot(d_dist,d_dist0); } ////// addownupot function f_addownupot(d_x,d_y,d_z,d_point,d_dist0) { var d_dx = d_point.d_sx - d_x; var d_dy = d_point.d_sy - d_y; var d_dz = d_point.d_sz - d_z; var d_dist = Math.sqrt((d_dx * d_dx) + ((d_dy * d_dy) + (d_dz * d_dz))); if(d_dist < d_minpos) d_dist = d_minpos; return f_ownupot(d_dist,d_dist0); } ////// addoutfu function f_addoutfu(d_x,d_y,d_z,d_object1) { var d_point; var d_dx,d_dy,d_dz,d_dist; var d_sign,d_cosx,d_cosy,d_cosz; var d_f; var d_object2 = p_objects; var d_u = 0; for(;;) {//1 if(d_object2 != d_object1) {//2 d_point = d_object2.p_points; for(;;) {//3 d_dx = d_point.d_sx - d_x; d_dy = d_point.d_sy - d_y; d_dz = d_point.d_sz - d_z; d_dist = Math.sqrt((d_dx * d_dx) + ((d_dy * d_dy) + (d_dz * d_dz))); if(d_dist < d_minpos) {//4 if(Math.random() >= 0.5) d_sign = 1; else d_sign = -1; if(d_colldir == 0) { d_cosx = d_sign; d_cosy = 0; d_cosz = 0; } else { if(d_colldir == 1) { d_cosx = 0; d_cosy = d_sign; d_cosz = 0; } else { d_cosx = 0; d_cosy = 0; d_cosz = d_sign; } } d_colldir++; if(d_colldir > 2) d_colldir = 0; d_dist = d_minpos; }//4 else { d_cosx = d_dx / d_dist; d_cosy = d_dy / d_dist; d_cosz = d_dz / d_dist; } d_f = f_outforce(d_dist); d_fx -= d_f * d_cosx; d_fy -= d_f * d_cosy; d_fz -= d_f * d_cosz; d_u += f_outupot(d_dist); d_point = d_point.d_nextpoint; if(d_point == null) break; }//3 }//2 d_object2 = d_object2.d_nextobject; if(d_object2 == null) break; }//1 return d_u; } ////// addoutupot function f_addoutupot(d_x,d_y,d_z,d_object1) { var d_point; var d_dx,d_dy,d_dz,d_dist; var d_object2 = p_objects; var d_u = 0; for(;;) {//1 if(d_object2 != d_object1) {//2 d_point = d_object2.p_points; for(;;) { d_dx = d_point.d_sx - d_x; d_dy = d_point.d_sy - d_y; d_dz = d_point.d_sz - d_z; d_dist = Math.sqrt((d_dx * d_dx) + ((d_dy * d_dy) + (d_dz * d_dz))); if(d_dist < d_minpos) d_dist = d_minpos; d_u += f_outupot(d_dist); d_point = d_point.d_nextpoint; if(d_point == null) break; } }//2 d_object2 = d_object2.d_nextobject; if(d_object2 == null) break; }//1 return d_u; } ////// process function f_process() { var d_object; var d_point,d_point1,d_point2,d_point3,d_point4,d_point5,d_point6,d_point7,d_point8; var d_mass,d_fmul,d_amul,d_vmul; var d_sx0,d_sy0,d_sz0; var d_sx,d_sy,d_sz; var d_vx,d_vy,d_vz; var d_vx2,d_vy2,d_vz2; var d_u0,d_u,d_du; var d_dx,d_dy,d_dz,d_dist; var d_cosx,d_cosy,d_cosz; var d_signx,d_signy,d_signz; var d_dist0,d_diag; if(p_objects == null) return; var d_div = d_field.firstChild; var d_object = p_objects; d_fmul = (d_timestep * d_timestep) / 2; for(;;) {//1 d_point1 = d_object.p_points; d_point2 = d_point1.d_nextpoint; d_point3 = d_point2.d_nextpoint; d_point4 = d_point3.d_nextpoint; d_point5 = d_point4.d_nextpoint; d_point6 = d_point5.d_nextpoint; if(d_object.d_type == 6) d_dist0 = d_octsize / Math.sqrt(2); else { d_point7 = d_point6.d_nextpoint; d_point8 = d_point7.d_nextpoint; d_diag = d_cubesize * Math.sqrt(3); } d_point = d_object.p_points; for(;;) {//2 d_sx0 = d_point.d_sx; d_sy0 = d_point.d_sy; d_sz0 = d_point.d_sz; d_fx = d_xforce; d_fy = d_yforce; d_fz = d_zforce; d_u0 = 0; for(;;) {//3 if(d_object.d_type == 6) {//4 if(d_point == d_point1) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_octsize); break; } if(d_point == d_point2) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_octsize); break; } if(d_point == d_point3) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_octsize); break; } if(d_point == d_point4) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_octsize); break; } if(d_point == d_point5) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_octsize); break; } d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_dist0); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_octsize); break; }//4 if(d_point == d_point1) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point7,d_diag); break; } if(d_point == d_point2) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point8,d_diag); break; } if(d_point == d_point3) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point7,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_diag); break; } if(d_point == d_point4) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point8,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_diag); break; } if(d_point == d_point5) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point8,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_diag); break; } if(d_point == d_point6) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point7,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_diag); break; } if(d_point == d_point7) { d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point3,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point6,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point8,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point1,d_diag); break; } d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point4,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point7,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point5,d_cubesize); d_u0 += f_addownfu(d_sx0,d_sy0,d_sz0,d_point2,d_diag); break; }//3 d_u0 += f_addoutfu(d_sx0,d_sy0,d_sz0,d_object); d_mass = d_point.d_mass; d_amul = d_fmul / d_mass; d_vx = d_point.d_vx; d_vy = d_point.d_vy; d_vz = d_point.d_vz; d_sx = (d_sx0 + (d_vx * d_timestep)) + (d_fx * d_amul); d_sy = (d_sy0 + (d_vy * d_timestep)) + (d_fy * d_amul); d_sz = (d_sz0 + (d_vz * d_timestep)) + (d_fz * d_amul); if(d_sx < d_xmin) d_sx = d_xmin; else { if(d_sx > d_xmax) d_sx = d_xmax; } if(d_sy < d_ymin) d_sy = d_ymin; else { if(d_sy > d_ymax) d_sy = d_ymax; } if(d_sz < d_zmin) d_sz = d_zmin; else { if(d_sz > d_zmax) d_sz = d_zmax; } d_dx = d_sx - d_sx0; d_dy = d_sy - d_sy0; d_dz = d_sz - d_sz0; d_dist = Math.sqrt((d_dx * d_dx) + ((d_dy * d_dy) + (d_dz * d_dz))); if(d_dist < d_minpos) { d_point.d_vx = - d_vx; d_point.d_vy = - d_vy; d_point.d_vz = - d_vz; } else {//3 d_u = 0; for(;;) {//4 if(d_object.d_type == 6) {//5 if(d_point == d_point1) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_u += f_addownfu(d_sx,d_sy,d_sz,d_point6,d_octsize); break; } if(d_point == d_point2) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_dist0); d_u += f_addownfu(d_sx,d_sy,d_sz,d_point4,d_octsize); break; } if(d_point == d_point3) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_dist0); d_u += f_addownfu(d_sx,d_sy,d_sz,d_point5,d_octsize); break; } if(d_point == d_point4) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_dist0); d_u += f_addownfu(d_sx,d_sy,d_sz,d_point2,d_octsize); break; } if(d_point == d_point5) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_dist0); d_u += f_addownfu(d_sx,d_sy,d_sz,d_point3,d_octsize); break; } d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_dist0); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_u += f_addownfu(d_sx,d_sy,d_sz,d_point1,d_octsize); break; }//5 if(d_point == d_point1) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point7,d_diag); break; } if(d_point == d_point2) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_diag); break; } if(d_point == d_point3) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point7,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_diag); break; } if(d_point == d_point4) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_diag); break; } if(d_point == d_point5) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_diag); break; } if(d_point == d_point6) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point7,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_diag); break; } if(d_point == d_point7) { d_u += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_diag); break; } d_u += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point7,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_cubesize); d_u += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_diag); break; }//4 d_u += f_addoutupot(d_sx,d_sy,d_sz,d_object); d_du = d_u - d_u0; for(;;) {//4 if(d_du != 0) {//5 d_cosx = d_dx / d_dist; d_cosy = d_dy / d_dist; d_cosz = d_dz / d_dist; if(d_du < 0) { d_vx2 = (d_vx * d_vx) - ((d_du * (d_cosx * d_cosx)) * (2 / d_mass)); d_vy2 = (d_vy * d_vy) - ((d_du * (d_cosy * d_cosy)) * (2 / d_mass)); d_vz2 = (d_vz * d_vz) - ((d_du * (d_cosz * d_cosz)) * (2 / d_mass)); } else {//6 d_vx2 = (d_vx * d_vx) - ((d_du * (d_cosx * d_cosx)) * (2 / d_mass)); if(d_vx2 < 0) { d_point.d_vx = - d_vx; d_point.d_vy = - d_vy; d_point.d_vz = - d_vz; break; } d_vy2 = (d_vy * d_vy) - ((d_du * (d_cosy * d_cosy)) * (2 / d_mass)); if(d_vy2 < 0) { d_point.d_vx = - d_vx; d_point.d_vy = - d_vy; d_point.d_vz = - d_vz; break; } d_vz2 = (d_vz * d_vz) - ((d_du * (d_cosz * d_cosz)) * (2 / d_mass)); if(d_vz2 < 0) { d_point.d_vx = - d_vx; d_point.d_vy = - d_vy; d_point.d_vz = - d_vz; break; } }//6 d_vmul = d_timestep / d_mass; d_vx += d_fx * d_vmul; d_vy += d_fy * d_vmul; d_vz += d_fz * d_vmul; for(;;) {//6 if(d_vx > 0) { d_signx = 1; break; } if(d_vx < 0) { d_signx = -1; break; } if(d_point.d_vx > 0) { d_signx = 1; break; } if(d_point.d_vx < 0) { d_signx = -1; break; } if(d_fx > 0) { d_signx = 1; break; } if(d_fx < 0) { d_signx = -1; break; } if(d_cosx > 0) { d_signx = 1; break; } if(d_cosx < 0) { d_signx = -1; break; } if(Math.random() >= 0.5) { d_signx = 1; break; } d_signx = -1; break; }//6 for(;;) {//6 if(d_vy > 0) { d_signy = 1; break; } if(d_vy < 0) { d_signy = -1; break; } if(d_point.d_vy > 0) { d_signy = 1; break; } if(d_point.d_vy < 0) { d_signy = -1; break; } if(d_fy > 0) { d_signy = 1; break; } if(d_fy < 0) { d_signy = -1; break; } if(d_cosy > 0) { d_signy = 1; break; } if(d_cosy < 0) { d_signy = -1; break; } if(Math.random() >= 0.5) { d_signy = 1; break; } d_signy = -1; break; }//6 for(;;) {//6 if(d_vz > 0) { d_signz = 1; break; } if(d_vz < 0) { d_signz = -1; break; } if(d_point.d_vz > 0) { d_signz = 1; break; } if(d_point.d_vz < 0) { d_signz = -1; break; } if(d_fz > 0) { d_signz = 1; break; } if(d_fz < 0) { d_signz = -1; break; } if(d_cosz > 0) { d_signz = 1; break; } if(d_cosz < 0) { d_signz = -1; break; } if(Math.random() >= 0.5) { d_signz = 1; break; } d_signz = -1; break; }//6 d_point.d_vx = d_signx * Math.sqrt(d_vx2); d_point.d_vy = d_signy * Math.sqrt(d_vy2); d_point.d_vz = d_signz * Math.sqrt(d_vz2); }//5 if(d_sx <= d_xmin) { if(d_point.d_vx < 0) d_point.d_vx = - d_point.d_vx; } else {//5 if(d_sx >= d_xmax) { if(d_point.d_vx > 0) d_point.d_vx = - d_point.d_vx; } }//5 if(d_sy <= d_ymin) { if(d_point.d_vy < 0) d_point.d_vy = - d_point.d_vy; } else {//5 if(d_sy >= d_ymax) { if(d_point.d_vy > 0) d_point.d_vy = - d_point.d_vy; } }//5 if(d_sz <= d_zmin) { if(d_point.d_vz < 0) d_point.d_vz = - d_point.d_vz; } else {//5 if(d_sz >= d_zmax) { if(d_point.d_vz > 0) d_point.d_vz = - d_point.d_vz; } }//5 d_point.d_sx = d_sx; d_point.d_sy = d_sy; d_point.d_sz = d_sz; break; }//4 }//3 f_adjustpoint(d_div,d_point); d_point = d_point.d_nextpoint; if(d_point == null) break; d_div = d_div.nextSibling; }//2 d_object = d_object.d_nextobject; if(d_object == null) break; d_div = d_div.nextSibling; }//1 //?f_impekin(); return; } ////// step function f_step() { f_process(); return; } ////// run function f_run() { d_timer = window.setInterval(f_step,d_msecs); return; } ////// pause function f_pause() { window.clearInterval(d_timer); return; } ////// adddiv function f_adddiv(d_point,d_type) { var d_w,d_h; var d_left,d_top; var d_div = document.createElement("div"); var d_dx = d_xmax - d_xmin; var d_dy = d_ymax - d_ymin; var d_dz = d_zmax - d_zmin; if(d_viewdir == 2) { d_w = (d_point.d_sx - d_xmin) / d_dx; d_h = (d_point.d_sy - d_ymin) / d_dy; }//x right,y down else { if(d_viewdir == 1) { d_w = (d_point.d_sz - d_zmin) / d_dz; d_h = (d_point.d_sx - d_xmin) / d_dx; }//z right,x down else { d_w = (d_point.d_sy - d_ymin) / d_dy; d_h = (d_point.d_sz - d_zmin) / d_dz; }//d_viewdir = 0,y right,z down } d_left = Math.round((d_w * d_width) - (d_pointsize / 2)); if((d_left + d_pointsize) > d_width) d_left = d_width - d_pointsize; if(d_left < 0) d_left = 0; d_div.style.left = d_left + "px"; d_top = Math.round((d_h * d_height) - (d_pointsize / 2)); if((d_top + d_pointsize) > d_height) d_top = d_height - d_pointsize; if(d_top < 0) d_top = 0; d_div.style.top = d_top + "px"; d_div.style.width = d_pointsize + "px"; d_div.style.height = d_pointsize + "px"; d_div.style.position = "absolute"; if(d_type == 6) d_div.style.backgroundColor = "red"; else d_div.style.backgroundColor = "blue"; d_field.appendChild(d_div); return; } ////// createobjects function f_createobjects() { var d_size,d_type; var d_index,d_limit; var d_object,d_prevobject; var d_point1,d_point2,d_point3,d_point4,d_point5,d_point6,d_point7,d_point8; var d_sx,d_sy,d_sz; var d_vx,d_vy,d_vz; var d_dx = d_xmax - d_xmin; var d_dy = d_ymax - d_ymin; var d_dz = d_zmax - d_zmin; var d_dxdiv2 = d_dx / 2; var d_dydiv2 = d_dy / 2; var d_dzdiv2 = d_dz / 2; var d_size = d_dxdiv2; if(d_size > d_dydiv2) d_size = d_dydiv2; if(d_size > d_dzdiv2) d_size = d_dzdiv2; if(d_size < d_minpos) return; if((d_octsize / 2) > d_size) return; if((d_cubesize / 2) > d_size) return; f_cleanfield(); if(d_octs > 0) { d_type = 6; d_limit = d_octs; d_size = d_octsize / 2; } else { d_type = 8; d_limit = d_cubes; d_size = d_cubesize / 2; } d_index = 0; for(;;) {//1 d_object = new Object();//? d_object.d_nextobject = null; if(p_objects == null) p_objects = d_object; else d_prevobject.d_nextobject = d_object; d_prevobject = d_object; d_object.d_type = d_type; d_point1 = new Object();//? d_point2 = new Object();//? d_point3 = new Object();//? d_point4 = new Object();//? d_point5 = new Object();//? d_point6 = new Object();//? d_object.p_points = d_point1; d_point1.d_nextpoint = d_point2; d_point2.d_nextpoint = d_point3; d_point3.d_nextpoint = d_point4; d_point4.d_nextpoint = d_point5; d_point5.d_nextpoint = d_point6; if(d_type == 6) d_point6.d_nextpoint = null; else { d_point7 = new Object();//? d_point8 = new Object();//? d_point6.d_nextpoint = d_point7; d_point7.d_nextpoint = d_point8; d_point8.d_nextpoint = null; delete d_point7;//? delete d_point8;//? } delete d_object;//? delete d_point1;//? delete d_point2;//? delete d_point3;//? delete d_point4;//? delete d_point5;//? delete d_point6;//? d_sx = d_xmin + (Math.random() * d_dx); d_sy = d_ymin + (Math.random() * d_dy); d_sz = d_zmin + (Math.random() * d_dz); if((d_sx - d_size) < d_xmin) d_sx = d_xmin + d_size; else { if((d_sx + d_size) > d_xmax) d_sx = d_xmax - d_size; } if((d_sy - d_size) < d_ymin) d_sy = d_ymin + d_size; else { if((d_sy + d_size) > d_ymax) d_sy = d_ymax - d_size; } if((d_sz - d_size) < d_zmin) d_sz = d_zmin + d_size; else { if((d_sz + d_size) > d_zmax) d_sz = d_zmax - d_size; } d_vx = ((Math.random() * 2) - 1) * d_velmul; d_vy = ((Math.random() * 2) - 1) * d_velmul; d_vz = ((Math.random() * 2) - 1) * d_velmul; d_point1.d_vx = d_vx; d_point1.d_vy = d_vy; d_point1.d_vz = d_vz; d_point2.d_vx = d_vx; d_point2.d_vy = d_vy; d_point2.d_vz = d_vz; d_point3.d_vx = d_vx; d_point3.d_vy = d_vy; d_point3.d_vz = d_vz; d_point4.d_vx = d_vx; d_point4.d_vy = d_vy; d_point4.d_vz = d_vz; d_point5.d_vx = d_vx; d_point5.d_vy = d_vy; d_point5.d_vz = d_vz; d_point6.d_vx = d_vx; d_point6.d_vy = d_vy; d_point6.d_vz = d_vz; if(d_type == 6) { d_point1.d_sx = d_sx; d_point1.d_sy = d_sy; d_point1.d_sz = d_sz - d_size; d_point2.d_sx = d_sx + d_size; d_point2.d_sy = d_sy; d_point2.d_sz = d_sz; d_point3.d_sx = d_sx; d_point3.d_sy = d_sy + d_size; d_point3.d_sz = d_sz; d_point4.d_sx = d_sx - d_size; d_point4.d_sy = d_sy; d_point4.d_sz = d_sz; d_point5.d_sx = d_sx; d_point5.d_sy = d_sy - d_size; d_point5.d_sz = d_sz; d_point6.d_sx = d_sx; d_point6.d_sy = d_sy; d_point6.d_sz = d_sz + d_size; d_point1.d_mass = d_octmass; d_point2.d_mass = d_octmass; d_point3.d_mass = d_octmass; d_point4.d_mass = d_octmass; d_point5.d_mass = d_octmass; d_point6.d_mass = d_octmass; } else { d_point7.d_vx = d_vx; d_point7.d_vy = d_vy; d_point7.d_vz = d_vz; d_point8.d_vx = d_vx; d_point8.d_vy = d_vy; d_point8.d_vz = d_vz; d_point1.d_sx = d_sx + d_size; d_point1.d_sy = d_sy + d_size; d_point1.d_sz = d_sz - d_size; d_point2.d_sx = d_sx - d_size; d_point2.d_sy = d_sy + d_size; d_point2.d_sz = d_sz - d_size; d_point3.d_sx = d_sx - d_size; d_point3.d_sy = d_sy - d_size; d_point3.d_sz = d_sz - d_size; d_point4.d_sx = d_sx + d_size; d_point4.d_sy = d_sy - d_size; d_point4.d_sz = d_sz - d_size; d_point5.d_sx = d_sx + d_size; d_point5.d_sy = d_sy + d_size; d_point5.d_sz = d_sz + d_size; d_point6.d_sx = d_sx - d_size; d_point6.d_sy = d_sy + d_size; d_point6.d_sz = d_sz + d_size; d_point7.d_sx = d_sx - d_size; d_point7.d_sy = d_sy - d_size; d_point7.d_sz = d_sz + d_size; d_point8.d_sx = d_sx + d_size; d_point8.d_sy = d_sy - d_size; d_point8.d_sz = d_sz + d_size; d_point1.d_mass = d_cubemass; d_point2.d_mass = d_cubemass; d_point3.d_mass = d_cubemass; d_point4.d_mass = d_cubemass; d_point5.d_mass = d_cubemass; d_point6.d_mass = d_cubemass; d_point7.d_mass = d_cubemass; d_point8.d_mass = d_cubemass; } f_adddiv(d_point1,d_type); f_adddiv(d_point2,d_type); f_adddiv(d_point3,d_type); f_adddiv(d_point4,d_type); f_adddiv(d_point5,d_type); f_adddiv(d_point6,d_type); if(d_type == 8) { f_adddiv(d_point7,d_type); f_adddiv(d_point8,d_type); } d_index++; if(d_index < d_limit) continue; if(d_type == 8) break; if(d_cubes <= 0) break; d_type = 8; d_limit = d_cubes; d_size = d_cubesize / 2; d_index = 0; }//1 return; } ////// testwsc function f_testwsc(d_char) { if(d_char != ' ') {//1 if(d_char != '\t') {//2 if(d_char != '\r') { if(d_char != '\n') return 0; } }//2 }//1 return 1; } ////// loadpoint function f_loadpoint(d_str,d_index,d_limit,d_point) { var d_char,d_numstr,d_num; for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) == 0) break; } d_numstr = String(d_char);//?String for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) != 0) break; d_numstr += d_char; } d_num = Number(d_numstr); if(Number.isFinite(d_num) == 0) return 0; if(d_num < d_xmin) d_num = d_xmin; else { if(d_num > d_xmax) d_num = d_xmax; } d_point.d_sx = Number(d_num);//?Number for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) == 0) break; } d_numstr = String(d_char);//?String for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) != 0) break; d_numstr += d_char; } d_num = Number(d_numstr); if(Number.isFinite(d_num) == 0) return 0; if(d_num < d_ymin) d_num = d_ymin; else { if(d_num > d_ymax) d_num = d_ymax; } d_point.d_sy = Number(d_num);//?Number for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) == 0) break; } d_numstr = String(d_char);//?String for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) != 0) break; d_numstr += d_char; } d_num = Number(d_numstr); if(Number.isFinite(d_num) == 0) return 0; if(d_num < d_zmin) d_num = d_zmin; else { if(d_num > d_zmax) d_num = d_zmax; } d_point.d_sz = Number(d_num);//?Number for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) == 0) break; } d_numstr = String(d_char);//?String for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) != 0) break; d_numstr += d_char; } d_num = Number(d_numstr); if(Number.isFinite(d_num) == 0) return 0; d_point.d_vx = Number(d_num);//?Number for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) == 0) break; } d_numstr = String(d_char);//?String for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) != 0) break; d_numstr += d_char; } d_num = Number(d_numstr); if(Number.isFinite(d_num) == 0) return 0; d_point.d_vy = Number(d_num);//?Number for(;;) { d_index++; if(d_index >= d_limit) return 0; d_char = d_str.charAt(d_index); if(f_testwsc(d_char) == 0) break; } d_numstr = String(d_char);//?String for(;;) {//1 d_index++; if(d_index >= d_limit) { d_index--; break; } d_char = d_str.charAt(d_index); if(f_testwsc(d_char) != 0) break; d_numstr += d_char; }//1 d_num = Number(d_numstr); if(Number.isFinite(d_num) == 0) return 0; d_point.d_vz = Number(d_num);//?Number return d_index; } ////// load function f_load() { var d_div; var d_object,d_prevobject; var d_point,d_prevpoint,d_pointindex; var d_char; var d_type; var d_area = document.getElementById("d_modelarea"); var d_str = d_area.value; if(d_str.length < 1) return; f_cleanfield(); var d_charindex = 0; var d_charlimit = d_str.length; var d_error = 0; for(;d_charindex < d_charlimit;d_charindex++) {//1 d_char = d_str.charAt(d_charindex); if(f_testwsc(d_char) != 0) continue; d_error = 1; if(d_char == '6') d_type = 6; else { if(d_char != '8') break; d_type = 8; } d_charindex++; if(d_charindex >= d_charlimit) break; d_char = d_str.charAt(d_charindex); if(f_testwsc(d_char) == 0) break; d_object = new Object();//? d_object.d_nextobject = null; if(p_objects == null) p_objects = d_object; else d_prevobject.d_nextobject = d_object; d_prevobject = d_object; d_object.p_points = null; d_object.d_type = d_type; delete d_object;//? d_pointindex = 0; for(;;) {//2 d_point = new Object();//? d_point.d_nextpoint = null; if(d_object.p_points == null) d_object.p_points = d_point; else d_prevpoint.d_nextpoint = d_point; d_prevpoint = d_point; delete d_point;//? d_charindex = f_loadpoint(d_str,d_charindex,d_charlimit,d_point); if(d_charindex == 0) break; d_div = document.createElement("div"); d_field.appendChild(d_div); d_div.style.width = d_pointsize + "px"; d_div.style.height = d_pointsize + "px"; d_div.style.position = "absolute"; if(d_type == 6) { d_div.style.backgroundColor = "red"; d_point.d_mass = d_octmass; } else { d_div.style.backgroundColor = "blue"; d_point.d_mass = d_cubemass; } d_pointindex++; if(d_pointindex < d_type) continue; d_error = 0; break; }//2 if(d_error != 0) break; }//1 if(d_error == 0) { f_showfield(); return; } f_cleanfield(); return; } ////// save function f_save() { var d_point; if(p_objects == null) return; var d_str = ""; var d_object = p_objects; var d_error = 1; for(;;) {//1 if(d_object.d_type == 6) d_str += "6 "; else { if(d_object.d_type != 8) break; d_str += "8 "; } d_point = d_object.p_points; for(;;) { d_str += d_point.d_sx + " " + d_point.d_sy + " " + d_point.d_sz + "\r\n "; d_str += d_point.d_vx + " " + d_point.d_vy + " " + d_point.d_vz + "\r\n"; d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object != null) continue; d_error = 0; break; }//1 if(d_error != 0) d_str = "error"; var d_area = document.getElementById("d_modelarea"); d_area.value = d_str; return; } ////// zeroimp function f_zeroimp() { var d_point,d_pointmass; if(p_objects == null) return; var d_mass = 0; var d_mvx = 0; var d_mvy = 0; var d_mvz = 0; var d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_pointmass = d_point.d_mass; d_mass += d_pointmass; d_mvx += d_point.d_vx * d_pointmass; d_mvy += d_point.d_vy * d_pointmass; d_mvz += d_point.d_vz * d_pointmass; d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 d_mvx /= d_mass; d_mvy /= d_mass; d_mvz /= d_mass; d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_point.d_vx -= d_mvx; d_point.d_vy -= d_mvy; d_point.d_vz -= d_mvz; d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 return; } ////// mulekin function f_mulekin() { var d_point; if(p_objects == null) return; var d_rootmul = Math.sqrt(d_kinmul); var d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_point.d_vx *= d_rootmul; d_point.d_vy *= d_rootmul; d_point.d_vz *= d_rootmul; d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 return; } ////// getekin function f_getekin() { var d_point; if(p_objects == null) return 0; var d_newekin = 0; var d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_newekin += (d_point.d_mass / 2) * ((d_point.d_vx * d_point.d_vx) + ((d_point.d_vy * d_point.d_vy) + (d_point.d_vz * d_point.d_vz))); d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 var d_area = document.getElementById("d_ekinarea"); if(Number.isFinite(d_newekin) != 0) { d_area.value = d_newekin; return d_newekin; } d_area.value = "infinity"; return 0; } ////// setekin function f_setekin() { var d_point; if(p_objects == null) return; var d_area = document.getElementById("d_ekinarea"); var d_newekin = Number(d_area.value); if(Number.isFinite(d_newekin) == 0) return; if(d_newekin < 0) return; var d_oldekin = 0; var d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_oldekin += (d_point.d_mass / 2) * ((d_point.d_vx * d_point.d_vx) + ((d_point.d_vy * d_point.d_vy) + (d_point.d_vz * d_point.d_vz))); d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 if(Number.isFinite(d_oldekin) == 0) return; if(d_oldekin < d_minpos) return; var d_rootmul = Math.sqrt(d_newekin / d_oldekin); if(Number.isFinite(d_rootmul) == 0) return; d_object = p_objects; for(;;) {//1 d_point = d_object.p_points; for(;;) { d_point.d_vx *= d_rootmul; d_point.d_vy *= d_rootmul; d_point.d_vz *= d_rootmul; d_point = d_point.d_nextpoint; if(d_point == null) break; } d_object = d_object.d_nextobject; if(d_object == null) break; }//1 return; } ////// getepot function f_getepot() { var d_object2; var d_point1,d_point2,d_point3,d_point4,d_point5,d_point6,d_point7,d_point8; var d_sx,d_sy,d_sz; var d_dx,d_dy,d_dz,d_dist; var d_dist0,d_diag; var d_area = document.getElementById("d_epotarea"); if(p_objects == null) { d_area.value = 0; return 0; } var d_upot = 0; var d_object1 = p_objects; for(;;) {//1 d_point1 = d_object1.p_points; d_point2 = d_point1.d_nextpoint; d_point3 = d_point2.d_nextpoint; d_point4 = d_point3.d_nextpoint; d_point5 = d_point4.d_nextpoint; d_point6 = d_point5.d_nextpoint; d_sx = d_point1.d_sx; d_sy = d_point1.d_sy; d_sz = d_point1.d_sz; if(d_object1.d_type == 6) { d_dist0 = d_octsize / Math.sqrt(2); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_octsize); d_sx = d_point6.d_sx; d_sy = d_point6.d_sy; d_sz = d_point6.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_sx = d_point2.d_sx; d_sy = d_point2.d_sy; d_sz = d_point2.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_octsize); d_sx = d_point4.d_sx; d_sy = d_point4.d_sy; d_sz = d_point4.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_dist0); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_dist0); d_upot += f_addownupot(d_point3.d_sx,d_point3.d_sy,d_point3.d_sz,d_point5,d_octsize); } else { d_point7 = d_point6.d_nextpoint; d_point8 = d_point7.d_nextpoint; d_diag = d_cubesize * Math.sqrt(3); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point2,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point7,d_diag); d_sx = d_point2.d_sx; d_sy = d_point2.d_sy; d_sz = d_point2.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point3,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_diag); d_sx = d_point3.d_sx; d_sy = d_point3.d_sy; d_sz = d_point3.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point4,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point7,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point5,d_diag); d_sx = d_point4.d_sx; d_sy = d_point4.d_sy; d_sz = d_point4.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point1,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_diag); d_sx = d_point5.d_sx; d_sy = d_point5.d_sy; d_sz = d_point5.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_cubesize); d_sx = d_point7.d_sx; d_sy = d_point7.d_sy; d_sz = d_point7.d_sz; d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point6,d_cubesize); d_upot += f_addownupot(d_sx,d_sy,d_sz,d_point8,d_cubesize); } d_object1 = d_object1.d_nextobject; if(d_object1 == null) break; }//1 d_object1 = p_objects; for(;;) {//1 for(d_object2 = d_object1.d_nextobject;d_object2 != null;d_object2 = d_object2.d_nextobject) {//2 d_point1 = d_object1.p_points; for(;;) {//3 d_sx = d_point1.d_sx; d_sy = d_point1.d_sy; d_sz = d_point1.d_sz; d_point2 = d_object2.p_points; for(;;) { d_dx = d_point2.d_sx - d_sx; d_dy = d_point2.d_sy - d_sy; d_dz = d_point2.d_sz - d_sz; d_dist = Math.sqrt((d_dx * d_dx) + ((d_dy * d_dy) + (d_dz * d_dz))); if(d_dist < d_minpos) d_dist = d_minpos; d_upot += f_outupot(d_dist); d_point2 = d_point2.d_nextpoint; if(d_point2 == null) break; } d_point1 = d_point1.d_nextpoint; if(d_point1 == null) break; }//3 }//2 d_object1 = d_object1.d_nextobject; if(d_object1 == null) break; }//1 if(Number.isFinite(d_upot) != 0) { d_area.value = d_upot; return d_upot; } d_area.value = "undefined"; return 0; } ////// getenergy function f_getenergy() { var d_ukin = f_getekin(); var d_upot = f_getepot(); var d_area = document.getElementById("d_energyarea"); d_area.value = d_ukin + d_upot; return; } ////// create function f_create() { var d_area; var d_left,d_top; d_field = document.createElement("div"); d_field.style.left = 0 + "px"; d_field.style.top = 0 + "px"; d_field.style.width = d_width + "px"; d_field.style.height = d_height + "px"; d_field.style.position = "absolute"; d_field.style.backgroundColor = "white"; d_field.style.color = "black"; document.body.appendChild(d_field); d_panel = document.createElement("div"); d_panel.style.left = d_width + "px"; d_panel.style.top = 0 + "px"; d_panel.style.width = (d_xspace + d_xsize + d_xspace + d_xsize + d_xspace + 20) + "px"; d_panel.style.height = 600 + "px"; d_panel.style.position = "absolute"; d_panel.style.backgroundColor = "whiteSmoke"; d_panel.style.color = "black"; document.body.appendChild(d_panel); d_top = d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_widthlabel","width",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_widtharea",d_width,d_left,d_top).onchange = f_width; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_heightlabel","height",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_heightarea",d_height,d_left,d_top).onchange = f_height; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_xminlabel","x minimum",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_xminarea",d_xmin,d_left,d_top).onchange = f_xmin; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_xmaxlabel","x maximum",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_xmaxarea",d_xmax,d_left,d_top).onchange = f_xmax; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_yminlabel","y minimum",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_yminarea",d_ymin,d_left,d_top).onchange = f_ymin; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_ymaxlabel","y maximum",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_ymaxarea",d_ymax,d_left,d_top).onchange = f_ymax; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_zminlabel","z minimum",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_zminarea",d_zmin,d_left,d_top).onchange = f_zmin; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_zmaxlabel","z maximum",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_zmaxarea",d_zmax,d_left,d_top).onchange = f_zmax; d_top += d_ysize + d_yspace; d_left = d_xspace; f_label(d_panel,"d_viewdirlabel","view along x,y,z",d_left,d_top); d_left += d_xsize + d_xspace; f_radio(d_panel,"d_xviewdirradio","d_viewdir",0,d_viewdir,d_left,d_top).onclick = f_viewdir;//?onchange d_left += d_ysize + d_xspace; f_radio(d_panel,"d_yviewdirradio","d_viewdir",1,d_viewdir,d_left,d_top).onclick = f_viewdir;//?onchange d_left += d_ysize + d_xspace; f_radio(d_panel,"d_zviewdirradio","d_viewdir",2,d_viewdir,d_left,d_top).onclick = f_viewdir;//?onchange d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_minposlabel","min positive",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_minposarea",d_minpos,d_left,d_top).onchange = f_minpos; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_mindistlabel","min distance",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_mindistarea",d_mindist,d_left,d_top).onchange = f_mindist; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_velmullabel","velocity mul",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_velmularea",d_velmul,d_left,d_top).onchange = f_velmul; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_kinmullabel","kinetic mul",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_kinmularea",d_kinmul,d_left,d_top).onchange = f_kinmul; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_octsizelabel","octahedron size",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_octsizearea",d_octsize,d_left,d_top).onchange = f_octsize; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_cubesizelabel","cube size",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_cubesizearea",d_cubesize,d_left,d_top).onchange = f_cubesize; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_ownrigidlabel","own rigidity",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_ownrigidarea",d_ownrigid,d_left,d_top).onchange = f_ownrigid; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_outrigidlabel","out rigidity",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_outrigidarea",d_outrigid,d_left,d_top).onchange = f_outrigid; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_xforcelabel","force along x",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_xforcearea",d_xforce,d_left,d_top).onchange = f_xforce; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_yforcelabel","force along y",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_yforcearea",d_yforce,d_left,d_top).onchange = f_yforce; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_zforcelabel","force along z",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_zforcearea",d_zforce,d_left,d_top).onchange = f_zforce; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_pointsizelabel","point size",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_pointsizearea",d_pointsize,d_left,d_top).onchange = f_pointsize; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_octslabel","octahedrons",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_octsarea",d_octs,d_left,d_top).onchange = f_octs; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_cubeslabel","cubes",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_cubesarea",d_cubes,d_left,d_top).onchange = f_cubes; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_octmasslabel","oct point mass",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_octmassarea",d_octmass,d_left,d_top).onchange = f_octmass; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_cubemasslabel","cub point mass",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_cubemassarea",d_cubemass,d_left,d_top).onchange = f_cubemass; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halflabel(d_panel,"d_msecslabel","msecs",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_msecsarea",d_msecs,d_left,d_top).onchange = f_msecs; d_left += (d_xsize / 2) + d_xspace; f_halflabel(d_panel,"d_timesteplabel","time step",d_left,d_top); d_left += (d_xsize / 2) + d_xspace; f_halfarea(d_panel,"d_timesteparea",d_timestep,d_left,d_top).onchange = f_timestep; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halfbutton(d_panel,"d_stepbutton","one step",d_left,d_top).onclick = f_step; d_left += (d_xsize / 2) + d_xspace; f_halfbutton(d_panel,"d_runbutton","run model",d_left,d_top).onclick = f_run; d_left += (d_xsize / 2) + d_xspace; f_halfbutton(d_panel,"d_pausebutton","pause",d_left,d_top).onclick = f_pause; d_left += (d_xsize / 2) + d_xspace; f_halfbutton(d_panel,"d_createbutton","create",d_left,d_top).onclick = f_createobjects; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halfbutton(d_panel,"d_loadbutton","load",d_left,d_top).onclick = f_load; d_left += (d_xsize / 2) + d_xspace; f_halfbutton(d_panel,"d_savebutton","save",d_left,d_top).onclick = f_save; d_left += (d_xsize / 2) + d_xspace; f_halfbutton(d_panel,"d_zeroimpbutton","0 impulse",d_left,d_top).onclick = f_zeroimp; d_left += (d_xsize / 2) + d_xspace; f_halfbutton(d_panel,"d_mulekinbutton","mul Ekin",d_left,d_top).onclick = f_mulekin; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halfbutton(d_panel,"d_getekinbutton","get Ekin",d_left,d_top).onclick = f_getekin; d_left += (d_xsize / 2) + d_xspace; f_area(d_panel,"d_ekinarea",0,d_left,d_top); d_left += d_xsize + d_xspace; f_halfbutton(d_panel,"d_setekinbutton","set Ekin",d_left,d_top).onclick = f_setekin; d_top += d_ysize + d_yspace; d_left = d_xspace; f_halfbutton(d_panel,"d_getepotbutton","get Epot",d_left,d_top).onclick = f_getepot; d_left += (d_xsize / 2) + d_xspace; f_area(d_panel,"d_epotarea",0,d_left,d_top); d_top += d_ysize + d_yspace; d_left = d_xspace; f_halfbutton(d_panel,"d_getenergybutton","get energy",d_left,d_top).onclick = f_getenergy; d_left += (d_xsize / 2) + d_xspace; f_area(d_panel,"d_energyarea",0,d_left,d_top); d_top += d_ysize + d_yspace; d_left = d_xspace; d_area = document.createElement("textarea"); d_area.id = "d_modelarea"; d_area.value = ""; d_area.style.left = d_xspace + "px"; d_area.style.top = d_top + "px"; d_area.style.width = (d_xsize * 2) + "px"; d_area.style.height = (d_ysize * 6) + "px"; d_area.style.position = "absolute"; d_area.style.backgroundColor = "white"; d_area.style.color = "black"; d_area.style.FontSize = 16; d_area.style.textAlign = "left"; d_panel.appendChild(d_area); return; }