Monte Carlo 방법에 의한 원의 교차 영역 계산.  두 원의 교차점 좌표 계산

Monte Carlo 방법에 의한 원의 교차 영역 계산. 두 원의 교차점 좌표 계산

대수 기법을 사용하여 분석적으로 해결하는 기하학적 문제는 프로그램의 필수 부분입니다. 훈련. 논리적이고 공간적인 사고 외에도 그들은 주변 세계의 실체와 그들 사이의 관계를 공식화하기 위해 사람들이 사용하는 추상화 사이의 주요 관계에 대한 이해를 발전시킵니다. 포인트 찾기 교차로가장 간단한 기하학적 모양 - 그러한 작업 유형 중 하나.

지침

반지름 R 및 r과 중심 좌표(각각 (x1, y1) 및 (x2, y2))에 의해 주어진 두 개의 원이 있다고 가정합니다. 이 원들이 교차하는지 여부를 계산하고 교차한다면 점의 좌표를 찾아야 합니다. 교차로.단순화를 위해 주어진 것 중 하나의 중심이 있다고 가정할 수 있습니다. 서클기원과 일치합니다. 그런 다음 (x1, y1) = (0, 0) 및 (x2, y2) = (a, b)입니다. 또한 ? 0과 b? 0.

따라서 점(또는 점들)의 좌표는 교차로 서클, 있는 경우 두 방정식의 시스템을 충족해야 합니다. x^2 + y^2 = R^2,
(x - a)^2 + (y - b)^2 = r^2.

괄호를 연 후 방정식은 x^2 + y^2 = R^2 형식을 취합니다.
x^2 + y^2 - 2ax - 2by + a^2 + b^2 = r^2.

이제 첫 번째 방정식을 두 번째 방정식에서 뺄 수 있습니다. 따라서 변수의 제곱이 사라지고 일차 방정식: -2ax - 2by = r^2 - R^2 - a^2 - b^2. x:y = (r^2 - R^2 - a^2 - b^2 - 2ax)/2b로 y를 표현하는 데 사용할 수 있습니다.

y에 대해 찾은 식을 원 방정식으로 대체하면 문제는 풀이로 축소됩니다. 이차 방정식: x^2 + px + q = 0, 여기서 p = -2a/2b,
q = (r^2 - R^2 - a^2 - b^2)/2b - R^2.

이 방정식의 근을 사용하면 점의 좌표를 찾을 수 있습니다. 교차로 서클. 에서 방정식을 풀 수 없는 경우 실수, 원이 교차하지 않습니다. 뿌리가 서로 일치하면 원이 서로 닿습니다. 뿌리가 다르면 원이 교차합니다.

a = 0 또는 b = 0이면 원래 방정식이 단순화됩니다. 예를 들어, b = 0인 경우 연립방정식은 x^2 + y2 = R^2 형식을 취합니다.
(x - a)^2 + y^2 = r^2.

두 번째 방정식에서 첫 번째 방정식을 빼면 - 2ax + a^2 = r^2 - R^2이고 해는 x = - (r^2 - R^2 - a2)/2a입니다. 분명히, b = 0인 경우, 둘 다의 중심 서클 x 축과 해당 지점에 있습니다. 교차로동일한 가로 좌표를 갖게 됩니다.

a=0이고 b=0이지만 R ? r 다음 중 하나 서클다른 내부에 있는 것으로 알려져 있으며, 포인트 교차로잃어버린. R = r이면 원이 일치하고 점 교차로무한히 많습니다.

둘 중 하나라도 없다면 서클중심이 원점과 일치하지 않으면 방정식은 다음과 같습니다. (x - x1)^2 + (y - y1)^2 = R^2,
(x - x2)^2 + (y - y2)^2 = r^2. = x + x1, y? = y + y1이면 이 방정식의 형식은 다음과 같습니다. x?^2 + y?^2 = R^2,
(x? - (x1 + x2))^2 + (y? - (y1 + y2))^2 = r^2. 따라서 문제는 이전 문제로 축소됩니다. x에 대한 솔루션을 찾으십니까? 및 y?, 병렬 변환을 위해 방정식을 반전하여 원래 좌표로 쉽게 돌아갈 수 있습니다.

그래서 내 임무는 원의 교점인 도형의 면적을 계산하고 이후에 JavaScript로 구현하는 것이었습니다. 그래프 아래 영역은 적분입니다. Monte Carlo 통합은 잘 알려져 있지만 많은 사람들이 올바르게 지적한 것처럼 그 적용에는 약간의 정당성이 필요합니다. 자세한 내용은 고양이 아래를 참조하십시오.

이론적 해석

두 원의 교차 영역을 계산하는 작업은 사소한 기하학적 문제입니다 (원의 중심 좌표와 반경은 우리에게 알려져 있습니다). 두 원의 교차 영역은 이러한 원의 해당 세그먼트 영역의 합입니다. 다양한 특수한 경우에 2, 3, 4개의 원의 교차 영역을 계산하는 솔루션이 있습니다.

그러나 세 개의 원이 교차하는 경우에 대한 일반적인 경우의 솔루션은 그렇게 사소한 것이 아닙니다. 검색 과정에서 N 원의 교차 영역을 계산하는 연구도 찾았지만 복잡한만큼 흥미 롭습니다.

몬테카를로 방법이 작동하는 곳입니다. 최신 컴퓨터 성능 덕분에 이 방법을 수행할 수 있습니다. 많은 수의일반화가 이루어진 결과를 기반으로 한 통계 테스트.

따라서 Monte Carlo 방법을 사용하여 그림의 면적을 계산하는 알고리즘은 다음과 같습니다.

  1. 그림은 직사각형에 맞습니다. 사각형 변의 좌표를 알고 있으므로 해당 영역을 알고 있습니다.
  2. 유사 무작위로 많은 수의 점이 사각형 내부에 생성됩니다. 각 점에 대해 점이 원래 그림 내부에 있는지 여부가 결정됩니다.
  3. 결과적으로 원래 그림의 면적은 일반적인 비율에 따라 계산됩니다. 생성된 총 점 수에 대한 그림에 포함된 점 수의 비율은 경계를 이루는 직사각형의 면적을 그림.
해결해야 할 마지막 문제는 점이 원래 그림 내부에 있는지 확인하는 것이 어떻게든 필요하다는 것입니다. 제 경우에는이 문제가 아주 간단하게 해결됩니다. 제 그림은 중심 좌표와 반지름이 알려진 원으로 구성되어 있기 때문입니다.

JavaScript에서 작업 구현

멋진 D3.js 라이브러리를 사용하여 원을 그렸습니다. 초기의 상대 위치 circles는 이 문서의 범위를 벗어나므로 초기 위치를 주어진 것으로 간주합니다.

원 쌍의 교차점 배열 수집

