πŸ” Как Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС окруТностСй Π² Python βš™οΈ

Как Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС окруТностСй Π² Python?

Для нахоТдСния пСрСсСчСния окруТностСй Π² Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


import math

def intersect_circle(circle1, circle2):
    x1, y1, r1 = circle1
    x2, y2, r2 = circle2
    
    # ВычислСниС расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ окруТностСй
    d = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
    
    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия, ΠΊΠΎΠ³Π΄Π° окруТности Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ
    if d > r1 + r2:
        return "ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ"
    
    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ
    if d < abs(r1 - r2):
        return "Одна ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ"
    
    # НахоТдСниС ΠΏΠ»ΠΎΡ‰Π°Π΄Π΅ΠΉ смСТных Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²
    a = (r1**2 - r2**2 + d**2) / (2 * d)
    h = math.sqrt(r1**2 - a**2)
    
    # НахоТдСниС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ‚ΠΎΡ‡Π΅ΠΊ пСрСсСчСния
    x3 = x1 + a * (x2 - x1) / d
    y3 = y1 + a * (y2 - y1) / d
    
    x4 = x3 + h * (y2 - y1) / d
    y4 = y3 - h * (x2 - x1) / d
    
    x5 = x3 - h * (y2 - y1) / d
    y5 = y3 + h * (x2 - x1) / d
    
    return (x4, y4), (x5, y5)

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:
circle1 = (0, 0, 3)
circle2 = (4, 0, 4)
intersection_points = intersect_circle(circle1, circle2)
print("Π’ΠΎΡ‡ΠΊΠΈ пСрСсСчСния окруТностСй:", intersection_points)

Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ ΠΈ Ρ‚Ρ€ΠΈΠ³ΠΎΠ½ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ для нахоТдСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ‚ΠΎΡ‡Π΅ΠΊ пСрСсСчСния Π΄Π²ΡƒΡ… окруТностСй. Ѐункция intersect_circle ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ circle1 ΠΈ circle2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ†Π΅Π½Ρ‚Ρ€Ρ‹ ΠΈ радиусы окруТностСй. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ пСрСсСчСния Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ.

НадСюсь, это ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ! Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ вопросы, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС окруТностСй Π² Python

ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ окруТностСй - это Ρ‚ΠΎΡ‡ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π²Π΅ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ окруТности ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ. Π’ Python ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим нСсколько ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ².

1. ГСомСтричСский ΠΌΠ΅Ρ‚ΠΎΠ΄

Один ΠΈΠ· самых простых способов Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС окруТностСй - это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ гСомСтричСский ΠΌΠ΅Ρ‚ΠΎΠ΄. Для этого Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния Π΄Π²ΡƒΡ… окруТностСй.


import math

def find_circle_intersection(x1, y1, r1, x2, y2, r2):
    d = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
    if d > r1 + r2:
        return "ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ"
    elif d < abs(r1 - r2):
        return "Одна ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ"
    elif d == 0 and r1 == r2:
        return "ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚"
    else:
        a = (r1**2 - r2**2 + d**2) / (2 * d)
        h = math.sqrt(r1**2 - a**2)
        x3 = x1 + a * (x2 - x1) / d
        y3 = y1 + a * (y2 - y1) / d
        x4 = x3 + h * (y2 - y1) / d
        y4 = y3 - h * (x2 - x1) / d
        x5 = x3 - h * (y2 - y1) / d
        y5 = y3 + h * (x2 - x1) / d
        return [(x4, y4), (x5, y5)]
    

Ѐункция find_circle_intersection ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ x1, y1, r1, x2, y2, r2, Π³Π΄Π΅ (x1, y1) ΠΈ (x2, y2) - ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ² окруТностСй, Π° r1 ΠΈ r2 - радиусы окруТностСй. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ‚ΠΎΡ‡Π΅ΠΊ пСрСсСчСния ΠΈΠ»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС, Ссли окруТности Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ.

2. ИспользованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SymPy

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ способом Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ являСтся использованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SymPy, которая прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для символьного матСматичСского модСлирования.


from sympy import symbols, Eq, solve

def find_circle_intersection(x1, y1, r1, x2, y2, r2):
    x, y = symbols('x y')
    eq1 = Eq((x - x1)**2 + (y - y1)**2, r1**2)
    eq2 = Eq((x - x2)**2 + (y - y2)**2, r2**2)
    intersection = solve((eq1, eq2), (x, y))
    if len(intersection) == 2:
        return intersection
    else:
        return "ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ"
    

Ѐункция find_circle_intersection ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ symbols, Eq ΠΈ solve ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SymPy, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ систСму ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ для нахоТдСния Ρ‚ΠΎΡ‡Π΅ΠΊ пСрСсСчСния окруТностСй.

3. ИспользованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NetworkX

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… окруТностСй ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Ρ€Π°Ρ„ пСрСсСчСний, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ NetworkX.


import networkx as nx

def find_circle_intersection(circles):
    graph = nx.Graph()
    for i in range(len(circles)):
        for j in range(i+1, len(circles)):
            x1, y1, r1 = circles[i]
            x2, y2, r2 = circles[j]
            d = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
            if d <= r1 + r2:
                graph.add_edge(i, j)
    connected_components = nx.connected_components(graph)
    intersection_points = []
    for component in connected_components:
        if len(component) > 1:
            for i in component:
                x, y, r = circles[i]
                intersection_points.append((x, y, r))
    return intersection_points
    

Ѐункция find_circle_intersection ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список окруТностСй circles, Π³Π΄Π΅ каТдая ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ прСдставлСна Ρ‚Ρ€ΠΎΠΉΠΊΠΎΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ (x, y, r). Она строит Π³Ρ€Π°Ρ„ пСрСсСчСний ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ связности, содСрТащиС Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ окруТности. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ связности функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Ρ‚ΠΎΡ‡Π΅ΠΊ пСрСсСчСния.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли нСсколько способов нахоТдСния пСрСсСчСния окруТностСй Π² Python. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для вашСй Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Алгоритмы. ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ окруТностСй

4.3 ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ². "ПоколСниС Python": курс для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. ΠšΡƒΡ€Ρ Stepik

15 Π—Π°Π΄Π°Ρ‡Π°: Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΈ Π΄Π»ΠΈΠ½Ρƒ окруТности ΠΊΡ€ΡƒΠ³Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Python

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ элСмСнта Π² словарС Python? 🧐

🐍 РаскладываСм Π½Π° ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈ: простой способ Π² Python

πŸ” Как Π΄ΠΎΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ модСль Python: Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ руководство

πŸ” Как Π½Π°ΠΉΡ‚ΠΈ пСрСсСчСниС окруТностСй Π² Python βš™οΈ

πŸ”Ž Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ строку Ρ†ΠΈΡ„Ρ€ΠΎΠΉ Π² Python: простой способ ΠΈ совСты

πŸ’Œ Как ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС Π² Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠŸΠΈΡ‚ΠΎΠ½: пошаговая инструкция 🐍

πŸ” Как ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ timedelta Π² Python? ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…!