Стыдно признаться, но никак не могу найти подходящего решения задачи. Надо пойти поспать, но так обидно, что не заснуть Есть координаты верхнего левого и нижнего правого углов прямоугольника. Даны также точка на плоскости и угол наклона прямой проходящей через эту точку. Надо найти точки пересечения этой прямой и сторон прямоугольника. Проблема в том, что я не вижу как решить задачу в целых числах (изначально она из 2d графики и вообще-то целочисленная). Если же решать с плавающей точкой то возникают серьёзные проблемы с округлением когда синус или косинус данного угла близок к нулю. Есть ещё второстепенная проблема, мне не нравится идиотское количество if'ов. Я делаю так: Код (Text): struct vector { int x, y; }; int intersect (float a, // угол наклона прямой struct vector center, // точка на ней struct vector v0, // верхний левый угол прямоугольника struct vector v1, // нижний правый struct vector *r1, // сюда складывать результаты struct vector *r2) { float ca = cos (a), sa = sin (a); /* уравнение прямой заданной точкой center и углом a выглядит так: * (y - center.y) / sa = (x - center.x) / ca * Мы будем разглядывать разницу между правой и левой частями, * поэтому: */ float f (float x, float y) { return (y - center.y) * ca - (x - center.x) * sa; } /* f(x,y) -- это функция плоскости, которая пересекается с Oxy по нашей * прямой (center, a), то есть делит Oxy на две полуплоскости. Причём в * одной из этих полуплоскостей f(x,y) > 0, в другой f(x,y) < 0 */ float f00, f10, f01, f11; f00 = f (v0.x, v0.y); if (f00 > 0) { /* для удобства выберем такое у-е плоскости, чтобы * f(v0) < 0 */ ca = -ca; sa = -sa; f00 = f (slt.x, slt.y); } f10 = f (v1.x, v1.y); f01 = f (v0.x, v1.y); f11 = f (v1.x, v1.y); /* Ну а дальше эти убогие ветвления. Я выкинул весь функциональный код, * оставил лишь в комментариях системы уравнений которые позволяют * найти координаты точек пересечения. Основной вопрос в том и состоит, * как бы это так сосчитать-то пересечение двух прямых без существенных * погрешностей */ if (f01 > 0) { // r1->x = v0.x && f (r1) == 0 if (f10 > 0) { // r2->y = v0.y && f (r2) == 0 } else if (f11 > 0) { // r2->x = v1.x && f (r2) == 0 } else { // r2->y = v1.y && f (r2) == 0 } } else if (f10 > 0) { // r1->y = v0.y && f (r1) == 0 if (f11 < 0) { // r2->x = v1.x && f (r2) == 0 } else { // r2->y = v1.y && f (r2) == 0 } } else if (f11 > 0) { // r1->x = v1.x && f (r1) == 0 // r2->y = v1.y && f (r2) == 0 } else return 2; } Any ideas?