var nodes = d3.selectAll("circle.node"); var 제곱 = ; var 교차점 = ; nodes.each(function(node)( // 원의 반지름과 면적 계산 var r = this.r.baseVal.value; var s = 3.14159*r*r; squares.push((node: node, square: s, r : r)); // 원 쌍의 교차점을 찾습니다. 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 = ( 교차점: , // 교차점 배열, 외부 프레임 설정: (), // 그림 주변 프레임 circles: , // 원 배열 figureArea: 0, // 몬테카를로 그림의 원하는 영역: function (p)( // 교차점에서 원 배열 가져오기 var circles = ; var x1_, y1_, x2_, y2_; // 직사각형 변의 좌표 var inCirclesArr = function(node)( for(var j=0; j b.x-b.r ? 열하나; )); x1_ = circles.x-circles.r; circles.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 >b.y-b.r ? 열하나; )); y1_=circles.y-circles.r; circles.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 && (서클[j].y-서클[j].r)<= y_rand && (circles[j].y+circles[j].r) >= y_rand))( yes = true; p_positive++; ) ) ) // 그림의 면적 = 직사각형의 면적 * 그림 내부의 포인트 수 / 총 포인트 수 this.figureArea = this.frame.area*p_positive/ 피; ) );



Bootstrap 방법의 몇 가지 못

Bootstrap 방법에 대해 구체적으로 이야기하면 내 개인적인 의견은 기존 세트에서 데이터 세트를 임의로 생성하는 것은 일반적으로 생성된 정보를 신뢰할 수 없기 때문에 패턴을 평가하는 데 사용할 수 없다는 것입니다. 일반적으로 이것은 더 똑똑하고 종종 더 날카로운 단어로만 동일합니다. 많은 저자는 예를 들어 다음과 같이 말합니다.

방정식으로 두 개의 원을 지정하십시오. (X-X A) ​​2 + (Y-Y A) 2 \u003d S 2 A ; (X-X B) 2 + (Y-Y B) 2 = S 2 B. 동시에, 요점 하지만좌표로 (XA; YA)첫 번째 원의 중심이고, 이 원의 반지름입니다. 이에 따라 요점 좌표로 (XB; YB)는 두 번째 원의 중심이며, 에스비두 번째 원의 반지름입니다.

이 원의 교차점 좌표 (일반적인 경우 두 개가 있음)는 제시된 방정식을 풀면 얻을 수 있습니다. 그러나 계산적인 관점에서 볼 때 이 솔루션 방법은 상당히 힘든 작업입니다. 이와 관련하여 약간 다른 방법을 사용하고 원하는 점의 좌표가 아니라 주어진 원의 중심에 대한 좌표 증분을 계산합니다.

그림을 주의 깊게 살펴보자. 2.3. 좌표를 결정하려면 당신은 방향의 방향 각도를 알아야합니다 AQ그리고 이 점들 사이의 거리 하지만그리고 . 직접 측지선 문제를 해결하면 점의 좌표를 찾을 수 있습니다. 큐.

지점까지의 거리 하지만요점에 알려진 것은 첫 번째 원의 반지름입니다. . 방향각 AQ공식을 사용하여 계산할 수 있습니다

α AQ = α AB - β A (2.13)

원하는 점 Q가 원래 방향 AB의 LEFT이면 방향 각도는 DIFFERENCE로 구합니다.

원하는 점 F가 원래 방향 AB의 오른쪽이면 방향 각도는 SUM으로 구합니다.

방향의 방향각을 찾을 때 사용할 두 번째 규칙 AF:.

α AF = α AB + β A (2.14)

지향각 α AB 방향 AB우리는 포인트의 알려진 좌표에 대한 역 측지선 문제의 솔루션에서 얻습니다. 하지만그리고 에.각도 β A의 계산에 관한 문제를 해결해야 합니다.

선을 따라 좌표 증분 계산에 대해 유사한 주장을 할 수 있습니다. 비큐그리고 bf. 라인 길이 비큐그리고 bf두 번째 원의 반경 S B 와 같으며 이러한 방향의 방향 각도는 다음 공식으로 계산할 수 있습니다.

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

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

그림 2.3. 두 원의 교차점 좌표 결정.

각도 β B가 이 공식에 들어가는 기호에 주의하십시오!

방향각을 계산하는 방법을 기억하십시오. αBA, 방향각 α가 알려진 경우 AB.

여기에서도 각도의 크기에 대한 질문이 열려 있습니다. βB.

이 각도는 다음 공식을 사용하여 계산할 수 있습니다.

왜 삼각형인지 기억하세요 AKQ그리고 BKQ- 직사각형!

지정된 삼각형에 대해 QK-공통 다리, 우리는 다음과 같은 평등을 쓸 수 있습니다:

S2A-AK2 \u003d S2B-BK2.

마지막 평등을 명백한 평등으로 돌리기

AK+BK=AB,

우리는 두 개의 미지수를 가진 두 방정식의 시스템을 얻습니다. 이 시스템(독립적으로 수행하기로 한 결정)을 해결하면 다음을 얻습니다.

수식에 따라 계산 제어를 수행할 수 있습니다. AK+BK=AB.

공식 (2.17) 및 (2.18)을 적용하여 보조 각도 β 및 β B를 계산합니다. 그런 다음 공식 (2.14) - (2.16)을 사용하여 방향의 방향 각도를 계산합니다. AQ, AF, 비큐그리고 bf. 공식에 대해 더 알아보기

좌표 증분 계산 및 포인트 좌표 제어 그리고 에프.