КП: Динамика лавины — различия между версиями
Sizova (обсуждение | вклад) (→Визуализация программы) |
Sizova (обсуждение | вклад) (→Визуализация программы) |
||
Строка 56: | Строка 56: | ||
Файл '''"dl_avalanche_finish.js"''' | Файл '''"dl_avalanche_finish.js"''' | ||
<syntaxhighlight lang="javascript" line start="1" enclose="div"> | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | function main_dl_avalanche_finish() { | ||
+ | |||
+ | var ctx = canvas_avalanche_finish.getContext("2d"); | ||
+ | var width = canvas_avalanche_finish.width; | ||
+ | var height = canvas_avalanche_finish.height; | ||
+ | |||
+ | ctx.fillStyle="#8888ff"; | ||
+ | // координаты шара | ||
+ | var vx = 2, vy = 2; // скорость шара | ||
+ | var r = 5; // радиус шара | ||
+ | var grass_height = 5; | ||
+ | var mountian_length = 400; | ||
+ | var sin_alpha_1 = 0.5; | ||
+ | var cos_alpha_1 = 0.866; | ||
+ | var sun_r = 50; | ||
+ | var rx = 0, ry = mountian_length * sin_alpha_1 / cos_alpha_1 - r; | ||
+ | |||
+ | var g = 2; | ||
+ | var dt = 0.1; | ||
+ | var m = 1; | ||
+ | var B = 0.06; | ||
+ | var B2 = 0.09; | ||
+ | var fy = 0; | ||
+ | var fx = 0; | ||
+ | |||
+ | function step() { | ||
+ | tick(); | ||
+ | draw(); | ||
+ | } | ||
+ | |||
+ | function tick() { | ||
+ | if (rx + r > 0 && rx - r < mountian_length && ry < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx | ||
+ | + mountian_length * sin_alpha_1 / cos_alpha_1) { | ||
+ | fy = m * g - B * vy; | ||
+ | fx = m * g - B * vx; | ||
+ | vy = vy + fy / m * dt * sin_alpha_1; | ||
+ | vx = vx + fx / m * dt * cos_alpha_1; | ||
+ | ry = ry + vy * dt * sin_alpha_1; | ||
+ | rx = rx + vx * dt * cos_alpha_1; | ||
+ | } | ||
+ | if (rx - r > mountian_length){ | ||
+ | fx = - B2 * vx; | ||
+ | vx = vx + fx / m * dt; | ||
+ | rx = rx + vx * dt; | ||
+ | } | ||
+ | //if (rx - r < 0 || rx + r > width) vx = -vx; | ||
+ | //if (ry - r < 0) vy = -vy; | ||
+ | //rx = rx + vx; | ||
+ | //ry = ry + vy; | ||
+ | } | ||
+ | |||
+ | function draw() { | ||
+ | |||
+ | ctx.clearRect(0, 0, width, height); //clear | ||
+ | ctx.beginPath(); | ||
+ | |||
+ | ctx.fillStyle="#49b9ed"; //sky | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillRect(0, 0, width, height); | ||
+ | |||
+ | ctx.fillStyle="#16a600"; //grass | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillRect(0, height - grass_height, width, height); | ||
+ | |||
+ | ctx.fillStyle="#57564c"; //mountain | ||
+ | ctx.beginPath(); | ||
+ | ctx.moveTo(0, height - grass_height); | ||
+ | ctx.lineTo(mountian_length, height - grass_height); | ||
+ | ctx.lineTo(0, mountian_length * sin_alpha_1 / cos_alpha_1); | ||
+ | ctx.lineTo(0, height - grass_height); | ||
+ | ctx.fill(); | ||
+ | |||
+ | |||
+ | ctx.fillStyle="#fff200"; //sun | ||
+ | ctx.beginPath(); | ||
+ | ctx.arc(width, 0, sun_r, 0, 2 * Math.PI); | ||
+ | ctx.fill(); | ||
+ | |||
+ | ctx.fillStyle="#e6e5d1"; //snow | ||
+ | ctx.beginPath(); | ||
+ | ctx.arc(rx, ry, r, 0, 2 * Math.PI); | ||
+ | ctx.fill(); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | setInterval(step, 1000 / 60); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс) | ||
+ | |||
+ | } | ||
== Обсуждение результатов и выводы == | == Обсуждение результатов и выводы == |
Версия 09:24, 11 июня 2015
А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 2015 > Динамика лавиныКурсовой проект по Теоретической механике
Исполнитель: Сизова Екатерина
Группа: 09 (23604)
Семестр: весна 2015
Содержание
Аннотация проекта
На данный момент лавины являются одним из самых опасных видов природных катастроф. Под снежными лавинами погибает большое количество горнолыжников, сноубордистов, горных туристов, а также происходит разрушение горных деревень, дорожной инфраструктуры и наносится экологический вред лесам. Целью данной работы является разработка модели лавины, условий, при которых происходит ее сход(отрыв), а также расчет последствий, к которым может привести сход лавины.
Формулировка задачи
- разработка модели лавины, как набор шариков, обладающих определенной массой и находящихся в неустойчивом состоянии
- расчет параметров отрыва(схода лавины), ее распространения, а также исследование динамических характеристик процесса жизненного цикла лавины
Общие сведения по теме
Снег удерживается на склоне горы за счет силы трения. Сход лавины происходит в тот момент, когда сила давления массы снега начинает превышать силу трения.
Наиболее благоприятными для лавинообразования являются склоны крутизной 25—45°. Сход со склона скопившейся снежной массы обычно провоцируется климатическими причинами: резкой сменой погоды, дождями, а также механическими воздействиями на снежную массу. Иногда, в силу установившегося относительного равновесия между действующей силой трения и силой давления, сход лавины может инициироваться незначительным толчком (например, звуком ружейного выстрела или давлением на снег одного человека — горнолыжника, сноубордиста)
Решение
Моделирование сходы лавины происходит в двумерном пространстве. В качестве простейшей модели горы был взят прямоугольный треугольник, а в качестве снежной массы - большое количество элементов-кругов радиуса
,имитирующих отдельные частицы снежной массы.Целесообразно разделить движение шаров на 2 части: движение по наклонной плоскости и движение по горизонтальной поверхности.
При движении по наклонной плоскости шары скатываются со склона за счет силы тяжести
.
После того, как шары скатились со склона, они продолжают движение по горизонтальной поверхности, замедляясь за счет силы трения
.Визуализация программы
Файл "dl_avalanche_finish.js" <syntaxhighlight lang="javascript" line start="1" enclose="div"> function main_dl_avalanche_finish() {
var ctx = canvas_avalanche_finish.getContext("2d"); var width = canvas_avalanche_finish.width; var height = canvas_avalanche_finish.height;
ctx.fillStyle="#8888ff"; // координаты шара var vx = 2, vy = 2; // скорость шара var r = 5; // радиус шара
var grass_height = 5; var mountian_length = 400; var sin_alpha_1 = 0.5; var cos_alpha_1 = 0.866; var sun_r = 50; var rx = 0, ry = mountian_length * sin_alpha_1 / cos_alpha_1 - r;
var g = 2; var dt = 0.1; var m = 1; var B = 0.06; var B2 = 0.09; var fy = 0; var fx = 0;
function step() { tick(); draw(); }
function tick() {
if (rx + r > 0 && rx - r < mountian_length && ry < (height - grass_height - mountian_length * sin_alpha_1 / cos_alpha_1) * rx + mountian_length * sin_alpha_1 / cos_alpha_1) { fy = m * g - B * vy; fx = m * g - B * vx; vy = vy + fy / m * dt * sin_alpha_1; vx = vx + fx / m * dt * cos_alpha_1; ry = ry + vy * dt * sin_alpha_1; rx = rx + vx * dt * cos_alpha_1; } if (rx - r > mountian_length){ fx = - B2 * vx; vx = vx + fx / m * dt; rx = rx + vx * dt; }
//if (rx - r < 0 || rx + r > width) vx = -vx; //if (ry - r < 0) vy = -vy; //rx = rx + vx; //ry = ry + vy; }
function draw() {
ctx.clearRect(0, 0, width, height); //clear
ctx.beginPath();
ctx.fillStyle="#49b9ed"; //sky ctx.beginPath(); ctx.fillRect(0, 0, width, height);
ctx.fillStyle="#16a600"; //grass ctx.beginPath(); ctx.fillRect(0, height - grass_height, width, height);
ctx.fillStyle="#57564c"; //mountain ctx.beginPath(); ctx.moveTo(0, height - grass_height); ctx.lineTo(mountian_length, height - grass_height); ctx.lineTo(0, mountian_length * sin_alpha_1 / cos_alpha_1); ctx.lineTo(0, height - grass_height); ctx.fill();
ctx.fillStyle="#fff200"; //sun
ctx.beginPath(); ctx.arc(width, 0, sun_r, 0, 2 * Math.PI); ctx.fill();
ctx.fillStyle="#e6e5d1"; //snow ctx.beginPath();
ctx.arc(rx, ry, r, 0, 2 * Math.PI); ctx.fill();
}
setInterval(step, 1000 / 60); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
}
Обсуждение результатов и выводы
Скачать отчет
Скачать презентацию: