привет daiver... Предлагаю вместе подумать над зодачкой... ИМХО интересная задачка...
Я попробовал сделать и конкретно запарился... возникло много вопросов и нюансов... У меня логика получилось следующее: берутся координаты концов отрезков из файла; строятся отрезки; строится окружность; в первую очередь я решил, что нужно определять для каждого отрезка - пересекает ли он окружность... попробовал реализовать следующим образом: рассматривается треугольник между центром окружности и координатами концов отрезка; в этом "придуманном" треугольнике рассматривается высота, проведённая из центра окружности; если она меньше радиуса окружности, то соответственно отрезок пересекает окружность; высота треугольника в данном случае находится так: по координатам вершин треугольника рассчитываются длины его сторон; находим площадь треугольника по формуле Герона: sqrt(p*(p-a)*(p-b)*(p-c)) , где p=(a+b+c)/2; также площадь треугольника равна (a*Ha)/2 => Ha=(2*S)/a , где Ha - высота...
вроде бы всё просто: зная эту высоту, если она меньше радиуса, то ясно, что отрезок пересекает окружность => можно найти стрелу сегмента (r-Ha) => можно найти площадь сегмента => можно найти площадь окружности-площадь сегмента...
НО!!! Пипец косяков: во-первых данный алгоритм распознаёт отрезок, направленный на окружность, как отрезок пересекающий её, т.к. строит треугольник и находит в нём высоту, которая соответственно меньше радиуса... Как сделать так, чтобы он распознавал отрезок, который ИМЕННО ПЕРЕСЕКАЕТ окружность в двух точках??? Я тут думал - может проверку, чтобы стороны трегуольника, прилегающие к центру окружности были обе больше или равны радиусу? Это будет гарантировать, что внутри окружности нет концов отрезка... Дальше я думал сделать проверку, чтобы сторона, противоположная вершине с центром окружности была наибольшей длины (в этом случае похоже будет находится нужная "высота")... но нифига... даже при соблюдении этих условий можно запросто построить отрезок который отсечёт часть окружности, но при этом высота будет рассчитана неправильно...
Даже если додумать этот вариант, то слишком много вопросов остаётся... Он будет работать с одной окружностью и с одним отрезком. А если два отрезка пересекают окружность и внутри неё пересекаются друг с другом??? Тогда вообще не всё так просто... А если таких отрезков 10 ?
Есть ещё идея решить эту задачку дебильным методом "в лоб": построить всё а затем запустить рекурсивную процедуру, которая будет закрашивать точки на экране каким нибудь одним цветом и при этом считать количество закрашенных точек и запустить эту рекурсию из центра окружности, соответственно указав в качестве границ закраски цвет окружности и линий и цвет, которым закрашивает сама рекурсия... Метод конечно немного идиотский, как мне кажется, но зато наверняка )))))))
По ходу здеся должно быть чисто математическое решение, но у меня пока москов ни хфатает (((
|