Дискуссионный математический форумМатематический форум
Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 3 часа [ Летнее время ]
новый онлайн-сервис
число, сумма и дата прописью

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Точечная модель твёрдого тела в компьютерной симуляции
СообщениеДобавлено: 20 ноя 2022, 09:44 
Не в сети
Одарённый
Зарегистрирован:
25 окт 2022, 19:47
Сообщений: 113
Cпасибо сказано: 2
Спасибо получено:
5 раз в 5 сообщениях
Очков репутации: 5

Добавить очки репутацииУменьшить очки репутации
Хочу поделиться рассуждениями, как представить "точками" твёрдое тело и моделировать механические процессы. Каждая точка по умолчанию имеет одинаковую массу и условно занимает одинаковый объём, хотя могут быть другие варианты. Изначально точки размещаются в узлах некоторой "кристаллической решётки", например, в вершинах кубов, хотя более реалистичные очертания тел с меньшим количеством элементов получатся при плотнейшей гексагональной упаковке (максимум 6 соседей на плоскости, 12 в объёме).

Тела бывают "упругие" с постоянным закреплением за точкой определённых соседей, и "плывучие", где соседи могут меняться с перестройкой сети связности после каждого (дискретного) шага времени. Задавать совсем "жёсткие" тела, где точки не смещаются, наверное нет смысла точками по всему объёму. Лучше задать только поверхность, возможно с размещением текстур на получившихся треугольниках, и рассмотрением тела как единого физического объекта с какими-то вращениями и моментами помимо линейных движений центра тяжести. Тогда как каждая точка упругого или плывучего тела перемещается только линейно, без внутренних степеней свободы. Основная особенность модели состоит в том, чтобы отказаться от потенциальных энергий связей между точками и использовать только силы (градиенты потенциальных энергий), что может радикально упростить расчёты и ускорить исполнение кода.

Изначально в покоящейся решётке силы взаимодействия между соседями нулевые, при сближении возникает отталкивание, при удалении притяжение, у упругих тел оно сохраняется и при растягивании до бесконечности, у плывучих заканчивается (плавно переходит в ноль) на расстоянии меньшем, чем до точек, следующих за соседями. Задание формы силовой кривой имеет важное значение в статистической достоверности модели, состоящей из большого количества точек. При пространственном совпадении двух точек после перемещений сила их отталкивания не должна становиться бесконечной, что может приводить к появлению огромных локальных ускорений и импульсов. А направление конечной силы при нулевом расстоянии между точками задавалось бы специальным алгоритмом, с учётом других сил и скоростей, в конце концов просто случайным образом. Для упругих тел важно, чтобы точки после случайного "перемешивания" возвращались на свои законные места в решётке, что можно проверить на кубе или шестиграннике с ещё одной точкой в центре. То есть, после "перехода через соседа на чужую сторону" чтобы притяжение к остальным соседям преобладало над отталкиванием от оказавшегося ближайшим соседа.

При отказе от потенциальных энергий локальное сохранение импульсов и энергий выглядит так: записываются два вида скоростей, импульсные vi и энергетические ve. Отдельно по всем координатам, то есть, (vix,viy,viz) и (vex,vey,vez)
Когда подсчитана сумма сил, действующих на точку, результирующие делятся на массу и получаются ускорения:
ax = fx / m, ay = fy / m, az = fz / m
К импульсным скоростям добавляются ускорения, умноженные на шаг времени:
vix += ax * dt, viy += ay * dt, viz += az * dt
Поскольку на другие точки действуют такие же силы в противоположном направлении, это гарантирует сохранение импульса. Из-за накопления погрешностей при вычислениях время от времени потребуется глобальная коррекция импульса по всему модельному объёму (обычно чтобы суммарный импульс был нулевым по каждой координате, если объём покоится). Затем рассчитывается гипотетическая кинетическая энергия на основании импульсных скоростей, где умножение на массу точки и деление на два можно пропустить для простоты вычислений, то есть, рассчитать условную величину Ei = vix^2 + viy^2 + viz^2
Если она меньше квадрата максимально возможной скорости (обозначим таковую vc по аналогии со скоростью света), то есть Ei <= vc^2, энергетические скорости приравниваются импульсным и на этом данный участок алгоритма завершается. Иначе энергетические скорости рассчитываются по формулам:
vex = vix * vc / sqrt(Ei), vey = viy * vc / sqrt(Ei), vez = viz * vc / sqrt(Ei)
Таким образом кинетическая энергия Ee = vex^2 + vey^2 + vez^2 (умножение на m/2 держим в уме) не может превышать vc^2. Если оказывается меньшей, представляем в уме условное четвёртое измерение, со скоростью vew, так что vex^2 + vey^2 + vez^2 + vew^2 = vc^2 (всегда). Если точка покоится, vew = vc, vew^2 = vc^2. Это гарантирует сохранение энергии, которая при отсутствии явных потенциальных энергий может взяться только из "запаса", образованного vew^2, что представляет собой некий аналог массы покоя, умноженной на скорость света в квадрате. Временами может требоваться глобальная коррекция энергий из-за накопления погрешностей вычислений.

