una saber rectas que punto intersectan interseccion hallar geometria funcion entre corte cortan como analitica c# .net graphics geometry gdi+

c# - saber - punto de interseccion de una funcion



¿Cómo determino el punto de intersección de dos líneas en GDI+? (3)

Si gira su marco de referencia para alinearlo con el primer segmento de línea (entonces el origen es ahora el comienzo de la primera línea, y el vector para la primera línea se extiende a lo largo del eje X) la pregunta es: ¿dónde está la segunda línea? golpea el eje X en el nuevo sistema de coordenadas. Esta es una pregunta mucho más fácil de responder. Si la primera línea se llama A y está definida por AO como el origen de la línea y ''AV'' como el vector de la línea, de modo que AO + AV es el punto final de la línea. El marco de referencia puede ser definido por la matriz:

| A.V.X A.V.Y A.O.X | M = | A.V.Y -A.V.X A.O.Y | | 0 0 1 |

En coordenadas homogéneas, esta matriz proporciona una base para el marco de referencia que mapea la línea A a 0 a 1 en el eje X. Ahora podemos definir la línea transformada B como:

C.O = M*(B.O) C.V = M*(B.O + B.V) - C.O

Donde el operador * definió correctamente las coordenadas homogéneas (una proyección de 3 espacios en 2 espacios en este caso). Ahora todo lo que queda es comprobar y ver dónde C golpea el eje X, que es lo mismo que resolver el lado Y de la ecuación paramétrica de C para t :

C.O.Y + t * C.V.Y = 0 -C.O.Y t = -------- C.V.Y

Si t está en el rango de 0 a 1, entonces C golpea el eje X dentro del segmento de línea. El lugar donde aterriza en el eje X viene dado por el lado X de la ecuación paramétrica para C :

x = C.O.X + t * C.V.X

Si x está en el rango de 0 a 1, entonces la intersección está en el segmento de línea A Entonces podemos encontrar el punto en el sistema de coordenadas original con:

p = A.O + A.V * x

Por supuesto, debe verificar primero si el segmento de línea tiene longitud cero. Además, si CVY = 0 tiene segmentos de línea paralelos. Si CVX también es cero, tiene segmentos de línea colineales.

Estoy usando .NET para hacer una aplicación con una superficie de dibujo, similar a Visio. La interfaz de usuario conecta dos objetos en la pantalla con Graphics.DrawLine. Esta sencilla implementación funciona bien, pero a medida que la superficie se vuelve más compleja, necesito una forma más robusta de representar los objetos. Uno de estos requisitos sólidos es determinar el punto de intersección para dos líneas, por lo que puedo indicar la separación mediante algún tipo de gráfico.

Entonces mi pregunta es, ¿alguien puede sugerir una manera de hacer esto? Tal vez con una técnica diferente (tal vez GraphViz) o un algoritmo?



La representación de líneas por y = mx + c es problemática para gráficos de computadora, porque las líneas verticales requieren que m sea infinita.

Además, las líneas en gráficos por computadora tienen un punto inicial y un punto final, a diferencia de las líneas matemáticas que son infinitas en extensión. Por lo general, a uno solo le interesa un cruce de líneas si el punto de cruce se encuentra en ambos segmentos de línea en cuestión.

Si tiene dos segmentos de línea, uno de los vectores x1 a x1 + v1, y uno de los vectores x2 a x2 + v2, defina:

a = (v2.v2 v1.(x2-x1) - v1.v2 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2) b = (v1.v2 v1.(x2-x1) - v1.v1 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)

donde para los vectores p = (px, py), q = (qx, qy), pq es el producto de puntos (px * qx + py * qy). Primero compruebe si (v1.v1) (v2.v2) = (v1.v2) ^ 2 - si es así, las líneas son paralelas y no se cruzan.

Si no son paralelas, entonces si 0 <= a <= 1 y 0 <= b <= 1, el punto de intersección se encuentra en ambos segmentos de línea, y está dado por el punto

x1 + a * v1

Editar La derivación de las ecuaciones para a y b es la siguiente. El punto de intersección satisface la ecuación vectorial

x1 + a*v1 = x2 + b*v2

Al tomar el producto escalar de esta ecuación con v1 , y con v2 , obtenemos dos ecuaciones:

v1.v1*a - v2.v1*b = v1.(x2-x1) v1.v2*a - v2.v2*b = v2.(x2-x1)

que forman dos ecuaciones lineales para a y b. Resolver este sistema (multiplicando la primera ecuación por v2.v2 y el segundo por v1.v1 y restando, o de lo contrario) da las ecuaciones para a y b.