Существует только два случая, когда круг пересекается с прямоугольником:
Примечание, что это не требует, чтобы прямоугольник был параллелен оси.
(Один способ видеть это: если ни один из краев не имеет точку в кругу (если все края полностью "вне" круга), то единственный способ, которым круг может все еще пересечь полигон, состоит в том, если это находится полностью в полигоне.)
С тем пониманием, что-то как следующее будет работать, где круг имеет центр P
и радиус R
, и прямоугольник имеет вершины A
, B
, C
, D
в том порядке (не полный код):
def intersect(Circle(P, R), Rectangle(A, B, C, D)):
S = Circle(P, R)
return (pointInRectangle(P, Rectangle(A, B, C, D)) or
intersectCircle(S, (A, B)) or
intersectCircle(S, (B, C)) or
intersectCircle(S, (C, D)) or
intersectCircle(S, (D, A)))
, Если Вы пишете какую-либо геометрию, у Вас, вероятно, уже есть вышеупомянутые функции в Вашей библиотеке. Иначе, pointInRectangle()
может быть реализован несколькими способами; любой генерал точка в полигоне методы будут работать, но для прямоугольника можно просто проверить, работает ли это:
0 ≤ AP·AB ≤ AB·AB and 0 ≤ AP·AD ≤ AD·AD
И intersectCircle()
легко реализовать также: один путь состоял бы в том, чтобы проверить, достаточно ли нога перпендикуляра от [1 110] до строки близка и между конечными точками, и проверьте конечные точки иначе.
прохладная вещь состоит в том, что тот же работы идеи не только для прямоугольников, но и для пересечения круга с любым простой полигон — не должен даже быть выпуклым!
Это можно сделать с помощью команды \ sectionrule
в пакете sectsty .
Вы можете взглянуть на команду LaTeX \ rule
:
\rule[raise-height]{width}{thickness}
Однако это встроенная (горизонтальная) команда, поэтому вам придется использовать некоторые хитрости чтобы получить его в правильном положении и размере ( \ noindent
и \ textwidth
должны немного помочь)
В противном случае вы можете использовать следующий простой TeX
\smallskip
\hrule height 2pt
\smallskip
Он не не вписывается в синтаксис LaTeX, но работает как шарм и гарантированно охватывает всю ширину текста.
Переписывание вашей команды таким образом должно помочь :
\newcommand{\tmpsection}[1]{}
\let\tmpsection=\section
\renewcommand{\section}[1]{\tmpsection{\underline{#1}}}
Результатом будет
\section { \underline {#1} }
, который, в свою очередь, создаст подчеркнутые заголовки разделов:)