diff --git a/physical_block_system/index/forms.py b/physical_block_system/index/forms.py index ecebb38..341d33c 100644 --- a/physical_block_system/index/forms.py +++ b/physical_block_system/index/forms.py @@ -7,8 +7,6 @@ class PhysicalObjectiveForm(forms.Form): m2 = forms.FloatField(label='m₂') m = forms.FloatField(label='m, центр') - t = forms.FloatField(label='Время') - def clean(self): errors = {} for key, value in self.cleaned_data.items(): diff --git a/physical_block_system/index/templates/index/index.html b/physical_block_system/index/templates/index/index.html index 50d0378..5248fcf 100644 --- a/physical_block_system/index/templates/index/index.html +++ b/physical_block_system/index/templates/index/index.html @@ -20,8 +20,6 @@ - {{ form.t|as_crispy_field }} - @@ -49,8 +47,7 @@ t1 = {{ t1 }}
t2 = {{ t2 }}
- t3 = {{ t3 }}
- t = {{ t }}

+ t3 = {{ t3 }}

a1 = {{ a1 }}
a2 = {{ a2 }}
diff --git a/physical_block_system/index/utils.py b/physical_block_system/index/utils.py index 5aa6b1d..1701b56 100644 --- a/physical_block_system/index/utils.py +++ b/physical_block_system/index/utils.py @@ -31,10 +31,6 @@ def caclculate_blocks(cleaned_date: dict): m = cleaned_date.get('m') m1 = cleaned_date.get('m1') m2 = cleaned_date.get('m2') - t = cleaned_date.get('t') - t1 = None - t2 = None - t3 = None reversed_masses = False if m2 < m1: @@ -52,9 +48,6 @@ def caclculate_blocks(cleaned_date: dict): y0_2 = -1 * (l2 - S_TABLE / 2 + l) a1 = g * (m2 - m1 - k * m) / (m + m2 + m1) - a2 = None - a3 = None - a4 = None if a1 < 0 or m2 == m1: return { 'result_text': "В начальном положении", @@ -71,63 +64,24 @@ def caclculate_blocks(cleaned_date: dict): if True: # легкое тело окажется в (0, 0) через t1 = math.sqrt(2 * (l1 - S_TABLE / 2 + l) / a1) - # До истечения t1 - if t <= t1: - # тело проедет не t1 секунд, а за остаток от заданого t - t1 = t - y1 = y0_1 + a1 * t1 ** 2 / 2 - x1 = x0_1 = 0 - y2 = y0_2 - a1 * t1 ** 2 / 2 - x2 = x0_2 = S_TABLE - y = y0 = 0 - x = x0 + a1 * t1 ** 2 / 2 - - result_text = 'Меньшее тело остановится до блока' - else: - # После истечения t1 - # 3 страница решения - a2 = (m2 * g - k * g * (m1 + m)) / (m + m1 + m2) - t2 = _calculate_t2(S_TABLE=S_TABLE, l1=l1, l=l, a1=a1, a2=a2, t1=t1) - # До истечения t2 - if t - t1 - t2 < 0: - # тело проедет не t2 секунд, а за остаток от заданого t - # 4 страница решения - t2 = t - t1 - y1 = 0 - x1 = a1 * t1 + a2 * t2 ** 2 - y2 = -a1 * t1 + S_TABLE - 2 * l - l2 - l1 - (a2 * t2 ** 2) / 2 - x2 = S_TABLE - y = 0 - x = l1 + l + a1 * t1 + (a2 * t2 ** 2) / 2 - - result_text = 'Меньшее тело остановится после блока, но до следующего блока' - else: - # После истечения t2 - # 5 страница решения - a3 = g * (m2 + m - k * m1) / (m1+m2+m) - - t3 = _calculate_t3(l1=l1, l=l, a1=a1, a2=a2, a3=a3, t1=t1, t2=t2) - if t - t1 - t2 - t3 < 0: - # До истечения t1 - t3 = t - t1 - t2 - y1 = 0 - x1 = (a1*t1 + a2*t2) * t3 + S_TABLE - l1 - l + a3*t3**2/2 - y2 = (-l2 - l) - (a1*t1 + a2*t2) * t3 - a3*t3**2/2 - x2 = S_TABLE - y = -(a1*t1 + a2*t2) * t3 - a3*t3**2/2 - x = S_TABLE - result_text = 'Одно тело останется на столе, двое повиснут' - else: - # все тела летят вниз, a4 = g = 9,8 - a4 = g * (m + m1 + m2) / (m + m1 + m2) - - y1 = 0 - x1 = S_TABLE - y2 = -l2 - l1 - S_TABLE - x2 = S_TABLE - y = l1 + l - 2 * S_TABLE - x = S_TABLE - result_text = 'Тяжелое тело унесёт два других' + # После истечения t1 + # 3 страница решения + a2 = (m2 * g - k * g * (m1 + m)) / (m + m1 + m2) + t2 = _calculate_t2(S_TABLE=S_TABLE, l1=l1, l=l, a1=a1, a2=a2, t1=t1) + + # 5 страница решения + a3 = g * (m2 + m - k * m1) / (m1+m2+m) + t3 = _calculate_t3(l1=l1, l=l, a1=a1, a2=a2, a3=a3, t1=t1, t2=t2) + + # все тела летят вниз, a4 = g = 9,8 + a4 = g * (m + m1 + m2) / (m + m1 + m2) + + y1 = 0 + x1 = S_TABLE + y2 = -l2 - l1 - S_TABLE + x2 = S_TABLE + y = l1 + l - 2 * S_TABLE + x = S_TABLE if reversed_masses: m1, m2 = m2, m1 @@ -137,7 +91,7 @@ def caclculate_blocks(cleaned_date: dict): # "y" менять не нужно, т.к. все случаи зеркальны по y оси return { - 'result_text': result_text, + 'result_text': "Тяжелое тяло перевесит", 'y1': y1, 'x1': x1, 'y2': y2, @@ -151,7 +105,6 @@ def caclculate_blocks(cleaned_date: dict): 't1': t1, 't2': t2, 't3': t3, - 't': t, 'm1': m1, 'm2': m2, 'm': m diff --git a/static/js/index.js b/static/js/index.js index 70c0743..c350958 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -4,24 +4,23 @@ const m1 = document.querySelector("#m1").textContent, m = document.querySelector("#m").textContent; // конечные координаты -let x = document.querySelector("#x").textContent.replace(',', '.'), - y = document.querySelector("#y").textContent.replace(',', '.'), - x1 = document.querySelector("#x1").textContent.replace(',', '.'), - y1 = document.querySelector("#y1").textContent.replace(',', '.'), - x2 = document.querySelector("#x2").textContent.replace(',', '.'), - y2 = document.querySelector("#y2").textContent.replace(',', '.'); +let x = +document.querySelector("#x").textContent.replace(',', '.'), + y = +document.querySelector("#y").textContent.replace(',', '.'), + x1 = +document.querySelector("#x1").textContent.replace(',', '.'), + y1 = +document.querySelector("#y1").textContent.replace(',', '.'), + x2 = +document.querySelector("#x2").textContent.replace(',', '.'), + y2 = +document.querySelector("#y2").textContent.replace(',', '.'); // t - время всего движения, с цифрами - время каждой фазы -let t = document.querySelector("#t").textContent.replace(',', '.'), - t1 = document.querySelector("#t1").textContent.replace(',', '.'), - t2 = document.querySelector("#t2").textContent.replace(',', '.'), - t3 = document.querySelector("#t3").textContent.replace(',', '.'); +let t1 = +document.querySelector("#t1").textContent.replace(',', '.'), + t2 = +document.querySelector("#t2").textContent.replace(',', '.'), + t3 = +document.querySelector("#t3").textContent.replace(',', '.'); // ускорение на каждой фазе -let a1 = document.querySelector("#a1").textContent.replace(',', '.'), - a2 = document.querySelector("#a2").textContent.replace(',', '.'), - a3 = document.querySelector("#a3").textContent.replace(',', '.'), - a4 = document.querySelector("#a4").textContent.replace(',', '.'); +let a1 = +document.querySelector("#a1").textContent.replace(',', '.'), + a2 = +document.querySelector("#a2").textContent.replace(',', '.'), + a3 = +document.querySelector("#a3").textContent.replace(',', '.'), + a4 = +document.querySelector("#a4").textContent.replace(',', '.'); const canvas = document.querySelector('.canvas'); ctx = canvas.getContext('2d'); @@ -30,6 +29,34 @@ canvas.height = 400; canvas.width = 600; const cm = 3 // Коэф увеличения + +const data = { + left: { + x0: 185, + y0: 250, + height: 15, + width: 15, + }, + mid: { + x0: 280, + y0: 183, + height: 15, + width: 15, + }, + right: { + x0: 380, + y0: 250, + height: 15, + width: 15, + }, + main: { + x0: 193, + y0: 250, + checkP1: 185, + checkP2: 387, + finish: 250, + } +}; // Table ctx.fillStyle = 'black'; ctx.fillRect(200, 200, 60 * cm, 10 * cm); @@ -56,6 +83,179 @@ function drawLine(x0, y0, checkP1, checkP2, finish) { ctx.closePath(); } -drawLine(193, 250, 195, 387, 250); +function getDir() { + // Узнаю, в какую сторону двигается система + if (y1 < -20 && x < 30) { + return 'left'; + } + if (y2 < -20 && x > 30) { + return 'right'; + } + if (x === 30) { + return 'mid'; + } +} + +function getPhase() { + if (a4) { + return 4; + } + if (a3 && t3) { + return 3; + } + if (!t1) { + return 0; + } +} + +function getSpeed() { + if(getPhase() === 4) { + return a4 * 2; + } + if(getPhase() === 3) { + const v3 = Math.floor((a3 * t3) * 3); + return v3; + } + if(getPhase() === 0) { + return 0; + } +} + +function moveRight() { + if (data.main.y0 > data.main.checkP1) { + ctx.clearRect(data.left.x0, data.main.y0, data.left.width, data.left.height); + ctx.clearRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + ctx.clearRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + + data.main.y0 -= 1; + data.left.y0 -= 1; + + // Движение центрального блока + if (data.mid.x0 >= data.main.checkP2) { + data.mid.y0 += 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.height, data.mid.width); + } else { + data.mid.x0 += 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + } + // Движение правого блока + data.right.y0 += 1; + ctx.fillRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + + ctx.fillRect(data.left.x0, data.main.y0, data.left.width, data.left.height); + } + // Центральная часть стола + if (data.main.y0 === data.main.checkP1 && data.main.x0 < data.main.checkP2) { + ctx.clearRect(data.left.x0, data.left.y0, data.left.height, data.left.width); + ctx.clearRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + ctx.clearRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + + if (data.left.y0 !== data.main.checkP1 - 5) { + data.left.y0 -= 5; // Костыль, чтобы нормально стиралась нить + } + + data.main.x0 += 1; + data.left.x0 += 1; + + // Движение центрального блока + if (data.mid.x0 >= data.main.checkP2 - 7) { + if(data.mid.x0 !== data.main.checkP2 - 7) { + data.mid.x0 -= 7; + } + data.mid.y0 += 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.height, data.mid.width); + } else { + data.mid.x0 += 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + } + + ctx.fillRect(data.left.x0, data.left.y0, data.left.height, data.left.width); + + data.right.y0 += 1; + ctx.fillRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + } + drawLine(data.main.x0, data.main.y0, data.main.checkP1, data.main.checkP2, data.right.y0); +} + +function moveLeft() { + if(data.main.finish > data.main.checkP1) { + ctx.clearRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + ctx.clearRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + ctx.clearRect(data.left.x0, data.left.y0, data.left.width, data.left.height); + + data.main.finish -= 1; + data.right.y0 -= 1; + + // Движение центрального блока + if(data.mid.x0 < data.main.x0) { + data.mid.y0 += 1 + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.height, data.mid.width) + } else { + data.mid.x0 -= 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + } + //Движение левого блока + data.left.y0 += 1; + ctx.fillRect(data.left.x0, data.left.y0, data.left.width, data.left.height); + + ctx.fillRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + } + // Центральная часть стола + if(data.main.finish === data.main.checkP1 && data.main.checkP2 > data.main.x0) { + ctx.clearRect(data.right.x0, data.right.y0, data.right.height, data.right.width); + ctx.clearRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + ctx.clearRect(data.left.x0, data.left.y0, data.left.width, data.left.height); + + if (data.right.y0 !== data.main.checkP1 - 5) { + data.right.y0 -= 5; // Костыль, чтобы нормально стиралась нить + } + + data.main.checkP2 -= 1; + data.right.x0 -= 1; + + // Движение центрального блока + if(data.mid.x0 <= data.main.x0) { + if (data.mid.x0 !== data.main.x0 - 7) { + data.mid.x0 -= 7; // Костыль, чтобы нормально стиралась нить + } + data.mid.y0 += 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.height, data.mid.width); + } else { + data.mid.x0 -= 1; + + ctx.fillRect(data.mid.x0, data.mid.y0, data.mid.width, data.mid.height); + } + + ctx.fillRect(data.right.x0, data.right.y0, data.right.height, data.right.width); + + data.left.y0 += 1; + ctx.fillRect(data.left.x0, data.left.y0, data.left.width, data.left.height); + + ctx.fillRect(data.right.x0, data.right.y0, data.right.width, data.right.height); + } + + drawLine(data.main.checkP2, data.main.finish, data.main.checkP1, data.main.x0, data.left.y0); +} + +function start() { + if (getDir() === 'right') { + moveRight(); + } else { + moveLeft(); + } +} -console.log(t1); \ No newline at end of file +if(getSpeed() === 0) { + start(); +} else { + setInterval(() => { + start() + }, getSpeed()); +} \ No newline at end of file