Intersección 1-D de líneas dadas los puntos de inicio y final -- python campo con comparative-review campo con interval campo con coordinate-system camp codereview Relacionados El problema

1-D intersection of lines given begin and end points


2
vote

problema

Español

Tengo una pregunta bastante básica aquí: quiero encontrar si dos líneas en un plano 1-D se intersecan. Sé de dos formas simples de resolver esto, pero quería saber si Python tiene una manera más elegante de resolver esto.

  x = [1, 10] # 1 = begin, 10 = end y = [15, 20] z = [5, 12]  #Method 1: Works. Is quick. Lots of typing. def is_intersect_1(a, b):     bool_check = False     if a[0] <= b[0] <= a[1] or      a[0] <= b[1] <= a[1] or      b[0] <= a[0] <= b[1] or      b[0] <= a[1] <= b[1]:         bool_check = True     return bool_check  is_intersect_1(x,y) # False is_intersect_1(x,z) # True  #Method 2: Quicker to write. Simpler to read. Uses more memory and is slower.  def is_intersect_2(a, b):     bool_check = False     if set(range(a[0], a[1]+1)).intersection(set(range(b[0], b[1])):         bool_check = True     return bool_check  is_intersect_2(x,y) # False is_intersect_2(x,z) # True   
Original en ingles

I have a fairly basic question here: I want to find if two lines on a 1-D plane intersect. I know of two simple ways to solve this, but I wanted to know if Python has a more elegant way to solve this.

x = [1, 10] # 1 = begin, 10 = end y = [15, 20] z = [5, 12]  #Method 1: Works. Is quick. Lots of typing. def is_intersect_1(a, b):     bool_check = False     if a[0] <= b[0] <= a[1] or \     a[0] <= b[1] <= a[1] or \     b[0] <= a[0] <= b[1] or \     b[0] <= a[1] <= b[1]:         bool_check = True     return bool_check  is_intersect_1(x,y) # False is_intersect_1(x,z) # True  #Method 2: Quicker to write. Simpler to read. Uses more memory and is slower.  def is_intersect_2(a, b):     bool_check = False     if set(range(a[0], a[1]+1)).intersection(set(range(b[0], b[1])):         bool_check = True     return bool_check  is_intersect_2(x,y) # False is_intersect_2(x,z) # True 
           

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 
  • usando Booleans explícitos es un Antipattern común:

      check = False if condition:     check = True return check   

    es equivalente a mucho más transparente (y preferible)

      return condition   
  • Los segmentos no se intersecan si a se encuentra completamente a la izquierda, o completamente a la derecha de b . Suponiendo que los segmentos sean ordenados:

      def is_intersect_3(a, b):     return not (a[1] < b[0] or a[0] > b[1])   
  • is_intersect_2 falla mal en los flotadores

 
  • Using explicit booleans is a common antipattern:

    check = False if condition:     check = True return check 

    is equivalent to much more transparent (and preferable)

    return condition 
  • Segments do not intersect if a lies completely to the left, or completely to the right of b. Assuming that segments are themselves sorted:

    def is_intersect_3(a, b):     return not (a[1] < b[0] or a[0] > b[1]) 
  • is_intersect_2 fails badly on floats

 
 

Relacionados problema

1  Calculadora de vector simple [cerrado]  ( Simple vector calculator ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

4  Implementación de Quadtree C ++  ( Quadtree c implementation ) 
Recientemente creé una implementación de Quadtree en C ++. Varía ligeramente de la mayoría de las implementaciones. En lugar de almacenar elementos, solo or...

1  Funciones de comparación para 2D puntos [cerrados]  ( Comparison functions for 2d points ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

10  Encuentra el hogar visible no visible más cercano  ( Find the closest unvisited visible home ) 
Estoy escribiendo un juego más alto de 2D donde realizo una gran cantidad de búsquedas "más cercanas" entre un punto y todo el resto de los puntos. En este ...

5  Fórmula Haversine en Clojure  ( Haversine formula in clojure ) 
Implementé el fórmula haversine para calcular la distancia entre dos (latitud , longitud) coordenadas. Me preguntaba si se ve natural para los programador...

5  Clase de vectores matemáticas fuertemente planteladas  ( Heavily templated mathematical vector class ) 
Comencé a escribir una biblioteca para el álgebra lineal para uso personal, pero también para la revitilización de mi C ++. A continuación se muestra la pri...

21  Conversión de coordenadas polares a coordenadas rectangulares  ( Converting from polar coordinates to rectangular coordinates ) 
Este es un rendimiento crítico. Medí y determiné que el uso de 99887766655443319 es más rápido que usar el método 99887766655443320 . Soy consciente de q...

17  Implementación vectorial (física)  ( Vector physics implementation ) 
Recientemente comencé a aprender Java, y decidí implementar un sistema de vectores básico para otro sistema de partículas que estaba construyendo. join()9 ...

3  Clases NODE2D y NODE3D implementadas utilizando un decorador compartido  ( Node2d and node3d classes implemented using a shared decorator ) 
Editar: He hecho otro Ir a esto usando Metaclasses aquí . Creo que es un enfoque mucho mejor. Tengo las siguientes clases. validator es un decorador que ...

14  Comparación con el infinito al verificar si un punto está por encima de una línea  ( Comparison to infinity when checking if a point is above a line ) 
Tengo una función que se llama en un bucle apretado. He perfilado mi código y aquí es donde está mi cuello de botella más grande. La función es bastante simpl...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos