История изменений
Исправление Manhunt, (текущая версия) :
Алгоритм по ссылке какой-то очень сложный.
Я бы развернул систему координат так, чтобы отрезок AB лёг строго на ось OX.
При этом проекция D точки T будет получаться просто отбрасыванием координаты y.
Поворот на угол L выполняется по формулам
x_new = x_old * cos(L) - y_old * sin(L)
y_new = x_old * sin(L) + y_old * cos(L)
В наших целях принимаем cos(L)=AB.x, sin(L)=-AB.y. Это не-отнормированные значения синуса и косинуса, ну да и хрен бы с ними. Важно только то, что:
x_new = x_old * AB.x + y_old * AB.y
Код не компилировал и не запускал, выкладки все чисто умозрительные. Подвержено signed overflow.
short Grad(const Point &a, const Point &b, const Point &t)
{
int64 ab_x = b.x - a.x;
int64 ab_y = b.y - a.y;
int64 new_ab_x = ab_x * ab_x + ab_y * ab_y;
int64 new_at_x = (t.x - a.x) * ab_x + (t.y - a.y) * ab_y;
if(new_at_x <= 0) return 0;
if(new_at_x >= new_ab_x) return 255;
return 255 * new_at_x / new_ab_x;
}
Исходная версия Manhunt, :
Алгоритм по ссылке какой-то очень сложный.
Я бы развернул систему координат так, чтобы отрезок AB лёг строго на ось OX.
При этом проекция D точки T будет получаться просто отбрасыванием координаты y.
Поворот на угол L выполняется по формулам
x_new = x_old * cos(L) - y_old * sin(L)
y_new = x_old * sin(L) + y_old * cos(L)
В наших целях принимаем cos(L)=AB.x, sin(L)=-AB.y. Это денормализованные значения синуса и косинуса, ну да и хрен бы с ними. Важно только то, что:
x_new = x_old * AB.x + y_old * AB.y
Код не компилировал и не запускал, выкладки все чисто умозрительные. Подвержено signed overflow.
short Grad(const Point &a, const Point &b, const Point &t)
{
int64 ab_x = b.x - a.x;
int64 ab_y = b.y - a.y;
int64 new_ab_x = ab_x * ab_x + ab_y * ab_y;
int64 new_at_x = (t.x - a.x) * ab_x + (t.y - a.y) * ab_y;
if(new_at_x <= 0) return 0;
if(new_at_x >= new_ab_x) return 255;
return 255 * new_at_x / new_ab_x;
}