У меня есть гифка работы кулачкового механизма:
Эта иллюстрация показывает, что при равномерном вращении вала с насаженным на него кулачком, толкатель получает неравномерные возвратно-поступательные движения толкателя, который скользит по поверхности кулачка.
Я воспроизвел основные контуры этого механизма.
Вот мой код статичного механизма:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="xMinYMin meet" id="svg4" width="390" height="700" viewBox="0 0 390 700">
<!-- Верхняя скоба -->
<g stroke="#717171" stroke-width="2" fill="none" >
<path d="M149 124h87v31h-87z" />
<path d="M175 124v31" />
<path d="M210 124v31" />
<path d="M161 134c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z"/>
<path d="M221 134c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z" />
</g>
<!-- Нижняя скоба -->
<g stroke="#717171" stroke-width="2" fill="none" >
<path id="circ910" d="M221 278c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z"/>
<path id="circ912" d="M161 278c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z"/>
<path d="M149 267h87v31h-87z" />
<path d="M175 267v31" id="path916" />
<path d="M210 267v31" id="path918" />
</g>
<!-- Кулачок -->
<g ig="gr1" stroke-width="2" >
<path id="cam" fill="#8080B1" stroke="black" fill-opacity="0.5" d="M83 493c1-7 19-23 32-30 10-6 34-10 34-10 6-5 35-42 59-48 21-5 60-15 65-10 11 15 21 57 10 93-4 12-10 27-18 39-5 8-14 14-20 22l-5 9s-4 12-4 19c0 20-9 36-20 49-10 12-32 26-39 24-6-1-21-18-28-30-13-21-22-38-24-69 0-4-19-14-26-23-7-10-17-27-16-35z" />
<circle id="path866" cx="192" cy="514.6" r="36" fill="#5F5F5F" stroke="black" stroke-width="2" />
<circle id="spindle" cx="192" cy="514.6" r="20" fill="#4A4A4A" stroke="black" stroke-width="2" />
<!-- Шпонка -->
<path id="key" fill="#151515" stroke="black" d="M189 491h6v10h-6v-10h6" />
</g>
<!-- Толкатель -->
<path id="kernel" d="M184 60v340l8 14 7-14V59z" fill="none" stroke="red" stroke-width="2" >
</path>
<circle id="path868" cx="192" cy="514.4" r="144.7" opacity=".5" fill="none" fill-opacity="1" stroke="#1515B1" stroke-width="2" />
</svg>
Попробовал сделать анимацию кулачкового механизма:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="xMinYMin meet" id="svg4" width="390" height="700" viewBox="0 0 390 700">
<!-- Верхняя скоба -->
<g stroke="#717171" stroke-width="2" fill="none" >
<path d="M149 124h87v31h-87z" />
<path d="M175 124v31" />
<path d="M210 124v31" />
<path d="M161 134c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z"/>
<path d="M221 134c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z" />
</g>
<!-- Нижняя скоба -->
<g stroke="#717171" stroke-width="2" fill="none" >
<path id="circ910" d="M221 278c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z"/>
<path id="circ912" d="M161 278c3 0 6 3 6 6s-3 6-6 6c-2 0-5-4-5-6 0-3 3-6 5-6z"/>
<path d="M149 267h87v31h-87z" />
<path d="M175 267v31" id="path916" />
<path d="M210 267v31" id="path918" />
</g>
<g ig="gr1" stroke-width="2" >
<!-- Кулачок -->
<path id="cam" fill="#8080B1" stroke="black" fill-opacity="0.5" d="M83 493c1-7 19-23 32-30 10-6 34-10 34-10 6-5 35-42 59-48 21-5 60-15 65-10 11 15 21 57 10 93-4 12-10 27-18 39-5 8-14 14-20 22l-5 9s-4 12-4 19c0 20-9 36-20 49-10 12-32 26-39 24-6-1-21-18-28-30-13-21-22-38-24-69 0-4-19-14-26-23-7-10-17-27-16-35z" />
<!-- Вал -->
<circle id="path866" cx="192" cy="514.6" r="36" fill="#5F5F5F" stroke="black" stroke-width="2" />
<circle id="spindle" cx="192" cy="514.6" r="20" fill="#4A4A4A" stroke="black" stroke-width="2" />
<path id="key" fill="#151515" stroke="black" d="M189 491h6v10h-6v-10h6" />
<!-- Анимация вращения вала с кулачком -->
<animateTransform attributeName="transform" type="rotate" begin="0s" dur="2s" values="0 192 514.6;360 192 514.6" repeatCount="indefinite" />
</g>
<!-- Толкатель -->
<path id="kernel" d="M184 60v340l8 14 7-14V59z" fill="none" stroke="red" stroke-width="2" >
<!-- Анимация перемещения толкателя -->
<animateTransform attributeName="transform" type="translate" begin="0s" dur="2s" calcMode="linear"
values="0 0;0 30;0 0" repeatCount="indefinite" />
</path>
<circle id="path868" cx="192" cy="514.4" r="144.7" fill="none" fill-opacity="1" stroke="#1515B1" stroke-width="2" />
</svg>
Из работы программы видно, что хоть время начала анимаций и их продолжительность совпадает, но не получается добиться согласованной работы вращения кулачка и возвратно-поступательного движения толкателя.
Как согласовать анимацию вращения кулачка и неравномерное движение толкателя, которое зависит от профиля поверхности кулачка.


angle = angle%360 + 2;И ещё просьба, для ,большего реализма- дать по возможности, второй вариант программы, где нет необходимости перерисовывать path, чтобы поместить элементы в нулевые координаты поyМожет я что-то не так понял? Но ведь чем-то была вызвана необходимость изначальной перерисовки path – Alexandr_TT Nov 10 '21 at 07:55angle%360- остаток от деления предыдущего значенияangleна 360. Таким образом, при значениях меньше360ничего не меняется, при360 => 0, при362 => 2(362 не случится) и так далее.+2- реальное изменение на 2 градуса за кадр. Все вместе создает бесконечный ряд:0, 2, 4, ..., 356, 358, 0, 2.... Это стандартный способ создать "замкнутый круг" значений для циклическиx анимаций, например. – Leonid Nov 10 '21 at 12:46