Source code for pyleecan.Functions.Geometry.inter_line_circle

# -*- coding: utf-8 -*-
from numpy import sqrt, abs as np_abs


[docs]def inter_line_circle(Z1, Z2, R, Zc=0): """INTER_LINE_CIRCLE find the intersection between a circle of center Zc and radius r with a line defined by two points Parameters ---------- Z1 : complex Complex coordinate of a point on the line Z2 : complex Complex coordinate of another point on the line R : float Radius of the circle [m] Zc : complex Complex coordinate of the center Returns ------- Zlist: list List of the complex coordinates of the intersection """ # Set the coordinate system on the circle center if np_abs(Zc) > 1e-6: Z1 = Z1 - Zc Z2 = Z2 - Zc else: Zc = 0 x1 = Z1.real y1 = Z1.imag x2 = Z2.real y2 = Z2.imag dx = x2 - x1 dy = y2 - y1 dr = sqrt(dx ** 2 + dy ** 2) D = x1 * y2 - x2 * y1 delta = R ** 2 * dr ** 2 - D ** 2 if delta < 0: # 0 point return list() elif delta == 0: # 1 point(tangent) return [(D * dy - 1j * D * dx) / dr ** 2 + Zc] else: # 2 points if dy < 0: xs1 = (D * dy - dx * sqrt(delta)) / dr ** 2 xs2 = (D * dy + dx * sqrt(delta)) / dr ** 2 else: xs1 = (D * dy + dx * sqrt(delta)) / dr ** 2 xs2 = (D * dy - dx * sqrt(delta)) / dr ** 2 ys1 = (-D * dx + abs(dy) * sqrt(delta)) / dr ** 2 ys2 = (-D * dx - abs(dy) * sqrt(delta)) / dr ** 2 return [xs1 + 1j * ys1 + Zc, xs2 + 1j * ys2 + Zc]