Вычислите область пересечения между кругом и треугольником?

Хорошо, что вы работаете с изоляцией пространства имен.

  1. Разверните сетевую политику нового типа в ns1 с помощью ingress all. Вы можете просмотреть документацию, чтобы определить политику сетевого входа, чтобы разрешить весь входящий трафик

  2. Аналогично для ns2, вы можете создать новый вид сетевой политики и развернуть конфигурацию в ns2, чтобы запретить весь вход Снова придут на помощь доктора, которые помогут вам с конструкцией yaml.

Это может выглядеть примерно так:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
 namespace: ns1
 name: web-allow-all-namespaces
spec:
 podSelector:
  matchLabels:
   app: app_name_ns1
 ingress:
 - from:
  - namespaceSelector: {}
18
задан VividD 6 January 2014 в 12:36
поделиться

10 ответов

Если Вы хотите точное решение (или по крайней мере столь точный, как можно получить использующую арифметику с плавающей точкой), затем, это собирается включить большую работу, требующую беготни, потому что существует столько случаев для рассмотрения.

я считаю девять различных случаев (категоризированный в числе ниже количеством вершин треугольника в кругу и количеством краев треугольника, которые пересекаются или содержатся в кругу):

Nine cases for intersection: 1, 2. no vertices, no edges; 3. no vertices, one edge; 4. no vertices, two edges; 5. no vertices, three edges; 6. one vertex, two edges; 7. one vertex, three edges; 8. two vertices, three edges; 9. three vertices, three edges.

(Однако этот вид перечисления геометрических случаев известен быть хитрым, и меня вообще не удивило бы, если бы я отсутствовал один или два!)

, Таким образом, подход:

  1. Определяют для каждой вершины треугольника, если это в кругу. Я собираюсь предположить, что Вы знаете, как сделать это.

  2. Определяют для каждого края треугольника, если он пересекает круг. (Я описал один метод здесь , или см. любую вычислительную книгу по геометрии.) необходимо будет вычислить точку пересечения, или точки пересечения (если таковые имеются) для использования на шаге 4.

  3. Определяют, какой из этих девяти случаев Вы имеете.

  4. Вычисляют область пересечения. Случаи 1, 2, и 9 легки. В оставлении шестью случаями я провел пунктирные линии, чтобы показать, как разделить область пересечения в треугольники и круговые сегменты на основе исходных вершин треугольника, и на точках пересечения Вы вычислили на шаге 2.

, Этот алгоритм будет довольно тонким и подверженным ошибкам, которые влияют на только один из случаев, поэтому удостоверьтесь, что у Вас есть тестовые сценарии, которые покрывают все девять случаев (и я предлагаю переставить вершины тестовых треугольников также). Обратите особое внимание на случаи, в которых одна из вершин треугольника находится на краю круга.

, Если Вам не нужно точное решение, затем растеризируя числа и считая пиксели в пересечении (как предложили несколько других респондентов) походит на намного более легкий подход к коду, и соответственно менее подверженный ошибкам.

27
ответ дан 30 November 2019 в 05:53
поделиться

попробуйте вычислительная геометрия

Примечание: это не тривиальная проблема, я надеюсь, что это не домашняя работа ;-)

1
ответ дан 30 November 2019 в 05:53
поделиться

Принятие Вы говорите целочисленные пиксели, не реальные, наивная реализация, должно было бы циклично выполниться через каждый пиксель треугольника и проверить расстояние от центра круга против его радиуса.

Это не милая формула, или особенно быстро, но это действительно делало задание.

1
ответ дан 30 November 2019 в 05:53
поделиться

Если у Вас есть GPU в Вашем распоряжении, Вы могли бы использовать этот техника для получения пиксельного количества пересечения..

1
ответ дан 30 November 2019 в 05:53
поделиться

Я думаю, что Вы не должны приближать круг как некоторый набор треугольников, вместо которых можно приблизиться, это - форма с полигоном. Наивный алгоритм может быть похожим:

  1. Преобразовывают Вас круг в полигон с некоторым желаемым количеством вершин.
  2. Вычисляют пересечение двух полигонов (преобразованный круг и треугольник).
  3. Вычисляют квадрат того пересечения.

можно оптимизировать этот алгоритм путем объединения шага 2 и шага 3 в единственную функцию.

Read это связывается:
область выпуклого полигона
Пересечение выпуклых полигонов

1
ответ дан 30 November 2019 в 05:53
поделиться

Насколько точный необходимо быть? Если можно приблизить круг с более простыми формами, можно упростить проблему. Не было бы трудно смоделировать круг как ряд очень узких треугольников, встречающихся в центре, например.

0
ответ дан 30 November 2019 в 05:53
поделиться

Если только один из линейных сегментов треугольника пересекает круг, чистое математическое решение не слишком трудно. После того как Вы знаете, когда эти две точки пересечения, можно использовать формулу расстояния для нахождения длины хорды.

Согласно эти уравнения :

ϑ = 2 sin⁻¹(0.5 c / r)
A = 0.5 r² (ϑ - sin(ϑ))

, где c является длиной хорды, r является радиусом, П‘ становится углом через центр, и A является областью. Обратите внимание, что это решение повреждается, если больше чем половина круга отключена.

Это, вероятно, не стоит усилия, если Вам просто нужно приближение, так как это делает несколько предположений о том, на что похоже фактическое пересечение.

0
ответ дан 30 November 2019 в 05:53
поделиться

Мой первый инстинкт должен был бы преобразовать все так, чтобы круг центрировался на источнике, сделка треугольник к полярным координатам, и решите для пересечения (или охват) треугольника с кругом. Я еще на самом деле не работал он через над бумагой хотя, таким образом, это - только догадка.

0
ответ дан 30 November 2019 в 05:53
поделиться

Так как Ваши формы выпуклы, можно использовать оценку области Monte Carlo.

Тянут поле вокруг круга и треугольника.

Выбирают случайные точки в поле и проводят подсчет сколько падения круга, и сколько падения и круга и треугольника.

область Пересечения в ‰ … область круга * # указывает в кругу и треугольнике / # точки в кругу

точки выбора Остановки, когда предполагаемая область не изменяется больше, чем определенная сумма по определенному числу раундов или просто выбирает постоянное число очков на основе области поля. Оценка области должна сходиться довольно быстро, если одна из Ваших форм не имеет очень мало области.

Примечание: вот то, как Вы определяете, находится ли точка в треугольнике: Барицентрические координаты

1
ответ дан 30 November 2019 в 05:53
поделиться

Я опоздал почти на полтора года, но я подумал, что, возможно, людям будет интересен код здесь, который я написал, который, как я думаю, делает это правильно. Посмотрите в функции IntersectionArea в самом низу. Общий подход состоит в том, чтобы выбрать выпуклый многоугольник, окруженный кругом, а затем работать с маленькими круглыми шапочками.

2
ответ дан 30 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: