JavaScript - extender linea hasta los bordes de un cuadrado

   
Vista:

extender linea hasta los bordes de un cuadrado

Publicado por levi (2 intervenciones) el 11/07/2016 11:47:28
Hola que tal. Vereis soy nuevo en este foro y me gustaria pediros ayuda con un codigo que no consigo que funcione del todo.

El caso esque estoy intentando montar un codigo que extienda las medidas de una linea hasta que toque los bordes de un rectangulo que contiene la linea.

No sabia como hacer la formula asi que busque informacion en internet y encontre un codigo en pyton que supuestamente hacia lo que queria y lo traduje a javascript.

El codigo esta en el siguiente enlace:

Si quereis ver exactamente lo que quiero hacer en el enlace hay una imagen que lo explica.

http://stackoverflow.com/questions/7237004/extending-a-line-segment-to-fit-into-a-bounding-box

Y es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def extend(xmin, ymin, xmax, ymax, x1, y1, x2, y2):
    if y1 == y2:
        return (xmin, y1, xmax, y1)
    if x1 == x2:
        return (x1, ymin, x1, ymax)
 
    # based on (y - y1) / (x - x1) == (y2 - y1) / (x2 - x1)
    # => (y - y1) * (x2 - x1) == (y2 - y1) * (x - x1)
    y_for_xmin = y1 + (y2 - y1) * (xmin - x1) / (x2 - x1)
    y_for_xmax = y1 + (y2 - y1) * (xmax - x1) / (x2 - x1)
 
    x_for_ymin = x1 + (x2 - x1) * (ymin - y1) / (y2 - y1)
    x_for_ymax = x1 + (x2 - x1) * (ymax - y1) / (y2 - y1)
 
    if ymin <= y_for_xmin <= ymax:
        if xmin <= x_for_ymax <= xmax:
            return (xmin, y_for_xmin, x_for_ymax, ymax)
        if xmin <= x_for_ymin <= xmax:
            return (xmin, y_for_xmin, x_for_ymin, ymin)
    if ymin <= y_for_xmax <= ymax:
        if xmin <= x_for_ymin <= xmax:
            return (x_for_ymin, ymin, xmax, y_for_xmax)
        if xmin <= x_for_ymax <= xmax:
            return (x_for_ymax, ymax, xmax, y_for_xmax)
 
def test():
    assert (2, 1,  2, 5) == extend(1, 1,  5, 5,  2, 3,  2, 4)
    assert (1, 2,  4, 5) == extend(1, 1,  5, 5,  2, 3,  3, 4)
    assert (1, 3,  5, 3) == extend(1, 1,  5, 5,  3, 3,  4, 3)
    assert (1, 1,  5, 5) == extend(1, 1,  5, 5,  2, 2,  3, 3)
    assert (3, 1,  5, 5) == extend(1, 1,  5, 5,  3.5, 2,  4, 3)
 
if __name__ == '__main__':
    test()

El codigo necesita las coordenadas del rectangulo (x e y minima y maxima) y las coordenadas de los puntos que forman la linea (x e y del punto 1 y punto 2)

El codigo devuelve un array de las nuevas coordenadas de los puntos.

Ahora os cuento el problema.

Si la linea es horizontal o vertical todo funciona correctamente, pero si la linea es diagonal hay veces que funciona y otras no me devuelve valores (con lo que deduzco que hay alguna condicion que no se esta cumpliendo y no hace return de ningun valor)

La linea la genero aleatoriamente (siempre dentro del rectangulo) con lo que el punto 1 puede estar tanto a la derecha de la linea como a la izquierda, arriba o abajo) Lo comento porque no se si influye (yo diria que no)

Y esa es toda la informacin que puedo daros ya que no entiendo muy bien el funcionamiento del codigo.

Os pongo el codigo javascript por si fuera de utilidad:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function extendline(xmin, ymin, xmax, ymax, x1, y1, x2, y2) {
    //alert("function extendline")
    var points = [];
 
    if (y1 == y2) {
        //return (xmin, y1, xmax, y1)
        points[0] = xmin;
        points[1] = y1;
        points[2] = xmax;
        points[3] = y1;
        //alert("y1 == y2" + "   |   " + "points: " + points)
        return points
    }
    if (x1 == x2) {
        //return (x1, ymin, x1, ymax)
        points[0] = x1;
        points[1] = ymin;
        points[2] = x1;
        points[3] = ymax;
        //alert("x1 == x2" + "   |   " + "points: " + points)
        return points
    }
 
    y_for_xmin = y1 + (y2 - y1) * (xmin - x1) / (x2 - x1)
    y_for_xmax = y1 + (y2 - y1) * (xmax - x1) / (x2 - x1)
 
    //alert("y_for_xmin: " + y_for_xmin)
    //alert("y_for_xmax: " + y_for_xmax)
 
    x_for_ymin = x1 + (x2 - x1) * (ymin - y1) / (y2 - y1)
    x_for_ymax = x1 + (x2 - x1) * (ymax - y1) / (y2 - y1)
 
    //alert("x_for_ymin: " + x_for_ymin)
    //alert("x_for_ymax: " + x_for_ymax)
 
     if(ymin <= y_for_xmin && y_for_xmin <= ymax) {
        //alert("ymin <= y_for_xmin <= ymax")
        if (xmin <= x_for_ymax && x_for_ymax <= xmax) {
            //return (xmin, y_for_xmin, x_for_ymax, ymax)
            points[0] = xmin;
            points[1] = y_for_xmin;
            points[2] = x_for_ymax;
            points[3] = ymax;
            //alert("xmin <= x_for_ymax <= xmax" + "   |   " + "points: " + points)
            return points
        }
        if (xmin <= x_for_ymin && x_for_ymin <= xmax) {
            //return (xmin, y_for_xmin, x_for_ymin, ymin)
            points[0] = xmin;
            points[1] = y_for_xmin;
            points[2] = x_for_ymin;
            points[3] = ymin;
            //alert("xmin <= x_for_ymin <= xmax" + "   |   " + "points: " + points)
            return points
        }
    }
    if (ymin <= y_for_xmax && y_for_xmax <= ymax) {
        if (xmin <= x_for_ymin && x_for_ymin<= xmax) {
            //return (x_for_ymin, ymin, xmax, y_for_xmax)
            points[0] = x_for_ymin;
            points[1] = ymin;
            points[2] = xmax;
            points[3] = y_for_xmax;
            //alert("ymin <= y_for_xmax <= ymax" + "   |   " + "points: " + points)
            return points
        }
        if (xmin <= x_for_ymax && x_for_ymax <= xmax) {
            //return (x_for_ymax, ymax, xmax, y_for_xmax)
            points[0] = x_for_ymax;
            points[1] = ymax;
            points[2] = xmax;
            points[3] = y_for_xmax;
            //alert("xmin <= x_for_ymax <= xmax" + "   |   " + "points: " + points)
            return points
        }
    }
}


Agradeceria mucho vuestra ayuda por favor. La verdad que no soy programador (solo aficionado) y me cuesta mucho armar estos codigos.

Muchisimas gracias de antemano.

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

extender linea hasta los bordes de un cuadrado

Publicado por levi (2 intervenciones) el 11/07/2016 14:46:03
Supongo que es una formula de geometria relativamente sencilla.

Si alguien controla de estos temas y es tan amable de explicarme como calcularlo podria intentar armar el codigo desde cero.

E problema es que he buscado informacion y no he encontrado.

El codigo de arriba casi funciona, solo que hay unos casos en los que devuelve undefined y no consigo entender la logica de como funciona para poder encontrar la solucion.

Muchas gracias por vuestro tiempo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar