tabitaCatalan / python.ForceBundle

Python implementation of Force-Directed Edge Bundling for Graph Visualization
GNU General Public License v3.0
2 stars 0 forks source link

Dudas con la Compatibilidad por visibilidad #3

Open tabitaCatalan opened 3 years ago

tabitaCatalan commented 3 years ago

Compatibilidad por visibilidad

La idea que que las aristas que no se ven deberían ser menos compatibles, definiendo la visibilidad como una banda perpendicular a la arista, como se ve en la imagen.

image

Se calcula una arista I, que es la proyección de la arista Q sobre la recta definida por P. Según yo se necesitan las pendientes, tanto de la arista Q como de la arista P para definirla, así que este trozo de código me generó dudas.

@jit(Point.class_type.instance_type(Point.class_type.instance_type, Edge.class_type.instance_type), nopython=True, fastmath=FASTMATH, nogil=True)
def project_point_on_line(point, edge):
    L = math.sqrt(math.pow(edge.target.x - edge.source.x, 2) + math.pow((edge.target.y - edge.source.y), 2))
    r = ((edge.source.y - point.y) * (edge.source.y - edge.target.y) - (edge.source.x - point.x) * (edge.target.x - edge.source.x)) / math.pow(L, 2)
    return Point((edge.source.x + r * (edge.target.x - edge.source.x)),
                 (edge.source.y + r * (edge.target.y - edge.source.y)))

Mis dudas aumentaron al ver en la función edge_visibility estas dos líneas:

I0 = project_point_on_line(oedge.source, edge)
I1 = project_point_on_line(oedge.target, edge)

La pendiente de oedge no está jugando ningún rol, lo que es sumamente sospechoso.

tabitaCatalan commented 3 years ago

Cálculo de la compatibilidad por visibilidad

En el diagrama de abajo se ve la forma en que se debería calcular: Visibilidad