LINUX.ORG.RU

История изменений

Исправление Manhunt, (текущая версия) :

1. Любые два действительных числа S и C, если только S*S+C*C==1, являются соответственно синусом и косинусом какого-то угла L. Это факт из тригонометрии. Если хочется его прочувствовать и осознать, то это куда-то в учебники/задачники по тригонометрии.

2. Я очень небрежно написал «cos(L)=AB.x, sin(L)=-AB.y». Если писать аккуратно, то нужно сперва ввести нормирующий множитель N=1/sqrt(AB.x*AB.x+AB.y*AB.y), и затем С=AB.x*N, S=-AB.y*N. Теперь можно взять и расписать на бумажке, чему равно S*S+C*C: получится единица. То есть это правильные синус и косинус из пункта 1. Дальше можно протащить нормирующий множитель N через все наши выкладки, и увидеть, что в конце концов он всё равно сокращается. Ну и отдельно нужно рассмотреть, что с нашим кодом происходит в случае AB.x*AB.x+AB.y*AB.y==0, когда значение N не определено и, формально, никаких синусов и косинусов не получается.

3. Нам нужно, чтобы отрезок AB лёг строго на ось OX. Подставляем наши S и C в формулу для поворота AB, и сморим, какие у AB будут новые координаты:

x_new =   AB.x * AB.x*N + AB.y * AB.y*N
y_new = - AB.x * AB.y*N + AB.y * AB.x*N

Видно, что y_new == 0. То есть после поворота отрезок AB лежит на оси OX. Значит, такой выбор S и C нас вполне устроит.

Исходная версия Manhunt, :

1. Любые два действительных числа S и C, если только S*S+C*C==1, являются соответственно синусом и косинусом какого-то угла L. Это факт из тригонометрии. Если хочется его прочувствовать и осознать, то это куда-то в учебники/задачники по тригонометрии.

2. Я очень небрежно написал «cos(L)=AB.x, sin(L)=-AB.y». Если писать аккуратно, то нужно сперва ввести нормирующий множитель N=1/sqrt(AB.x*AB.x+AB.y*AB.y), и затем С=AB.x*N, S=-AB.y*N. Теперь можно взять и расписать на бумажке, чему равно S*S+C*C: получится единица. То есть это правильные синус и косинус из пункта 1. Дальше можно протащить нормирующий множитель N через все наши выкладки, и увидеть, что в конце концов он всё равно сокращается. Ну и отдельно нужно рассмотреть, что с нашим кодом происходит в случае AB.x*AB.x+AB.y*AB.y==0, когда значение N не определено и, формально, никаких синусов и косинусов не получается.

3. Нам нужно, чтобы отрезок AB лёг строго на ось OX. Подставляем наши S и C в формулу для поворота AB, и сморим, какие у AB будут новые координаты:

x_new =   AB.x * AB.x*N + AB.y * AB.y*N
y_new = - AB.x * AB.y*N + AB.y * AB.x*N

Видно, что y_new = 0. То есть AB лежит на OX. Значит, такой выбор S и C нас вполне устроит.