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