Cálculo da área de intersecção de círculos pelo método de Monte Carlo.  Calculando as coordenadas dos pontos de intersecção de dois círculos

Cálculo da área de intersecção de círculos pelo método de Monte Carlo. Calculando as coordenadas dos pontos de intersecção de dois círculos

Problemas geométricos, resolvidos analiticamente utilizando técnicas de álgebra, são parte integrante do programa escolaridade. Além do pensamento lógico e espacial, eles desenvolvem uma compreensão das principais relações entre as entidades do mundo circundante e das abstrações usadas pelas pessoas para formalizar as relações entre elas. Encontrando pontos cruzamentos as figuras geométricas mais simples são um dos tipos de problemas.

Instruções

Suponha que recebamos dois círculos, especificados por seus raios R e r, bem como pelas coordenadas de seus centros - (x1, y1) e (x2, y2), respectivamente. Você precisa calcular se esses círculos se cruzam e, em caso afirmativo, encontrar as coordenadas dos pontos cruzamentos.Para simplificar, podemos assumir que o centro de um dos dados círculos coincide com a origem. Então (x1, y1) = (0, 0) e (x2, y2) = (a, b). Também faz sentido assumir que a? 0 eb? 0.

Assim, as coordenadas do ponto (ou pontos) cruzamentos círculos, se existirem, devem satisfazer um sistema de duas equações: x^2 + y^2 = R^2,
(x - a) ^ 2 + (y - b) ^ 2 = r ^ 2.

Depois de abrir os colchetes, as equações assumem a forma: x^2 + y^2 = R^2,
x^2 + y^2 - 2ax - 2by + a^2 + b^2 = r^2.

Agora a primeira equação pode ser subtraída da segunda. Assim, os quadrados das variáveis ​​desaparecem e aparece equação linear: -2ax - 2por = r^2 - R^2 - a^2 - b^2. Com sua ajuda, você pode expressar y através de x:y = (r^2 - R^2 - a^2 - b^2 - 2ax)/2b.

Se substituirmos a expressão encontrada por y na equação do círculo, o problema se reduz a resolver Equação quadrática: x^2 + px + q = 0, ondep = -2a/2b,
q = (r^2 - R^2 - a^2 - b^2)/2b - R^2.

As raízes desta equação nos permitirão encontrar as coordenadas dos pontos cruzamentos círculos. Se a equação for insolúvel em numeros reais, então os círculos não se cruzam. Se as raízes coincidirem, os círculos se tocam. Se as raízes forem diferentes, os círculos se cruzam.

Se a = 0 ou b = 0, então as equações originais são simplificadas. Por exemplo, com b = 0, o sistema de equações terá a forma: x^2 + y2 = R^2,
(x - a)^2 + y^2 = r^2.

Depois de subtrair a primeira equação da segunda, obtemos: - 2ax + a ^ 2 = r ^ 2 - R ^ 2. Sua solução: x = - (r ^ 2 - R ^ 2 - a2)/2a. Obviamente, no caso de b = 0, os centros de ambos círculos estão no eixo das abcissas e em seus pontos cruzamentos haverá a mesma abscissa.

Se a = 0 e b = 0, mas R ? r, então um dos círculos está obviamente localizado dentro de outro, e o ponto cruzamentos estão faltando. Se R = r, então os círculos coincidem e seus pontos cruzamentos infinitamente muitos.

Se nenhum dos dois círculos o centro não coincide com a origem, então suas equações serão semelhantes a: (x - x1)^2 + (y - y1)^2 = R^2,
(x - x2) ^ 2 + (y - y2) ^ 2 = r ^ 2. Se passarmos para novas coordenadas obtidas das antigas pelo método de tradução paralela: x? = x + x1, y? = y + y1, então essas equações assumem a forma: x?^2 + y?^2 = R^2,
(x? - (x1 + x2))^2 + (y? - (y1 + y2))^2 = r^2. O problema reduz-se assim ao anterior. Tendo encontrado soluções para x? e y?, você pode retornar facilmente às coordenadas originais invertendo as equações para tradução paralela.

Então, minha tarefa foi calcular a área de uma figura que é a intersecção de círculos, seguida de implementação em JavaScript. A área sob o gráfico é a integral. A integração pelo método de Monte Carlo é bastante conhecida, mas, como muitos notarão corretamente, a sua aplicação requer alguma justificação. Para obter detalhes, consulte gato.

Justificativa

A tarefa de calcular a área de intersecção de dois círculos é um problema geométrico trivial (conhecemos as coordenadas dos centros dos círculos e seus raios). A área de intersecção de dois círculos é a soma das áreas dos segmentos correspondentes desses círculos. Existem soluções para calcular a área de intersecção de dois, três, quatro círculos em vários casos especiais.

Mas as soluções para o caso geral da intersecção de até três círculos estão longe de ser tão triviais. Durante a busca, até encontrei estudos sobre cálculo de área de intersecção de N círculos, mas são tão interessantes quanto complexos.

É aqui que entra o método Monte Carlo. Graças ao poder do computador moderno, este método permite um grande número de testes estatísticos, a partir dos resultados dos quais é feita uma generalização.

Assim, o algoritmo para calcular a área de qualquer figura pelo método Monte Carlo se resume ao seguinte:

  1. A figura cabe em um retângulo. As coordenadas dos lados do retângulo são conhecidas, o que significa que sua área é conhecida.
  2. Um grande número de pontos é gerado pseudoaleatoriamente dentro do retângulo. Para cada ponto, é determinado se o ponto está dentro da figura original ou não.
  3. Como resultado, a área da figura original é calculada com base na proporção usual: a razão entre o número de pontos incluídos na figura e o número total de pontos gerados é igual à razão entre a área do figura para a área do retângulo que a delimita.
O último problema que precisa ser resolvido é que é necessário determinar de alguma forma se o ponto está dentro da figura original. No meu caso, este problema é resolvido de forma bastante simples, pois a minha figura consiste em círculos, cujas coordenadas dos centros e raios são conhecidos.

Implementação da tarefa em JavaScript

O desenho de círculos foi feito usando a maravilhosa biblioteca D3.js. Algoritmo inicial posição relativa círculos está além do escopo deste artigo, portanto consideraremos a localização inicial como dada.

Coletando uma série de interseções de pares de círculos

var nós = d3.selectAll("círculo.node"); var quadrados = ; var interseções = ; nodes.each(function(node)( // calcula o raio e a área do círculo var r = this.r.baseVal.value; var s = 3.14159*r*r; squares.push((node: node, square: s, r : r)); // procura por interseções de pares de círculos nodes.each(function(node2)( // distância entre centros e soma dos raios 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}); } }); });


Calcule a área da figura

var areaCalculator = (interseções: , // array de interseções, definido fora do quadro: (), // quadro ao redor da figura círculos: , // array de círculos figureArea: 0, // área necessária da figura monteCarlo: função (p)( // obtém a matriz de círculos da interseção var circles = ; var x1_, y1_, x2_, y2_; // coordenadas dos lados do retângulo var inCirclesArr = function(node)( for(var j=0; j b.x-b.r ? onze; )); x1_ = círculos.x-círculos.r; círculos.sort(function(a,b)( return a.x+a.r< b.x+b.r ? 1: -1; }); x2_ = circles.x+circles.r; circles.sort(function(a,b){ return a.y-a.r >por-b.r? onze; )); y1_ = círculos.y-círculos.r; círculos.sort(function(a,b)( return a.y+a.r< b.y+b.r ? 1: -1; }); y2_ = circles.y+circles.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; iX_rand && (círculos[j].y-círculos[j].r)<= y_rand && (circles[j].y+circles[j].r) >= y_rand))( sim = verdadeiro; p_positivo++; ) ) ) // área da figura = área do retângulo*número de pontos dentro da figura / número total de pontos this.figureArea = this.frame.area *p_positivo/p; ));



Algumas unhas no método Bootstrap

Se falarmos especificamente do método Bootstrap, minha opinião pessoal é que a geração aleatória de um conjunto de dados a partir de um conjunto existente, em geral, não pode servir para avaliar padrões, uma vez que as informações geradas não são confiáveis. Em geral, muitos autores dizem a mesma coisa, apenas com palavras mais inteligentes (e muitas vezes mais duras), por exemplo,

Sejam dois círculos dados por suas equações: (X-X A) ​​​​2 +(Y-Y A) 2 =S 2 A; (X-X B) 2 +(YY B) 2 =S 2 B. Ao mesmo tempo, o ponto A com coordenadas (XA; YA)é o centro do primeiro círculo, e SAé o raio deste círculo. Assim, aponte EM com coordenadas (X B; Y B)é o centro do segundo círculo, e SB-raio do segundo círculo.

A determinação das coordenadas dos pontos de intersecção desses círculos (e no caso geral são dois) pode ser obtida resolvendo as equações apresentadas. No entanto, do ponto de vista computacional, este método de solução é bastante trabalhoso. A este respeito, usaremos uma técnica ligeiramente diferente e calcularemos não as coordenadas dos pontos necessários, mas os incrementos das coordenadas em relação aos centros dos círculos dados.

Vejamos atentamente a Fig. 2.3. Para determinar as coordenadas de t. Pé necessário saber o ângulo direcional de direção QA e a distância entre esses pontos A E P. Resolvendo um problema geodésico direto, podemos encontrar as coordenadas de um ponto Q.

Distância do ponto A ao ponto P conhecido - este é o raio do primeiro círculo SA. Ângulo de direção direcional QA pode ser calculado usando a fórmula

α AQ =α AB -β A (2.13)

Se o ponto desejado Q estiver localizado à ESQUERDA da direção original AB, então o ângulo direcional é obtido como a DIFERENÇA;

Se o ponto desejado F estiver localizado à DIREITA da direção original AB, então o ângulo direcional é obtido como SOMA.

Usaremos a segunda regra ao encontrar o ângulo direcional de direção A.F.:.

α AF = α AB + β A (2.14)

Ângulo direcional α direção AB AB obtemos da solução do problema geodésico inverso usando as coordenadas conhecidas dos pontos A E EM. Resta resolver a questão relativa ao cálculo do ângulo β A .

Podemos realizar um raciocínio semelhante em relação ao cálculo dos incrementos de coordenadas ao longo das linhas churrasco E B. F.. Comprimentos de linha churrasco E B. F. são iguais ao raio do segundo círculo S B, e os ângulos direcionais dessas direções podem ser calculados usando as fórmulas:

αBA =αBA +βB; (2.15)

α BF =α BA -β B . (2.16)

Figura 2.3. Determinação das coordenadas dos pontos de intersecção de dois círculos.

Preste atenção aos sinais com os quais o ângulo β B está incluído nessas fórmulas!

Lembre-se de como calcular o ângulo direcional αBA, se o ângulo direcional α for conhecido AB.

Aqui a questão sobre o tamanho do ângulo também permanece em aberto βB.

Esses ângulos podem ser calculados usando as fórmulas:

Lembre-se por que os triângulos AKQ E BKQ- retangular!

Considerando que para os triângulos indicados QK- lado comum, podemos escrever a seguinte igualdade:

S 2 A -AK 2 =S 2 B -BK 2.

Anexando à última igualdade a igualdade óbvia

AK+BK=AB,

obtemos um sistema de duas equações com duas incógnitas. Tendo resolvido este sistema (executar a solução de forma independente), obtemos

Os cálculos podem ser controlados usando a fórmula AK+BK=AB.

Usando as fórmulas (2.17) e (2.18), calculamos os ângulos auxiliares β e β B . Então, usando as fórmulas (2.14) - (2.16), calculamos os ângulos direcionais das direções QA, A.F., churrasco E B. F.. Ainda de acordo com as fórmulas

calculamos incrementos de coordenadas e controlamos as coordenadas dos pontos P E F.