На движение точки влияет только энергетическая скорость, а импульсная остаётся в запасе до следующего воздействия сил на точку. То есть перемещение точки (на следующем шаге алгоритма) не может превышать по модулю величину vc * dt. Регулировкой шага времени dt и максимальной скорости vc можно обеспечить адекватное поведение модели. Желательно, чтобы каждая точка имела как минимум троих соседей при упругом соединении, это позволит избежать "собирания в складки" тонкой линии, состоящей из точек только с двумя соседями. Здесь не рассмотрен подробно вопрос хранения точек в памяти. Когда их немного, подходит список, при большом количестве понадобится дерево, где каждый узел ограничивает какой-то шар или параллелепипед в пространстве, чтобы близкие узлы располагались ближе пространственно, чем далёкие, хотя могут пересекаться. Это позволит ускорить поиски вероятных соседей в плывучих телах, отсекая узлы, границы которых находятся далеко от рассматриваемой точки.

Было бы интересно ознакомиться с результатами моделирования, если кто-то решит воспроизвести такой алгоритм. Не прошу выкладывать готовый программный код, но может какую-то анимацию, реалистично ли сталкиваются два тела, как восстанавливается "игрушка из мягкой резины" после раздавливания. Также хотелось бы получить ваши замечания и комментарии, может существуют лучшие алгоритмы по скорости вычислений и реалистичности моделируемых явлений?

Прошу прощения за отсутствие Латекс-формул, здесь намеренно запись формул приближена к программному коду.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Точечная модель твёрдого тела в компьютерной симуляции
СообщениеДобавлено: 20 ноя 2022, 11:30 
Не в сети
Последняя инстанция
Зарегистрирован:
12 сен 2010, 12:46
Сообщений: 5311
Cпасибо сказано: 114
Спасибо получено:
924 раз в 873 сообщениях
Очков репутации: 72

Добавить очки репутацииУменьшить очки репутации
computer писал(а):
Прошу прощения за отсутствие Латекс-формул

Латекс это немного из другой оперы, ЛАТЕХ (для любителей английского лэйтех), Х на конце, как порох или скоморох

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Точечная модель твёрдого тела в компьютерной симуляции
СообщениеДобавлено: 22 янв 2023, 19:45 
Не в сети
Одарённый
Зарегистрирован:
25 окт 2022, 19:47
Сообщений: 113
Cпасибо сказано: 2
Спасибо получено:
5 раз в 5 сообщениях
Очков репутации: 5

Добавить очки репутацииУменьшить очки репутации
Выкладываю программку, или даже точнее заготовку, на Javascript для моделирования упругих тел,
состоящих из "точек", взаимодействующих между собой. Можно сгенерировать случайным образом
расположение и скорости движения нескольких объектов, октаэдров и кубов, или загрузить
текст с произвольным описанием через форму. В пределах одного объекта точки взаимодействуют
по закону: потенциальная энергия между двумя точками равна c • (2 • r0^3 / r + r^2 - 3 • r0^2)
где с = константа упругости, r0 = равновесное расстояние (как в правильном кубе или октаэдре),
r = расстояние между точками. Сила взаимодействия равна 2 • c • (r0^3 / r^2 - r)
Между точками различающихся объектов потенциальная энергия равна с • (1 / r - 1 / r0)
для r <= r0, и нулю для r > r0. Сила взаимодействия равна с / r^2 для r <= r0,
и нулю для r > r0, константа упругости здесь другая. Общая энергия системы (потенциальная
плюс кинетическая) по умолчанию сохраняется, для чего движение точек рассматривается поочерёдно,
не "прыгают" сразу несколько на очень близкие места, что может привести к невероятному росту
потенциальной энергии. Если точка под действием силы собирается перейти через заданный шаг
времени туда, где её потенциальная энергия растёт настолько, что кинетической недостаточно
для компенсации, движение не происходит и скорости меняются на обратные. То же самое при
выходе к границам модельного объёма. В первую очередь внимание уделяется сохранению энергии,
а импульса постольку-поскольку. Алгоритм спорный, возможны модификации, буду рад
дельным предложениям. Возможные дальнейшие пути развития программы:
- введение в систему абсолютно жёстких предметов, где расстояния между точками постоянные
и наложенные на треугольники текстуры не искажались бы;
- стремление объекта в целом двигаться в одном направлении под действием особой силы или инерции,
со сложными пересчётами общего импульса, вращательных моментов и кинетической энергии;
- постепенное замедление движений точек внутри объекта, путём умножения скоростей
на уменьшающую константу, условный переход упругих колебаний в тепловую энергию.
Настройки по умолчанию могут быть не лучшими, экспериментируйте, сам я не собираюсь
пока особенно заниматься этой программой.

Скрипт запускается следующим образом (эти строки можно поместить в файл с расширением .htm или .html):

<HTML>
<HEAD>
<script src=«solid.txt»></script>
</HEAD>
<BODY>
<noscript style=«text-align: center; font-size: 50;»>JAVASCRIPT MUST BE TURNED ON</noscript>
<script type=«text/javascript»>
document.body.style.backgroundColor = «WhiteSmoke»;
f_create();
</script>
</BODY>
</HTML>

В файле solid.txt, который должен быть в той же папке, содержится остальной код.

Пояснения к интерфейсу:
Целочисленные width и height определяют ширину и высоту модельного поля в пикселах.
Поля x,y,z minimum и maximum задают границы реального объёма. По каждому измерению
размах дожен быть больше (или равен) размеров сгенерированного октаэдра или куба.
Следует учитывать, что текстовые поля реально изменяются не после нажатия клавиши enter,
а после клика мышкой в другом месте.
Радио переключатели view along показывают, вдоль какой оси пользователь наблюдает
модельный объём, по умолчанию вдоль z, остальные оси всегда направлены вправо и вниз
(используется правая система координат).
Поле min positive обозначает минимальную положительную величину, допустимую в расчётах,
в частности, для деления, чтобы знаменатель не был равным нулю.
Поле min distance показывает на каком расстоянии (или меньшем)
начинают взаимодействовать "чужие" точки при упругом отталкивании.
Поле velocity mul это множитель для скоростей, задаваемых при создании рандомной модели.
Поле kinetic mul используется при нажатии кнопки mul Ekin, чтобы умножить
кинетическую энергию системы на заданное число, то есть фактически уменьшить
или увеличить скорость движения точек и условную «температуру».
Поле octahedron size задаёт размеры октаэдра, cube size размеры куба.
Поле own rigidity задаёт константу упругости внутри объекта,
out rigidity константу упругости между разными объектами.
Поля force along x,y,z задают дополнительные силы, действующие вдоль каждого измерения.
Величина point size обозначает размеры точки (квадратика) в пикселах.
Целочисленные octahedrons и cubes показывают количество объектов каждого вида.
Поля oct point mass и cub point mass обозначают массы точек по каждому виду объектов.
Поле msecs показывает как часто (в миллисекундах) вызывается шаг симуляции.
Поле time step это шаг времени, величина для использования в расчётах обновления
реальных скоростей и положений точек в системе координат.
Кнопка one step делает один шаг в симуляции.
Кнопка run model запускает регулярно повторяемую симуляцию.
Кнопка pause останавливает исполнение.
Кнопка create создаёт рандомную модель с заданными выше настройками.
Кнопки load и save нужны для загрузки и сохранения модели через текстовое поле
внизу панели управления, в формате «количество точек» + 3 числа для положений x,y,z
+ 3 числа для скоростей x,y,z, числа разделяются одним или многими white-space
символами, к которым относится пробел, табуляция (горизонтальная),
перевод на новую строку и возврат каретки.
Кнопка 0 impulse обнуляет суммарный импульс системы по всем измерениям.
Кнопка mul Ekin, как написано выше, использует множитель для кинетической энергии
системы точек, изменяет «температуру».
Кнопка get Ekin получает суммарную кинетическую энергию в поле справа.
Кнопка set Ekin загружает из этого поля кинетическую энергию, с соответствующим
уножением скоростей точек, если это математически возможно.
Кнопка get Epot получает суммарную потенциальную энергию в поле справа.
Кнопка get energy получает суммарную энергию в поле справа, также обновляет
кинетическую и потенциальную.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Точечная модель твёрдого тела в компьютерной симуляции
СообщениеДобавлено: 22 янв 2023, 19:47 
Не в сети
Одарённый
Зарегистрирован:
25 окт 2022, 19:47
Сообщений: 113
Cпасибо сказано: 2
Спасибо получено:
5 раз в 5 сообщениях
Очков репутации: 5

Добавить очки репутацииУменьшить очки репутации
////// 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;
}

Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему      Страница 1 из 1 [ Сообщений: 4 ]

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Точечная модель газов и жидкостей

в форуме Молекулярная физика и Термодинамика

computer

9

172

06 дек 2022, 23:36

Вращение твёрдого тела

в форуме Механика

searcher

6

309

21 окт 2019, 18:32

Угловая скорость твердого тела

в форуме Объявления участников Форума

wrobel

0

814

19 сен 2015, 11:09

Плоскопараллельное движение твёрдого тела

в форуме Механика

nikita_ilyasov1

0

134

15 апр 2020, 14:37

Момент инерции твердого тела

в форуме Механика

Finn_parnichka

1

233

28 янв 2018, 17:50

Молярная теплоемкость твердого тела

в форуме Специальные разделы

furfur

0

310

31 окт 2019, 18:32

Определение скоростей и ускорений точек твердого тела

в форуме Механика

cutie228

0

165

09 апр 2020, 15:58

Задача про сложное вращательное движение твердого тела

в форуме Механика

Struggling student

4

204

04 дек 2020, 00:48

Определение скорости твердого тела при поступательном движен

в форуме Механика

Camirzo

0

261

05 ноя 2013, 23:24

Определение скорости твердого тела при поступательном движ

в форуме Механика

Camirzo

0

276

05 ноя 2013, 23:27


Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Яндекс.Метрика

Copyright © 2010-2022 MathHelpPlanet.com. All rights reserved