Как найти пересечение окружностей python

The above code of plotting the intersection points did not plot the intersecting points properly.
I have adjusted the code to plot them as follows:

import matplotlib.pyplot as plt
import math

def get_intersections(x0, y0, r0, x1, y1, r1):
    # circle 1: (x0, y0), radius r0
    # circle 2: (x1, y1), radius r1

    d=math.sqrt((x1-x0)**2 + (y1-y0)**2)

    # non intersecting
    if d > r0 + r1 :
        return {}
    # One circle within other
    if d < abs(r0-r1):
        return {}
    # coincident circles
    if d == 0 and r0 == r1:
        return {}
    else:
        a=(r0**2-r1**2+d**2)/(2*d)
        h=math.sqrt(r0**2-a**2)
        x2=x0+a*(x1-x0)/d   
        y2=y0+a*(y1-y0)/d   
        x3=x2+h*(y1-y0)/d     
        y3=y2-h*(x1-x0)/d 
        x4=x2-h*(y1-y0)/d
        y4=y2+h*(x1-x0)/d
        return x3, y3, x4, y4

# intersection circles
x0, y0 = 0, 0
r0 = 5
x1, y1 = 2, 2
r1 = 5

# intersecting with (x1, y1) but not with (x0, y0)
x2, y2 = -1,0
r2 = 2.5

circle1 = plt.Circle((x0, y0), r0, color='b', fill=False)
circle2 = plt.Circle((x1, y1), r1, color='b', fill=False)
circle3 = plt.Circle((x2, y2), r2, color='b', fill=False)

fig = plt.figure(figsize = (10, 10)) 
plt.grid(True)
ax = fig.add_subplot(111)

ax.set_xlim((-10, 10))
ax.set_ylim((-10, 10))
ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)

intersections1 = get_intersections(x0, y0, r0, x1, y1, r1)
print(intersections1)
if len(intersections1) > 0:
    print(intersections3)
    i_x3, i_y3, i_x4, i_y4 = intersections1 
    #plt.plot([i_x3, i_x4], [i_y3, i_y4], 'o', color='r')
    ax.scatter([i_x3, i_x4],[i_y3, i_y4] ,marker ='X',s=300,alpha=1)

intersections2 = get_intersections(x0, y0, r0, x2, y2, r2)
print(intersections2)
if len(intersections2) > 0:
    i_x3, i_y3, i_x4, i_y4 = intersections2 
    plt.plot([i_x3, i_x4], [i_y3, i_y4], 'o', color='r')
    ax.scatter([i_x3, i_x4],[i_y3, i_y4] ,marker ='X',s=300,alpha=1)

intersections3 = get_intersections(x1, y1, r1, x2, y2, r2)

if len(intersections3) > 0:
    print(intersections3)
    i_x3, i_y3, i_x4, i_y4 = intersections3 
    #plt.plot([i_x3, i_x4], [i_y3, i_y4], 'o', color='r')
    ax.scatter([i_x3, i_x4],[i_y3, i_y4] ,marker ='X',s=300,alpha=1)
plt.gca().set_aspect('equal', adjustable='box')

The output is given in the image:

https://i.stack.imgur.com/KAYeC.png

Есть код

class Circle:
    def __init__(self, center, radius):
        self.center = center  
        self.radius = radius  
    def square(self):
        return (3.14 * self.radius**2)

Он принимает координаты центра круга и его радиус, а потом находит площадь круга, его необходимо доработать, добавив ему ещё один метод def do_intersect, который будет принимать другой объект класса Circle и возвращать True или False в зависимости от того, пересекаются круги или нет. Но как это сделать я не знаю…

задан 21 ноя 2020 в 18:51

Silya's user avatar

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

class Circle:
    def __init__(self, radius, *args):
        self.center = args
        self.radius = radius

    def square(self):
        return 3.14 * self.radius ** 2

    def do_intersect(self, other):
        dist = ((self.center[0] - other.center[0]) ** 2 + (self.center[1] - other.center[1]) ** 2) ** 0.5
        return abs(self.radius - other.radius) <= dist <= self.radius + other.radius

circle = Circle(3, 1, 1)
circle2 = Circle(1, 1, 1)
print(circle.do_intersect(circle2))

Stanislav Volodarskiy's user avatar

ответ дан 21 ноя 2020 в 19:18

Vitek_228_69's user avatar

Vitek_228_69Vitek_228_69

3481 серебряный знак8 бронзовых знаков

3

проверить пересекаются ли круги можно взяв расстояние их центров и вычесть сумму их радиусов

def f(center1, r1, center2, r2):
    x = center1[0] - center2[0]
    y = center1[1] - center2[1]
    
    dist = (x * x + y * y) ** 0.5
    
    if dist < abs(r1 - r2):
        return False
    dist -= r1 + r2
    
    return dist < 0

ответ дан 21 ноя 2020 в 18:58

Danis's user avatar

DanisDanis

19.1k5 золотых знаков20 серебряных знаков55 бронзовых знаков

2

0 / 0 / 0

Регистрация: 03.10.2016

Сообщений: 36

1

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

16.12.2016, 15:11. Показов 16398. Ответов 1


Студворк — интернет-сервис помощи студентам

Напишите программу, которая по данным, определяющим два круга на плоскости (круг на плоскости определяется тремя числами, первые два числа координаты центра, третье – радиус) определяет, пересекаются круги или нет. Программа должна работать пока не будет введена пустая строка. Диагноз (да/нет) оформите в виде вспомогательной функции.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

16.12.2016, 15:11

Ответы с готовыми решениями:

Построить n концентрических окружностей
Даны натуральные числа n, x, y, r1, c1, r2, c2, …, rn,cn. Построить n концентрических окружностей…

Пересечение окружностей.
Приветствую, вообщем тут такая задача: найти точки пересечения окружностей.
Не могу понять в чем у…

Пересечение окружностей
Нужна функция что определяет , пересикаются ли два круга или входит ли один круг во второй…
В…

Пересечение окружностей
стоит задача найти координаты точки пересечения двух окружностей
исходные данные: координаты…

1

Jabbson

Эксперт по компьютерным сетям

5889 / 3347 / 1033

Регистрация: 03.11.2009

Сообщений: 9,975

16.12.2016, 17:15

2

Лучший ответ Сообщение было отмечено TheSlayer как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from math import sqrt
 
 
def calc_interception(x1, y1, r1, x2, y2, r2):
    cen_dist = sqrt((x1-x2)**2 + (y1-y2)**2)
    if not cen_dist:
        return "Нет" if r1 != r2 else "Да"
    else:
        return "Нет" if cen_dist > r1 + r2 else "Да"
 
data = []
while True:
    line = input()
    if not line:
        break
    data.append(float(line))
 
print(calc_interception(*data))

проверок вводимых данных нет, если надо — думаю, это не составит большого труда.



0



«Python Последнее обновление 25 июля 2019 05:39:15 (UTC / GMT +8 часов)

script1adsense2code

script1adsense3code

Python Basic — 1: Упражнение 45 с решением

Есть две окружности C1 с радиусом r1, центральной координатой (x1, y1) и C2 с радиусом r2 и центральной координатой (x2, y2)

Напишите программу на Python, чтобы проверить следующее:

  • «C2 находится в C1», если C2 находится в C1
  • «C1 находится в C2», если C1 находится в C2
  • «Окружность С1 и С2 пересекаются», если пересекаются С1 и С2, и
  • «C1 и C2 не перекрываются», если C1 и C2 не перекрываются.

Входные данные :
Входные числа (действительные числа) разделяются пробелом.

Иллюстрированная презентация:

«Python:

Пример решения :

Код Python:

import math
print("Input x1, y1, r1, x2, y2, r2:")
x1,y1,r1,x2,y2,r2 = [float(i) for i in input().split()]
d = math.sqrt((x1-x2)**2 + (y1-y2)**2)
if d < r1-r2:
    print("C2  is in C1")
elif d < r2-r1:
    print("C1  is in C2")
elif d > r1+r2:
    print("Circumference of C1  and C2  intersect")
else:
    print("C1 and C2  do not overlap")

Пример вывода:

 Введите x1, y1, r1, x2, y2, r2:
 5 6 4 8 7 9
С1 находится в С2

Блоксхема:

«Блок-схема:

