Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 50

Организовать движение маятника

11.12.2012, 23:27. Показов 4375. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть картинка
нужно организовать движение маятника
как поворачивать картинку относительно верхней середины картинки
или как поворачивать картинку , чтобы хотя бы одна точка была неподвижна
заранее благодарен)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2012, 23:27
Ответы с готовыми решениями:

Скрипт маятника
Задача вероятно простая, но я не могу ее решить... Я лазил по интернету и нашел много интересного, но в итоге что-то не работает, а...

движение маятника
var Form1: TForm1; n:real; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var R: integer; ...

Движение математического маятника
Всем привет. Нужно срочно написать программу движения математического маятника на C#. Отклонение примерно сделать градусов в 45. Вот то...

6
 Аватар для JsLoveR
425 / 167 / 48
Регистрация: 05.12.2012
Сообщений: 855
12.12.2012, 23:47
Michanya, для примера:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function getId(id){return document.getElementById(id)}
 
var canvas = null, ctx = null, img = null, count = 0, v = 1, currAngle = 0, f = false ;
var angleMin = 45;
var angleMax = 135;
 
function drawStatic() {
    canvas = getId("pendulum");
    ctx = canvas.getContext("2d");
    img = new Image(); 
    img.src = 'https://www.cyberforum.ru/images/cyberforum_logo.jpg';
    ctx.drawImage(img, canvas.width/2, canvas.height/2);
}
 
function movePendulum() {
    setInterval(function () {
        setTransform(ctx, img);
    }, 80);
} 
 
function setTransform(ctx, img) {
    currAngle = angleMin + (angleMax - angleMin)*(count / 10);
    if (currAngle < angleMin ){
        v = 1;
    }
 
    if (currAngle > angleMax){
        v = -1;
    }
    count += 1 * v;
    ctx.clearRect (0, 0, canvas.width, canvas.height);
    ctx.save();
    ctx.translate(canvas.width/2, canvas.height/2);
    ctx.rotate(-currAngle * Math.PI/180);
    ctx.drawImage(img, -img.width, -img.height/2);
    ctx.restore ();
}
 
window.onload = function() {
    drawStatic();
    movePendulum();
}
 
</script>
</head>
 
<body>
<canvas id="pendulum" width="500" height="500"></canvas>
</body>
</html>
1
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 50
13.12.2012, 22:54  [ТС]
JsLoveR, а не могли бы рассказать почему такая формула?
JavaScript
1
currAngle = angleMin + (angleMax - angleMin)*(count / 10);
0
 Аватар для JsLoveR
425 / 167 / 48
Регистрация: 05.12.2012
Сообщений: 855
14.12.2012, 08:44
Michanya, это начальное положение маятника + импульс движения маятника(некоторое приращение, попросту скорость) равносильно этому currAngle = angleMin + count * 9. Ничего хитрого)
0
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 50
17.12.2012, 14:14  [ТС]
JsLoveR, а как придать физику, то есть чтобы он не равномерно поворачивался....а с ускорением?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
17.12.2012, 14:17
это вы напишите физическую формулу функции зависимости угла от времени
а товарищ программист вам её прикрутит
0
 Аватар для JsLoveR
425 / 167 / 48
Регистрация: 05.12.2012
Сообщений: 855
18.12.2012, 18:21
Michanya, вот, держи, небольшой примитивный скриптик, есть небольшие огрехи с погашением колебания, доделаешь сам, так как я пока не дома, приду - может исправлю:
CSS
1
2
3
4
*{ padding:0; margin:0}
canvas{ margin:5px; border:1px solid #999999; float:left;}
.mTop{ margin-top:5px;}
.infoDiv{float:left; margin-left:10px;}
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function getId(id){return document.getElementById(id)}
 
var canvas = null, ctx = null, pendulum = null;
var x0 = 0, y0 = 0, x=0,y=0, len = 200, A = 0, dt = 0.02, time = 0, Tperiod = 2 * Math.PI / Math.sqrt(len/9.8), dclrt = 0, timer = null, run = false;
 
function getData(button){
    run = !run;
    if(run){
        A = parseInt(getId("A").value);
        dt = parseFloat(getId("speed").value);
        len = parseInt(getId("length").value);
        dclrt = 0;
        
        if(getId("decelerate").checked){
            dclrt = 1;
        }
        
        if(isFinite(A) && isFinite(dt)  && isFinite(len)){
            if(len > 500) {
                alert("Длина нити не должна превышать 500");
                len = 500;
                getId("length").value = len;
                run = false;
            }
            
            if(len < 30){
                alert("Длина нити слишком мала! Минимум - 30");
                len = 30;
                getId("length").value = len;
                run = false;
            }
            
            if(A > len) {
                alert("Амплитуда не может быть больше нити!");
                A = len;
                getId("A").value = A;
                run = false;
            }
            
            if(A <= 0) {
                alert("Амплитуда не может быть меньше 1!");
                A = 1;
                getId("A").value = A;
                run = false;
            }
            
            if(dt > 0.2) {
                alert("Шаг во времени слишком большой! Максимум - 0.2");
                dt = Math.random() * 0.2;
                getId("speed").value = dt.toFixed(4);
                run = false;
            }
            
            if(run) {
                movePendulum();
                button.value = "Остановить";
                
            }
        }
        else {
            alert("Введите число!");
            run = false;
        }
    }
    else {
        button.value = "Запустить";
        
    }
}
 
function drawElements() {
    canvas = getId("pendulum");
    ctx = canvas.getContext("2d");
    x0 = canvas.width/2;
    y0 = canvas.height/2;
    line(x0, y0-len, x0, y0, "#555");   
    pendulum = new createPendulum(x0, y0, 10);
    pendulum.draw();
}
 
function createPendulum(x, y, R){
    this.x = x;
    this.y = y;
    this.R = R;
    
    this.draw = function(color){
        var grad = ctx.createRadialGradient(this.x, this.y, this.R, this.x - 2, this.y-4, 2);
        grad.addColorStop(0, '#333'); 
        grad.addColorStop(1, '#999');
         
        ctx.fillStyle = grad;
        ctx.beginPath();
        ctx.arc(this.x , this.y , this.R, 0, Math.PI * 2, true);
        ctx.fill();
    }
}
 
function movePendulum() {
    timer = setInterval(function () {
        impulsePendulum();
    }, 80);
} 
 
function impulsePendulum() {
    
    ctx.clearRect (0, 0, canvas.width, canvas.height);
    time = time + dt;
    x = A * Math.sin(time/Tperiod * 2* Math.PI) * Math.pow(2.71, -0.1 * time * dclrt);
    y = Math.sqrt(len*len - x*x) - len;
    line(x0, y0 - len, x + x0, y + y0, "#555"); 
    pendulum.x = x + x0;
    pendulum.y = y + y0;
    pendulum.draw();
}
 
function line(x0, y0, x, y, color){
    ctx.beginPath();
    ctx.strokeStyle = color;
    ctx.moveTo(x0,y0);
    ctx.lineTo(x,y);
    ctx.closePath();
    ctx.stroke();
}
 
window.onload = function() {
    drawElements();
}
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<canvas id="pendulum" width="500" height="500"></canvas>
<div class="infoDiv">
    <p>Амплитуда: </p>
    <input type="text" id="A" size="9" value="80" />
    <p class="mTop">Скорость: </p>
    <input type="text" id="speed" size="9" value="0.03" />
    <p class="mTop">Длина нити: </p>
    <input type="text" id="length" size="9" value="200" />
    <p class="mTop"><label><input type="checkbox" id="decelerate" /> Использовать погашение колебания</label></p>
    <br/>
    <p class="mTop"><input type="button" value="Запустить" onclick="clearInterval(timer); getData(this); " /></p>
</div>
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2012, 18:21
Помогаю со студенческими работами здесь

Движение маятника в Borland 3.1
Написать программу имитирующую движение(без затухания) маятника. Помогите пожалуйста,не могу разобраться.

Движение маятника с затухающими колебаниями
Помогите сделать лабораторную! Как реализовать колебания нити маятника с затуханием движения #define WIN32_LEAN_AND_MEAN #include...

Как показать движение маятника?
как в пикчер боксе или в другом элементе показать движение маятника??? тоесть после запкска программы будет показан &quot;висячий&quot;...

Движение математического маятника в отклонении
Написать анимационную программу 1)движение колокольчика 2)движение математического маятника в отклонении Добавлено через 1 час 25...

Организовать движение звезд
Составить программы для предложенных заданий с использованием модулей, отладить их и сохранить. 1. Разбить программу на части. 2....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru