Как найти площадь пересечения двух фигур

Перейти к содержимому раздела

Форумы CADUser

Информационный портал для профессионалов в области САПР

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Дерево сообщений Активные темы Темы без ответов

Как найти площадь пересечения двух, трех и более фигур?

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

#1 13 апреля 2007г. 10:22:16

  • Санек
  • Восстановленный участник
  • На форуме с 9 октября 2006г.
  • Сообщений: 23
  • Спасибо: 0

Тема: Как найти площадь пересечения двух, трех и более фигур?

Имеется большое количество окружностей и секторов. Можно ли найти площадь пересечения двух, трех и тд фигур и если можно то как.

#2 Ответ от VVA 13 апреля 2007г. 12:18:20

  • VVA
  • Активный участник
  • Откуда: Беларусь / Минск
  • На форуме с 29 марта 2006г.
  • Сообщений: 1,859
  • Спасибо: 24

Re: Как найти площадь пересечения двух, трех и более фигур?

Преобратовать фигуры в регионы (области) и
_intersect
_union
_subtract
в зависимости что нужно

#3 Ответ от Евгений Елпанов 13 апреля 2007г. 12:25:27

  • Евгений Елпанов
  • Евгений Елпанов
  • Активный участник
  • Откуда: Москва
  • На форуме с 2 июля 2004г.
  • Сообщений: 2,538
  • Спасибо: 10

Re: Как найти площадь пересечения двух, трех и более фигур?

> Sanek
или написать программу, которая будет математически вычислять то же самое, что предлагает VVA.
В своем проекте, я так и делаю – автокад накладывает слишком много ограничений на контура, при создании регионов.

#4 Ответ от Vovka 13 апреля 2007г. 20:31:05

  • Vovka
  • Восстановленный участник
  • На форуме с 21 января 2007г.
  • Сообщений: 328
  • Спасибо: 0

Re: Как найти площадь пересечения двух, трех и более фигур?

> Sanek

> Евгений Елпанов
или использовать Autodesk Map

#5 Ответ от Евгений Елпанов 13 апреля 2007г. 20:40:39

  • Евгений Елпанов
  • Евгений Елпанов
  • Активный участник
  • Откуда: Москва
  • На форуме с 2 июля 2004г.
  • Сообщений: 2,538
  • Спасибо: 10

Re: Как найти площадь пересечения двух, трех и более фигур?

> Vovka
Autodesk Map накладывает теже ограничения, что и автокад…

#6 Ответ от Vovka 14 апреля 2007г. 01:32:47

  • Vovka
  • Восстановленный участник
  • На форуме с 21 января 2007г.
  • Сообщений: 328
  • Спасибо: 0

Re: Как найти площадь пересечения двух, трех и более фигур?

> Евгений Елпанов
какие?
ну единственное, которое я заметил, это приведение дуговых сегментов к прямолинейным путем апроксимации. хотя для моей работы это скорее плюс.

#7 Ответ от Санек 16 апреля 2007г. 08:57:49

  • Санек
  • Восстановленный участник
  • На форуме с 9 октября 2006г.
  • Сообщений: 23
  • Спасибо: 0

Re: Как найти площадь пересечения двух, трех и более фигур?

3D MAP не очень устраивает. Математически понятно как с окружностями, а вот ка с секторами не совсем тем более, что они как бы сказать разнонаправленые что ли.

Сообщения 7

Тему читают: 1 гость

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Радиус первой окружности
Радиус второй окружности
Расстояние между двумя окружностями
Площадь пересечения двух окружностей
по заданным параметрам равна:
Первые координаты пересечения
Вторые координаты пересечения

Позволяет рассчитать площадь пересечения двух окружностей произвольных радиусов.

Используются достаточно простые формулы, которые элементарно доказываются.

Дополнительно есть калькулятор, который высчитывает координаты пересечения двух окружностей

 площадь пересечения двух окружностей

Площадь пересечения двух окружностей состоит из двух сегментов FDG и FBG

Вывести формулу  расчета  площади пересечения двух окружностей можно из двух  общеизвестных формул и знаний решения треугольника:

Формулы сектора окружности

(S=cfrac{alpha(R^2)}{2})

и длина хорды окружности

(L=2Rsin(cfrac{alpha}{2}))

По известным сторонам треугольника AFС определяем высоту  на сторону AC.

Удвоением этой высоты мы получаем  длину хорды,  после этого узнаем  угол альфа по второй формуле.

По известным сторонам треугольника AFG  узнаем его площадь. Вычитаем её из площади сектора окружности, ведь угол альфа нам уже известен.

И получаем  площадь сегмента FBG

Подобным образом вычисляем FDG

Это лишь один из способов решения задачи вычисления площади пересечения двух окружностей.

(S=S_1+S_2)

(S_1=cfrac{R_1^2*(F_1-sin(F_1))}{2})

(S_2=cfrac{R_2^2*(F_2-sin(F_2))}{2})

где

(F_1=2*acos{cfrac{R_1^2-R_2^2+D^2}{2*R_1*D}})

(F_2=2*acos{cfrac{R_2^2-R_1^2+D^2}{2*R_2*D}})

где

R_1 – радиус первой окружности

R_2 – радиус второй окружности

D – расстояние между центрами окружностей

Пример

Хотим узнать площадь пересечения двух окружностей радиусом в 1 и расстоянием между центрами 0.8079455

Пишем okr 1 1 0.8079455

Ответ

Площадь двух пересекающихся окружностей равна = 1.5707963388681~ (pi/2)


Первая окружность  радиус 4, вторая окружность радиус 2, расстоянием между центрами 3

Пишем okr 4 2 3

Ответ

Площадь двух пересекающихся окружностей равна = 9.5701994729833


Первая окружность  радиус 4, вторая окружность радиус 2, расстоянием между центрами 0

Пишем okr 4 2 0

Ответ

Окружности не пересекаются

Расчет площади пересечения окружностей методом Монте-Карло

Время на прочтение
4 мин

Количество просмотров 45K

Monte-Carlo Эта статья родилась как логическое продолжение пятничного поста о методе Бутстрапа, а особенно, комментариев к нему. Не защищая метод Бутстрапа, стоит уделить внимание методам Монте-Карло. Здесь я хочу поделиться своим опытом применения Монте-Карло в одной из своих практических задач, а также обоснованием законности этого применения.

Итак, моя задача заключалась в необходимости вычисления площади фигуры, являющейся пересечением окружностей, с последующей реализацией на языке JavaScript. Площадь под графиком – это интеграл. Интегрирование методом Монте-Карло достаточно широко известно, но, как многие верно заметят, его применение требует некоторого обоснования. За подробностями прошу под кат.

Обоснование

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

А вот решения общего случая для пересечения даже трех окружностей уже далеко не так тривиальны. В процессе поиска я нашел даже исследования по расчету площади пересечения N окружностей, однако они настолько же интересны, насколько и сложны.

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

Итак, алгоритм расчета площади любой фигуры методом Монте-Карло сводится к следующему:

  1. Фигура вписывается в прямоугольник. Координаты сторон прямоугольника известны, значит, известна его площадь.
  2. Псевдослучайным образом внутри прямоугольника генерируется большое количество точек. Для каждой точки определяется, попала ли точка внутрь исходной фигуры или нет.
  3. В результате площадь исходной фигуры вычисляется исходя из обычной пропорции: отношение количества точек, попавших в фигуру, к общему количеству сгенерированных точек равно отношению площади фигуры к площади ограничивающего ее прямоугольника.

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

Реализация задачи на JavaScript

Рисование окружностей делалось средствами замечательной библиотеки D3.js. Алгоритм начального взаимного расположения окружностей выходит за рамки данной статьи, поэтому примем начальное расположение как данность.

Собираем массив пересечений пар окружностей

var nodes = d3.selectAll("circle.node");

var squares = [];
var intersections = [];

nodes.each(function(node){
   // считаем радиус и площадь окружности
   var r = this.r.baseVal.value;
   var s = 3.14159*r*r;
   squares.push({node: node, square: s, r: r});

   // ищем пересечения пар окружностей
    nodes.each(function(node2){
        // расстояние между центрами и сумма радиусов
        var center_dist = Math.sqrt(Math.pow(node.x-node2.x, 2)+(Math.pow(node.y-node2.y, 2)));
        var radius_sum = r + this.r.baseVal.value;
        if(center_dist <= radius_sum && node.index != node2.index){
            // окружности пересекаются. проверить, что это пересечение найдено впервые
            node.r = r;
            node2.r = this.r.baseVal.value;
            if(isNewIntersection(intersections, node, node2)) 
                  intersections.push({node1: node, node2: node2, center_dist: center_dist});
        }
    });
});

Считаем площадь фигуры

var areaCalculator = {
  intersections: [], // массив пересечений, устанавливается снаружи
  frame: {}, // рамка вокруг фигуры
  circles: [], // массив окружностей
  figureArea: 0, // искомая площадь фигуры
  monteCarlo:
      function(p){
          // получаем массив окружностей из пересечения
          var circles = [];
          var x1_, y1_, x2_, y2_; // координаты сторон прямоугольника
          var inCirclesArr = function(node){
              for(var j=0; j<circles.length; j++){
                  if(circles[j].index==node.index){
                      return true;
                  }
              }
              return false;
          };
          for(var i=0; i<this.intersections.length; i++){
              if(!inCirclesArr(this.intersections[i].node1)){
                  circles.push(this.intersections[i].node1);
              }
              if(!inCirclesArr(this.intersections[i].node2)){
                  circles.push(this.intersections[i].node2);
              }
          }

          this.circles = circles;

          circles.sort(function(a,b){
              return a.x-a.r > b.x-b.r ? 1 : -1;
          });
          x1_ = circles[0].x-circles[0].r;

          circles.sort(function(a,b){
              return a.x+a.r < b.x+b.r ? 1 : -1;
          });
          x2_ = circles[0].x+circles[0].r;

          circles.sort(function(a,b){
              return a.y-a.r > b.y-b.r ? 1 : -1;
          });
          y1_ = circles[0].y-circles[0].r;

          circles.sort(function(a,b){
              return a.y+a.r < b.y+b.r ? 1 : -1;
          });
          y2_ = circles[0].y+circles[0].r;

          this.frame.x1 = x1_;
          this.frame.x2 = x2_;
          this.frame.y1 = y1_;
          this.frame.y2 = y2_;
          this.frame.area = (x2_-x1_)*(y2_-y1_);
          
          // рисуем прямоугольник
          paintRect(this.frame);          

          // p - количество генерируемых точек. В примере использовалось 100.000, чего хватило для приемлемой точности
          var p_positive = 0; // количество точек попавших в фигуру

          // генерируем p точек для определения площади фигуры
          for(var i=0; i<p; i++){
              var x_rand = Math.random()*(x2_-x1_)+x1_;
              var y_rand = Math.random()*(y2_-y1_)+y1_;

              var yes = false;
              for(var j=0; j<circles.length; j++) {
                  if(!yes && (
                        (circles[j].x-circles[j].r) <= x_rand &&
                        (circles[j].x+circles[j].r) >= x_rand &&
                        (circles[j].y-circles[j].r) <= y_rand &&
                        (circles[j].y+circles[j].r) >= y_rand )
                    ){
                     yes = true;
                     p_positive++;
                  }
              }
          }

          // площадь фигуры = площадь прямоугольника*кол-во точек внутри фигуры / общее кол-во точек
          this.figureArea = this.frame.area*p_positive/p;
      }
};

Результат

Пара гвоздей в метод Бутстрапа

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

Заключение

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

Как найти площадь пересечения двух окружностей

Позволяет рассчитать площадь пересечения двух окружностей произвольных радиусов.

Используются достаточно простые формулы, которые элементарно доказываются.

Дополнительно есть калькулятор, который высчитывает координаты пересечения двух окружностей

Площадь пересечения двух окружностей состоит из двух сегментов FDG и FBG

Вывести формулу расчета площади пересечения двух окружностей можно из двух общеизвестных формул и знаний решения треугольника:

Формулы сектора окружности

и длина хорды окружности

По известным сторонам треугольника AFС определяем высоту на сторону AC.

Удвоением этой высоты мы получаем длину хорды, после этого узнаем угол альфа по второй формуле.

По известным сторонам треугольника AFG узнаем его площадь. Вычитаем её из площади сектора окружности, ведь угол альфа нам уже известен.

И получаем площадь сегмента FBG

Подобным образом вычисляем FDG

Это лишь один из способов решения задачи вычисления площади пересечения двух окружностей.

– радиус первой окружности

– радиус второй окружности

– расстояние между центрами окружностей

Пример

Хотим узнать площадь пересечения двух окружностей радиусом в 1 и расстоянием между центрами 0.8079455

Пишем okr 1 1 0.8079455

Площадь двух пересекающихся окружностей равна = 1.5707963388681

Первая окружность радиус 4, вторая окружность радиус 2, расстоянием между центрами 3

Пишем okr 4 2 3

Площадь двух пересекающихся окружностей равна = 9.5701994729833

Первая окружность радиус 4, вторая окружность радиус 2, расстоянием между центрами 0

Расчет площади пересечения окружностей методом Монте-Карло

Эта статья родилась как логическое продолжение пятничного поста о методе Бутстрапа, а особенно, комментариев к нему. Не защищая метод Бутстрапа, стоит уделить внимание методам Монте-Карло. Здесь я хочу поделиться своим опытом применения Монте-Карло в одной из своих практических задач, а также обоснованием законности этого применения.

Итак, моя задача заключалась в необходимости вычисления площади фигуры, являющейся пересечением окружностей, с последующей реализацией на языке JavaScript. Площадь под графиком – это интеграл. Интегрирование методом Монте-Карло достаточно широко известно, но, как многие верно заметят, его применение требует некоторого обоснования. За подробностями прошу под кат.

Обоснование

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

А вот решения общего случая для пересечения даже трех окружностей уже далеко не так тривиальны. В процессе поиска я нашел даже исследования по расчету площади пересечения N окружностей, однако они настолько же интересны, насколько и сложны.

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

Итак, алгоритм расчета площади любой фигуры методом Монте-Карло сводится к следующему:

  1. Фигура вписывается в прямоугольник. Координаты сторон прямоугольника известны, значит, известна его площадь.
  2. Псевдослучайным образом внутри прямоугольника генерируется большое количество точек. Для каждой точки определяется, попала ли точка внутрь исходной фигуры или нет.
  3. В результате площадь исходной фигуры вычисляется исходя из обычной пропорции: отношение количества точек, попавших в фигуру, к общему количеству сгенерированных точек равно отношению площади фигуры к площади ограничивающего ее прямоугольника.

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

Реализация задачи на JavaScript

Пара гвоздей в метод Бутстрапа

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

Пересечение двух окружностей

Этот онлайн калькулятор находит точки пересечения двух окружностей, если они существуют

Чтобы использовать калькулятор, введите координаты x и y центра и радиус каждой окружности.

Формулы для расчета приведены под калькулятором.

Точки пересечения двух окружностей

Первая окружность

Вторая окружность

Пересечение окружностей

Сама по себе задача нахождения точек пересечения двух окружностей достаточно проста, однако предварительно надо проанализировать если ли вообще точки пересения у данных двух окружностей. Поэтому начать надо с вычисления расстояния d в декартовых координатах между центрами окружностей и сравнения его с радиусами окружностей r1 и r2.

При этом возможно следующие случаи (расстояние между центрами показано красным отрезком):

Случай Описание Условие
Тривиальный случай – окружности совпадают (это одна и та же окружность)
Окружности не касаются друг друга r1 + r2″ />
Одна окружность содержится внутри другой и не касается ее
Окружности пересекаются в двух точках Не выполнено ни одно из условий выше
Окружности соприкасаются в одной точке Частный случай предыдущего

Если окружности действительно пересекаются, калькулятор использует следующие формулы (в-основном выведенные из теоремы Пифагора), проиллюстрированные рисунком ниже:

Сначала калькулятор находит отрезок a

Чтобы найти точку P3, калькулятор использует следующую формулу (в векторном виде):

И наконец, чтобы найти точки пересечения, калькулятор использует следующие уравнения:
Первая точка:

Обратите внимание на разные знаки перед вторым слагаемым

По теме также можно посмотреть следующие ссылки (на английском языке): Circle-Circle Intersection и Circles and spheres

[spoiler title=”источники:”]

http://habr.com/ru/post/192272/

http://planetcalc.ru/8098/

[/spoiler]

Координаты вершин двух треугольников на плоскости заданы в порядке обхода против часов стрелки. Нужно найти и вывести площадь их пересечения.

введите сюда описание изображения

задан 4 янв 2016 в 13:17

Makrushin Evgenii's user avatar

5

Задача легко разбивается на подзадачи, для которых есть готовые решения:

  1. Найти пересечение – обрезать (clip) один треугольник вторым. Например, с помощью алгоритма Sutherland–Hodgman. Результатом пересечения будет выпуклый полигон.

  2. Найти площадь полученного полигона. Например, по формуле из википедии:

введите сюда описание изображения

ответ дан 4 янв 2016 в 13:28

0

реализация решения, предложенного PashaPash♦

# Sutherland-Hodgman algorithm for clipping
def clip(subjectPolygon, clipPolygon):
    def inside(p):
        return (cp2[0] - cp1[0]) * (p[1] - cp1[1]) > (cp2[1] - cp1[1]) * (p[0] - cp1[0])

    def computeIntersection():
        dc = [cp1[0] - cp2[0], cp1[1] - cp2[1]]
        dp = [s[0] - e[0], s[1] - e[1]]
        n1 = cp1[0] * cp2[1] - cp1[1] * cp2[0]
        n2 = s[0] * e[1] - s[1] * e[0]
        n3 = 1.0 / (dc[0] * dp[1] - dc[1] * dp[0])
        return [(n1 * dp[0] - n2 * dc[0]) * n3, (n1 * dp[1] - n2 * dc[1]) * n3]

    outputList = subjectPolygon
    cp1 = clipPolygon[-1]

    for clipVertex in clipPolygon:
        cp2 = clipVertex
        inputList = outputList
        outputList = []
        s = inputList[-1]

        for subjectVertex in inputList:
            e = subjectVertex
            if inside(e):
                if not inside(s):
                    outputList.append(computeIntersection())
                outputList.append(e)
            elif inside(s):
                outputList.append(computeIntersection())
            s = e
        cp1 = cp2
    return outputList

def calcArea( subjectPolygon ):
    if subjectPolygon == []:
        return 0
    subjectPolygon = subjectPolygon + [subjectPolygon[0]]
    xSum = 0
    for i in range(len(subjectPolygon)-1):
        xSum += subjectPolygon[i][0]*subjectPolygon[i+1][1]
    ySum = 0
    for i in range(len(subjectPolygon)-1):
        ySum += subjectPolygon[i][1]*subjectPolygon[i+1][0]
    return 0.5 * abs(xSum - ySum)

ответ дан 6 янв 2016 в 11:08

Makrushin Evgenii's user avatar

4

Если рассматривать синий треугольник как выпуклый полигон, то алгоритм его обрезки каждой из сторон оранжевого треугольника может выглядеть так:

  1. Записываем уравнение стороны оранжевого треугольника по двум вершинам и вычисляем знак S его третьей вершины при подстановке в это уравнение.
  2. Подставляем каждую вершину синего полигона в уравнение стороны оранжевого треугольника и умножаем результат на S. Если произведение меньше нуля, то заменяем одну вершину на две.
    При замене вершин следует убедиться, что все остальные вершины полигона окажутся по одну сторону от новых сторон. Если это не так – следует поменять новые вершины местами.

ответ дан 5 янв 2016 в 17:32

Yuri Negometyanov's user avatar

Добавить комментарий