Ho un poligono composto da molti punti. Voglio trovare l'intersezione del poligono e un cerchio. Fornendo il centro del cerchio di [x0, y0] e il raggio di r0, ho scritto una funzione approssimativa per risolvere semplicemente l'equazione quadratica del cerchio e una linea. Ma che dire dell'efficienza di trovare l'intersezione di ogni segmento di linea del poligono uno ad uno? Esiste un modo più efficiente?Qual è il modo più efficace per trovare l'intersezione di una linea e un cerchio in python?
So che sympy fornisce già la funzione per ottenere le intersezioni di diverse geometrie. Ma anche e l'efficienza della libreria esterna come sympy rispetto a calcolarla con la mia funzione, se voglio occuparmi di molti poligoni?
def LineIntersectCircle(p,lsp,lep):
# p is the circle parameter, lsp and lep is the two end of the line
x0,y0,r0 = p
x1,y1 = lsp
x2,y2 = esp
if x1 == x2:
if abs(r0) >= abs(x1 - x0):
p1 = x1, y0 - sqrt(r0**2 - (x1-x0)**2)
p2 = x1, y0 + sqrt(r0**2 - (x1-x0)**2)
inp = [p1,p2]
# select the points lie on the line segment
inp = [p for p in inp if p[1]>=min(y1,y2) and p[1]<=max(y1,y2)]
else:
inp = []
else:
k = (y1 - y2)/(x1 - x2)
b0 = y1 - k*x1
a = k**2 + 1
b = 2*k*(b0 - y0) - 2*x0
c = (b0 - y0)**2 + x0**2 - r0**2
delta = b**2 - 4*a*c
if delta >= 0:
p1x = (-b - sqrt(delta))/(2*a)
p2x = (-b + sqrt(delta))/(2*a)
p1y = k*x1 + b0
p2y = k*x2 + b0
inp = [[p1x,p1y],[p2x,p2y]]
# select the points lie on the line segment
inp = [p for p in inp if p[0]>=min(x1,x2) and p[0]<=max(x1,x2)]
else:
inp = []
return inp
mi sembra che consideri le intersezioni del cerchio con l'intera linea, non solo il segmento di linea tra i due punti dati. È questo che vuoi? –
L'unica ottimizzazione possibile che posso pensare riguarda l'uso di una sorta di partizione spaziale. Per esempio. un quad-albero. Ma c'è un costo non banale associato al calcolo di questi, quindi dipende dal problema più grande se ciò è utile o meno. – deets
@ EmanuelePaolini, grazie. Ho modificato la sceneggiatura in base alla tua preoccupazione. – xibinke