Редактор кода Python:

Есть другой способ решить это решение? Внесите свой код (и комментарии) через Disqus.

Предыдущий: Напишите программу на Python, чтобы найти максимальную сумму смежной подпоследовательности из заданной последовательности чисел a1, a2, a3, … an. Подпоследовательность одного элемента также является непрерывной подпоследовательностью.
Далее: Напишите программу на Python, которая считывает дату (с 2016/1/1 по 2016/12/31) и печатает день даты. 1 января 2016 года — пятница. Обратите внимание, что 2016 год високосный.

#python #set-intersection

#python #установить-пересечение

Вопрос:

Я пытаюсь найти пересечения между двумя кругами в Python (используя Matplotlib), но не могу вернуть какие-либо значения.

Я делаю это, создавая списки X и Y для каждого отдельного круга (Matplotlib принимает первый аргумент как значения X, а второй — как значения Y при рисовании круга), а затем соответствующим образом пересекая списки (например, значения circle1 x со значениями circle2 x).

 import numpy
import math
import matplotlib.pyplot as plt
import random

def origin_circle():
    global x_points
    global y_points
    global r
    global n
    r=1
    n=2**16
    x_points=[(r*math.cos(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n 1)]
    y_points=[(r*math.sin(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n 1)]

def new_circle(x_offset, y_offset):
    global x_points1
    global y_points1
    x_points1=[x_offset (r*math.cos(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n 1)]
    y_points1=[y_offset (r*math.sin(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n 1)]

origin_circle()
new_center= random.randint(0, len(x_points))
x_offset = x_points[new_center]
y_offset = y_points[new_center]
new_circle(x_offset, y_offset)
print(set(x_points1).intersection(set(x_points)))
print(set(y_points1).intersection(set(y_points)))
  

Я ожидал получить значения обратно, но возвращенный набор был пуст.

Комментарии:

1. Каждая из ваших функций должна возвращать свои точки x и y, если вы хотите иметь возможность использовать эти данные вне функции. docs.python.org/3/tutorial/controlflow.html#defining-functions

2. Поскольку ваши циклы состоят из конечного числа точек, вы уверены, что у них есть какие-либо общие точки? У них могут быть общие точки только в пределе континуума.

3. Существуют формулы для вычисления пересечения (если таковое имеется) двух окружностей с заданными там центрами и радиусами, которые не требуют перечисления каких-либо точек на их окружности.

4. Эта строка здесь (set(x_points1).intersection(set(x_points))) практически никогда не найдет пересечения между этими двумя наборами, только точки, которые существуют в обоих наборах. Поскольку вы генерируете точки вокруг внешней стороны каждой окружности, крайне маловероятно, что две из этих точек будут точно такими же на разных окружностях, даже выключение на 0.00000000001 гарантирует, что ваше пересечение ничего не найдет. Вам понадобится лучший метод для нахождения пересечения.

Ответ №1:

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

Если две окружности пересекаются в двух точках, то есть прямой способ вычислить эти две точки пересечения. Алгебра подробно описана здесь в разделе Intersection of two circles .

Мы также можем исключить случаи, когда две окружности не пересекаются, как показано ниже

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

Код для возврата двух пересекающихся точек двух окружностей. Каждая окружность описывается ее центром (x, y) и радиусом (r)

 def get_intersections(x0, y0, r0, x1, y1, r1):
    # circle 1: (x0, y0), radius r0
    # circle 2: (x1, y1), radius r1

    d=math.sqrt((x1-x0)**2   (y1-y0)**2)
    
    # non intersecting
    if d > r0   r1 :
        return None
    # One circle within other
    if d < abs(r0-r1):
        return None
    # coincident circles
    if d == 0 and r0 == r1:
        return None
    else:
        a=(r0**2-r1**2 d**2)/(2*d)
        h=math.sqrt(r0**2-a**2)
        x2=x0 a*(x1-x0)/d   
        y2=y0 a*(y1-y0)/d   
        x3=x2 h*(y1-y0)/d     
        y3=y2-h*(x1-x0)/d 

        x4=x2-h*(y1-y0)/d
        y4=y2 h*(x1-x0)/d
        
        return (x3, y3, x4, y4)
  

Давайте протестируем это (визуально), построив график

 # intersection circles
x0, y0 = 0, 0
r0 = 5
x1, y1 = 2, 2
r1 = 5

# intersecting with (x1, y1) but not with (x0, y0)
x2, y2 = -1,0
r2 = 2.5

circle1 = plt.Circle((x0, y0), r0, color='b', fill=False)
circle2 = plt.Circle((x1, y1), r1, color='b', fill=False)
circle3 = plt.Circle((x2, y2), r2, color='b', fill=False)

fig, ax = plt.subplots() 
ax.set_xlim((-10, 10))
ax.set_ylim((-10, 10))
ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)

intersections = get_intersections(x0, y0, r0, x1, y1, r1)
if intersections is not None:
    i_x3, i_y3, i_x4, i_y4 = intersections 
    plt.plot([i_x3, i_x4], [i_y3, i_y4], '.', color='r')
    
intersections = get_intersections(x0, y0, r0, x2, y2, r2)
if intersections is not None:
    i_x3, i_y3, i_x4, i_y4 = intersections 
    plt.plot([i_x3, i_x4], [i_y3, i_y4], '.', color='r')

intersections = get_intersections(x1, y1, r1, x2, y2, r2)
if intersections is not None:
    i_x3, i_y3, i_x4, i_y4 = intersections 
    plt.plot([i_x3, i_x4], [i_y3, i_y4], '.', color='r')

plt.gca().set_aspect('equal', adjustable='box')
  

Вывод:

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

Ответ №2:

Взгляните на то, что вы сгенерировали:

 new_center= random.randint(0, len(x_points))
x_offset = x_points[new_center]
y_offset = y_points[new_center]
new_circle(x_offset, y_offset)

# I'm sorting these for easier visualization
print(sorted(x_points))
print(sorted(x_points1))
  

Вывод:

 [-1.0, -0.9807852804032304, -0.9807852804032304, -0.9238795325112868,
 -0.9238795325112867, -0.8314696123025455, -0.8314696123025453, -0.7071067811865477,
 -0.7071067811865475, -0.5555702330196022, -0.555570233019602, -0.38268343236509034,
 -0.3826834323650897, -0.19509032201612866, -0.1950903220161282,
 -1.8369701987210297e-16, 6.123233995736766e-17, 0.1950903220161283,
 0.19509032201612833, 0.38268343236508984, 0.38268343236509, 0.5555702330196018
, 0.5555702330196023, 0.7071067811865474, 0.7071067811865476, 0.8314696123025452,
 0.8314696123025452, 0.9238795325112865, 0.9238795325112867, 0.9807852804032303,
 0.9807852804032304, 1.0, 1.0]

[-2.0, -1.9807852804032304, -1.9807852804032304, -1.923879532511287,
 -1.9238795325112867, -1.8314696123025453, -1.8314696123025453, -1.7071067811865477,
 -1.7071067811865475, -1.5555702330196022, -1.555570233019602, -1.3826834323650903,
 -1.3826834323650896, -1.1950903220161286, -1.1950903220161282, -1.0000000000000002,
 -0.9999999999999999, -0.8049096779838717, -0.8049096779838717, -0.6173165676349102,
 -0.6173165676349099, -0.44442976698039816, -0.4444297669803977, -0.29289321881345265,
 -0.2928932188134524, -0.16853038769745476, -0.16853038769745476,
 -0.07612046748871348, -0.07612046748871326, -0.01921471959676968,
 -0.01921471959676957, 0.0, 0.0]
  

Прежде всего, вы сгенерировали независимые списки координат; у вас нет точек в виде координированной пары любого вида.

Во-вторых, вы не перечислили все точки на окружности: вы не можете, поскольку это бесконечное множество. Вместо этого вы сгенерировали список (ну, по одному для x и y ) с равными интервалами, нет математических оснований ожидать, что у вас будет точное совпадение между любыми двумя такими координатами, не говоря уже о том, чтобы выбрать две точки на каждой окружности, которые точно совпадают. точки пересечения.

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

Ответ №3:

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

Из https://math.stackexchange.com/a/256123/647423 что вы можете сделать, так это получить линейное уравнение, связывающее x с y вдоль линии, проходящей через две точки пересечения:

 −2x(x1center−x2center)−2y(y1center−y2center) = (r1)^2−(r2)^2−((x1center)^2−(x2center)^2)−((y1center)^2−(y2center)^2).
  

Из этого вы получаете формулу для y в терминах x, затем подставляете y в одну из ваших формул окружности, чтобы получить квадратичное значение для x.
Если вы не хотите реализовывать решатель квадратных уравнений, вы можете использовать numpy.roots вот так:

 root_array = np.roots(quadratic_coeff, linear_coeff, constant_coef)
  

Ответ №4:

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

 import matplotlib.pyplot as plt
import math

def get_intersections(x0, y0, r0, x1, y1, r1):
    # circle 1: (x0, y0), radius r0
    # circle 2: (x1, y1), radius r1

    d=math.sqrt((x1-x0)**2   (y1-y0)**2)

    # non intersecting
    if d > r0   r1 :
        return {}
    # One circle within other
    if d < abs(r0-r1):
        return {}
    # coincident circles
    if d == 0 and r0 == r1:
        return {}
    else:
        a=(r0**2-r1**2 d**2)/(2*d)
        h=math.sqrt(r0**2-a**2)
        x2=x0 a*(x1-x0)/d   
        y2=y0 a*(y1-y0)/d   
        x3=x2 h*(y1-y0)/d     
        y3=y2-h*(x1-x0)/d 
        x4=x2-h*(y1-y0)/d
        y4=y2 h*(x1-x0)/d
        return x3, y3, x4, y4

# intersection circles
x0, y0 = 0, 0
r0 = 5
x1, y1 = 2, 2
r1 = 5

# intersecting with (x1, y1) but not with (x0, y0)
x2, y2 = -1,0
r2 = 2.5

circle1 = plt.Circle((x0, y0), r0, color='b', fill=False)
circle2 = plt.Circle((x1, y1), r1, color='b', fill=False)
circle3 = plt.Circle((x2, y2), r2, color='b', fill=False)

fig = plt.figure(figsize = (10, 10)) 
plt.grid(True)
ax = fig.add_subplot(111)

ax.set_xlim((-10, 10))
ax.set_ylim((-10, 10))
ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)

intersections1 = get_intersections(x0, y0, r0, x1, y1, r1)
print(intersections1)
if len(intersections1) > 0:
    print(intersections3)
    i_x3, i_y3, i_x4, i_y4 = intersections1 
    #plt.plot([i_x3, i_x4], [i_y3, i_y4], 'o', color='r')
    ax.scatter([i_x3, i_x4],[i_y3, i_y4] ,marker ='X',s=300,alpha=1)

intersections2 = get_intersections(x0, y0, r0, x2, y2, r2)
print(intersections2)
if len(intersections2) > 0:
    i_x3, i_y3, i_x4, i_y4 = intersections2 
    plt.plot([i_x3, i_x4], [i_y3, i_y4], 'o', color='r')
    ax.scatter([i_x3, i_x4],[i_y3, i_y4] ,marker ='X',s=300,alpha=1)

intersections3 = get_intersections(x1, y1, r1, x2, y2, r2)

if len(intersections3) > 0:
    print(intersections3)
    i_x3, i_y3, i_x4, i_y4 = intersections3 
    #plt.plot([i_x3, i_x4], [i_y3, i_y4], 'o', color='r')
    ax.scatter([i_x3, i_x4],[i_y3, i_y4] ,marker ='X',s=300,alpha=1)
plt.gca().set_aspect('equal', adjustable='box')
  

Результат приведен на изображении:

https://i.stack.imgur.com/KAYeC.png

Ответ №5:

Неправильный язык для математики / геометрии. Вот как это выглядит на более подходящем языке (WL)

  Circle @@@ Thread @ {RandomReal[{-1,1},{3,2}], RandomReal[{.5,1},3]} // 
 Graphics[{
    #, Red, 
    RegionIntersection @@@ #~Subsets~{2}
 }]amp;
  

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти чья медаль по номеру
  • Как найти товар по фото через телефон
  • Как найти компанию для поездки за границу
  • Как составить уравнение множественной регрессии
  • Как найти няню во фрязино

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии