среда, 23 марта 2016 г.

Как крутить шарикоподшипник. Ч.1 - квадратный шарик на плоскости*.

* аллюзия на "сферический конь в вакууме"

После того как легко и просто удалось мне закрутить шарик, раззадорился я замахнуться на планетарный механизм. Признаюсь, раззадорили меня задорные комментарии Всеволода Леонова. Спасибо ему большое! :)

Картинка из Википедии

А что тут сложного? То, что количество деталей больше - не принципиально на самом деле. А вот что действительно требует иного подхода - это размещение шариков по нужным местам. Когда был один шарик - я его просто прижал к краю с помощью Align = Left, а теперь нужно уже что-то более универсальное.

Очевидно, что для размещения одинаковых шариков по окружности достаточно их копировать с поворотам относительно общего центра. Поворот у нас есть - RotationAngle. А рядом с ним находится и то свойство, которое отвечает за центр вращения - RotationCenter. Надо только помнить, что координаты RotationCenter измеряются в "корпусах" поворачиваемого объекта и отcчёт идёт от левого верхнего угла объекта.  Вот и всё!

Давайте потренируемся, проверим как это всё работает. Создадим снова пустое мультиплатформенное приложение и, поскольку повороты на кружках можно и не заметить, добавим на форму два квадратика TRectangle



По умолчанию размер фигур 50х50. Чтобы не думать об их расположении, отметим оба квадратика с шифтом, и зададим им Align = Center.


Теперь, когда второй квадратик расположен точно над первым, выделим Rectangle2 в Structure и повернём немного, градусов на 15 - RotationAngle = 15.


А вот теперь вынесем центр вращения из середины фигуры далеко в сторону, поставив RotationCenter.Y = 5 вместо 0,5.


Получается, что центр вращения Rectangle2 теперь по X всё ещё посередине фигуры, а по Y - на 5 его корпусов ниже верхней грани (или на 4 от нижней). Как в этом убедиться? Давайте построим отрезки нужной длины, которые проходят из середины верхних граней квадратов вниз. По идее нижние концы отрезков из обоих фигур должны совпасть в центре вращения.

Бросаем на форму фигуру TLine, совмещаем с квадратиком Align = Center, и разворачиваем её из диагонального положения в вертикальное  RotationAngle = 45.


Искомая длина линии нам известна - пять корпусов квадрата, т.е. 50*5. Нам неизвестны соответствующие ей размеры компонента - Height и Width. На выручку приходит теорема Пифагора и калькулятор: <длина стороны квадрата> = √[(<длина диагонали>)² / 2], т.е. надо извлечь корень из половины квадрата числа 250. Я, округлив до целого, получил 177.

Установив у Line1 Size.Height = 177 и Width = 177, убираем центрирование Align = None и клавишами Ctrl + СтрелкаВниз опускаем линию так, чтобы её верхний конец совпадал с верхней линией квадрата. Конечно, можно было бы и вычислить координаты, но зачем снова голову (или кнопки калькулятора) ломать, когда есть такое замечательное средство визуального "программирования"?


Скопировав линию и выставив новому экземпляру RotattionAngle = 60 (45 + 15) также стрелками перемещаем её до получения искомой композиции.


Очевидно, что мы не ошиблись в расчётах и наши ожидания вполне оправдались. Теперь можно уже браться и за более сложное изделие.

Но погодите, вам ничего не напоминает эта картинка? По-моему, это очень похоже на часовой циферблат! Я просто не могу пройти мимо такой замечательной идеи. Поэтому в следующем посте я сделаю часики, а уж потом обязательно приступлю и к подшипнику.

Продолжение следует...

Обновление: Увлёкшись вращениями, я совершенно выпустил из виду  свойство линии LineType: ( Diagonal, Top, Left ). Заменив установленное по умолчанию значение Diagonal, можно совершенно забыть как о древнем математике Пифагоре, так и о современном калькуляторе. Всё уже сделано за нас!