Редактирование: Balls v6
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | [[ | + | [[ТМ|Кафедра ТМ]] > [[Программирование]] > [[Программирование и моделирование в Интернет|Интернет]] > [[JavaScript-программирование|JavaScript]] > [[JavaScript - Balls|Balls]] > '''Balls v6''' <HR> |
− | + | <addscript src=Balls_v6_release/> | |
− | <htmlet nocache="yes"> | + | <htmlet nocache="yes">Balls_v6_TM</htmlet> |
Скачать программу: [[Медиа:Balls_v6_release.zip|Balls_v6_release.zip]] | Скачать программу: [[Медиа:Balls_v6_release.zip|Balls_v6_release.zip]] | ||
− | + | Текст программы на языке JavaScript (разработчики [[Кривцов Антон]], [[Цветков Денис]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> | |
− | |||
Файл '''"Balls_v6_release.js"''' | Файл '''"Balls_v6_release.js"''' | ||
− | < | + | <source lang="javascript" first-line="1"> |
function MainBalls(canvas, slider_01, text_01, slider_02, text_02) { | function MainBalls(canvas, slider_01, text_01, slider_02, text_02) { | ||
Строка 20: | Строка 19: | ||
var Pi = 3.1415926; // число "пи" | var Pi = 3.1415926; // число "пи" | ||
+ | var k = 1.38; // * 10E-23 // постоянная Больцмана | ||
var m0 = 1; // масштаб массы | var m0 = 1; // масштаб массы | ||
Строка 44: | Строка 44: | ||
var a = 2 * r; // равновесное расстояние между частицами | var a = 2 * r; // равновесное расстояние между частицами | ||
var aCut = 2 * a; // радиус обрезания | var aCut = 2 * a; // радиус обрезания | ||
− | + | ||
− | |||
// *** Задание вычислительных параметров *** | // *** Задание вычислительных параметров *** | ||
Строка 63: | Строка 62: | ||
var SLJDenominator = 1 / (aCut * aCut - b2); // знаменатель для расчета SLJ потенциала | var SLJDenominator = 1 / (aCut * aCut - b2); // знаменатель для расчета SLJ потенциала | ||
− | var | + | var TGoal = 2 * D; // целевая температура системы |
− | |||
− | |||
− | |||
− | |||
var TActual = 0; // актуальная температура | var TActual = 0; // актуальная температура | ||
− | var | + | var TActualMax = 200 * D; // максимальная температура, при которой работает термостат (для избежания беск. скоростей) |
− | var Tk = | + | var Tk = 1 / (3 * k) * m; // ___в целях оптимизации___ |
− | var viscFrictionTh = document.getElementById(' | + | var viscFrictionTh = document.getElementById('checkbox_01').checked; // термостат применяется к вязкости среды |
− | var internalFrictionTh = document.getElementById(' | + | var internalFrictionTh = document.getElementById('checkbox_01').checked; // термостат применяется к внутреннему трению |
− | |||
var Ka = K * a; // ___в целях оптимизации___ | var Ka = K * a; // ___в целях оптимизации___ | ||
Строка 80: | Строка 74: | ||
var dNd = null; // ссылка на захваченный курсором шар (drag & drop) | var dNd = null; // ссылка на захваченный курсором шар (drag & drop) | ||
var grad; // должен ли работать градиент (регулируется в функции setNy()) | var grad; // должен ли работать градиент (регулируется в функции setNy()) | ||
− | |||
this.setSlider_01 = function(c) {mg = c * m * g0;}; // функция для слайдера гравитации | this.setSlider_01 = function(c) {mg = c * m * g0;}; // функция для слайдера гравитации | ||
− | this.setSlider_02 = function(c) {TGoal = c;}; | + | this.setSlider_02 = function(c) {TGoal = c * D;}; // функция для слайдера термостата |
this.setNy = function(ny) { | this.setNy = function(ny) { | ||
Ny = ny; | Ny = ny; | ||
Строка 93: | Строка 86: | ||
}; | }; | ||
this.setNy(Ny); // запускаем с уже присвоенным значением, чтобы обновились настройки градиента | this.setNy(Ny); // запускаем с уже присвоенным значением, чтобы обновились настройки градиента | ||
− | this.setCheckbox_01 = function(bool) { | + | this.setCheckbox_01 = function(bool) {viscFrictionTh = bool}; |
− | + | this.setCheckbox_02 = function(bool) {internalFrictionTh = bool}; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | this.setCheckbox_02 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// Запуск новой системы | // Запуск новой системы | ||
Строка 141: | Строка 104: | ||
this.setRandom(); // задаем случайную конфигурацию | this.setRandom(); // задаем случайную конфигурацию | ||
}; | }; | ||
+ | |||
+ | // настройка интерфейса | ||
+ | slider_01.min = 0; slider_01.max = 5; | ||
+ | slider_01.step = 0.05; | ||
+ | slider_01.value = mg / m / g0; // начальное значение ползунка должно задаваться после min и max | ||
+ | text_01.value = mg / m / g0; | ||
+ | slider_02.min = 0; slider_02.max = 5; | ||
+ | slider_02.step = 0.05; | ||
+ | slider_02.value = TGoal / D; // начальное значение ползунка должно задаваться после min и max | ||
+ | text_02.value = TGoal / D; | ||
// Работа с мышью | // Работа с мышью | ||
Строка 255: | Строка 228: | ||
var BViscTh = BVisc; | var BViscTh = BVisc; | ||
var BInternalTh = BInternal; | var BInternalTh = BInternal; | ||
+ | |||
// работа термостата | // работа термостата | ||
− | + | if (balls.length > 0) { | |
− | + | var v2Sum = 0; | |
− | + | for (var i1 = 0; i1 < balls.length; i1++) | |
− | + | v2Sum += balls[i1].vx * balls[i1].vx + balls[i1].vy * balls[i1].vy; | |
− | + | var v2Average = v2Sum / balls.length; | |
− | + | TActual = Tk * v2Average; | |
− | |||
− | + | if (TActual < TActualMax) { // из за того, что мышкой можно задать шарам запредельную скорость | |
− | + | if (viscFrictionTh) BViscTh = BVisc * (TActual - TGoal); // действие термостата | |
− | + | if (internalFrictionTh) BInternalTh = BInternal * (TActual - TGoal); // действие термостата | |
− | + | } | |
− | + | } else | |
− | + | TActual = 0; // для датчика температуры на странице | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// пересчет сил идет отдельным массивом, т.к. далее будут добавляться силы взаимодействия между шарами | // пересчет сил идет отдельным массивом, т.к. далее будут добавляться силы взаимодействия между шарами | ||
Строка 311: | Строка 274: | ||
var s2 = a2 / r2; var s4 = s2 * s2; // ___в целях оптимизации___ | var s2 = a2 / r2; var s4 = s2 * s2; // ___в целях оптимизации___ | ||
var F = LJCoeff * s4 * s4 * (s4 * s2 - 1); // сила взаимодействия Леннарда-Джонса | var F = LJCoeff * s4 * s4 * (s4 * s2 - 1); // сила взаимодействия Леннарда-Джонса | ||
− | + | var kSLJ; // k(r) - сглаживающий коэффициент SLJ потенциала | |
− | + | if (r <= b) kSLJ = 1; | |
− | + | else { | |
− | + | var brackets = (r2 - b2) * SLJDenominator; | |
− | + | kSLJ = 1 - brackets * brackets; | |
− | + | } // случай rLen > aCut обработан выше | |
− | + | F *= kSLJ; | |
− | |||
− | |||
// сила внутреннего трения между частицами | // сила внутреннего трения между частицами | ||
Строка 374: | Строка 335: | ||
// след. функция обновляет информацию о количестве частиц на поле | // след. функция обновляет информацию о количестве частиц на поле | ||
setInterval(function(){document.getElementById('ballsNum').innerHTML = balls.length;}, 1000 / 20); | setInterval(function(){document.getElementById('ballsNum').innerHTML = balls.length;}, 1000 / 20); | ||
+ | setInterval(function(){document.getElementById('Temperature').innerHTML = TActual.toFixed(3);}, 1000 / 3); | ||
} | } | ||
− | </ | + | </source> |
Файл '''"Balls_v6_release.html"''' | Файл '''"Balls_v6_release.html"''' | ||
− | < | + | <source lang="html" first-line="1"> |
<!DOCTYPE html> | <!DOCTYPE html> | ||
<html> | <html> | ||
Строка 416: | Строка 378: | ||
</div><br> | </div><br> | ||
− | <div> | + | <div>Термостат: |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<input type="range" id="slider_02" style="width: 150px;" oninput="app.setSlider_02(this.value); document.getElementById('text_02').value = this.value;"> | <input type="range" id="slider_02" style="width: 150px;" oninput="app.setSlider_02(this.value); document.getElementById('text_02').value = this.value;"> | ||
− | + | <input id="text_02" style="width: 5ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput=" | |
// если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false | // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false | ||
if (!this.checkValidity()) return; | if (!this.checkValidity()) return; | ||
Строка 431: | Строка 386: | ||
document.getElementById('slider_02').value = this.value; | document.getElementById('slider_02').value = this.value; | ||
"> | "> | ||
− | + | ⋅ D<br> | |
− | |||
− | |||
Термостат действует на: | Термостат действует на: | ||
− | <input type="checkbox" checked id=" | + | <input type="checkbox" checked id="checkbox_01" name="" onclick="app.setCheckbox_01(this.checked);"/>Внешнее трение |
− | <input type="checkbox" checked id=" | + | <input type="checkbox" checked id="checkbox_02" name="" onclick="app.setCheckbox_02(this.checked);"/>Внутреннее трение |
<div>T ≈ <span id="Temperature"></span></div> | <div>T ≈ <span id="Temperature"></span></div> | ||
</div><br> | </div><br> | ||
Строка 451: | Строка 404: | ||
</body> | </body> | ||
</html> | </html> | ||
− | </ | + | </source> |
− | </ | + | </toggledisplay> |
− | |||
− | |||
[[Category: Программирование]] | [[Category: Программирование]] | ||
+ | [[Category: JavaScript]] |