Гуру тригонометрии, отзовитесь

Статус
В этой теме нельзя размещать новые ответы.

Sainthozier

Стрелочник
623
11
369
Я очень люблю математику. Но, увы, так сложилось, что во время обучения в школе и универе - преподаватели были, мягко говоря, такими себе. За каждый косяк орали, ругали, ставили постоянно двойки всем. Короче, вся эта конченная система, базирующаяся на оценочном суждении чсвшных неадекватных математиков, напрочь отбила у меня тягу к знаниям.
Правда в универе был один физик-математик, очень хороший человек. Никогда не ставил плохие баллы, даже если чуваки не знали, он им доходчиво объяснял и ставил минимум четвёрку. Так вот, мы с ним как-то разбирали математическую сторону алгоритма RSA и местами мне было сложно, и даже стыдно за то, что я не знал некоторых, как оказалось, базовых вещей. Но он всё равно мне всё хорошо и доходчиво объяснил. Именно благодаря ему я вновь захотел апнуть свои скиллзы в математике. Во-первых, мне это интересно, ну, и во-вторых, мне кажется, что это и полезно.
Накидал себе пару задачек. С некоторыми справился, а вот с одной проблемы возникли.
Короче, есть некая область, скажем так, 1000х600. В её центре находится точка. Данная точка одновременно является центром вращающегося квадрата по часовой стрелке.

01frXV7LcZc.jpg


Итак, что имеется:
1) координата верхнего левого угла квадрата на момент первоначальной отрисовки, т.е., когда его верхняя сторона находится в горизонтальной плоскости(на скрине это Х(450,250));
2) длина стороны квадрата(100);
3) координата центральной точки(на скрине это точка С(500, 300));
4) количество градусов, на которое поворачивается квадрат каждый кадр(в данном случае за 1 кадр квадрат поворачивается на 1 градус).

Что хочу знать - возможно ли динамически узнать координату любого угла квадрата, имея на руках вышеупомянутый перечень данных? Под "динамически" я подразумеваю получение координат во время вращения квадрата. Например, квадрат повернулся на n градусов, какими будут координаты точки Х?
Пока интересует лишь теория. Если возможно узнать - в какую сторону копать и что почитать, если же нет - то какими данными ещё нужно обладать, чтобы получить необходимое.
Если что, к майну это не относится. Практические тесты делаю на js и рисую соответственно на канвасе. Так лучше усваиваются полученные знания.

P.S. Заранее прошу простить за корявое объяснение, в математических формулировках и терминах я ещё слаб и только начинаю всё узнавать.
 
Полярная система координат тебе поможет. За ее центр берешь центр твоего квадрата(точку 500,300), каждую координату вершины квадрата переводишь из декартовой системы координат в эту полярную. Добавляешь к получившимуся полярному углу нужное кол-во градусов, конвертируешь из полярной системы в обучную.

На java выглядит так
Java:
private static Vec2f rotatePoint(Vec2f center, Vec2f point, float angle) {
    float dx = point.x() - center.x();
    float dy = point.y() - center.y();

    float ro = center.distanceTo(point);
    float phi = (float) atan2(dy, dx);//угол между центром и точкой

    phi += PI/180 * angle;//прибавляем
    float newX = (float) (ro * cos(phi));//обратно в декартовые
    float newY = (float) (ro * sin(phi));//обратно в декартовые

    return new Vec2f(center.x() + newX, center.y() + newY);
}
 

Sainthozier

Стрелочник
623
11
369
Спасибо большое, обязательно ещё поищу инфу по этой теме.
 
7,099
324
1,509
Формул сходу не напишу, но могу предложить визуальное объяснение решения:
1561051052407.png
 
2,505
81
397
Если это именно квадрат, то можно найти радиус описанной окружности (половина диагонали). Ну а затем зная гипотенузу (радиус) и угол, находишь оба катета и прибавляешь их к центру.
 
7,099
324
1,509
Так у него катет уже известен - это расстояние между точками из входных данных
 

Sainthozier

Стрелочник
623
11
369
Хм, вроде разобрался уже. Спасибо всем за наводки, ребят, очень помогли понять, особенно @Authentication failure.
Так же помог этот плейлист, много примеров и объяснений. Это так, если кто-то тоже заинтересуется подобным )

Можешь закрывать темку, @Agravaine
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху