2009-08-29 11 views
10

Dada una línea con el primer punto final P (x1, y1), se desconoce otro punto final, se cruzan con un círculo que se encuentra en el origen con radio R en solo un punto (tangente) T (x2, y2). Alguien sabe cómo obtener el punto T? ¡Gracias por adelantado!¿Busca un punto tangente en el círculo?

+0

¿cómo es una línea si solo tiene un punto final dado? – obelix

+0

tiene dos puntos finales diferentes porque sabe que la línea es tangente. – andandandand

+1

dmindreader realmente entiendes mi punto. Gracias. –

Respuesta

1

Usa las coordenadas x, y de las ecuaciones que se cruzan (la del círculo y la de la línea). Ese es el punto.

Si solo tiene un punto final desde el que dibujar la línea, obtendrá dos puntos diferentes, ya que habrá dos líneas tangentes diferentes, una arriba y otra abajo.

9

Tome R como el radio del círculo y D la distancia desde el punto externo al centro del círculo de manera que D > R.

La línea tanget hace y el ángulo de \alpha con la línea que conecta el punto externo y el centro, donde

\alpha = arcsin(R/D) 

La línea que conecta el punto externo (P) y el centro (C) forma un ángulo con la horizontal de

\beta = arctan((C_y - P_y)/(C_x - P_x)) 

que le da el ángulo de la tangente con la horizontal como

\theta = \beta +/- \alpha 

Tenga en cuenta la ambigüedad.

La longitud del segmento tangente es

L = sqrt(D^2 - R^2) 

que es todo lo que necesita.

+1

** @ HanWu: ** Al dibujar una imagen y verificarme, todavía obtengo 'arcsin'. Utilizaría 'arccos' para el ángulo entre la línea de conexión (CP) y el radio (CT). – dmckee

+0

arcsin es correcto: sine (alfa) = opuesto (R)/hipotenusa (D) – Argalatyr

+0

\ alpha = arcsin (R/D) debería ser \ alpha = arccos (R/D) –

0

Otra solución; menos elegante que dmindreader`s, pero tal vez más simple de entender:

Usted sabe que el punto T está en el círculo y que la línea OT es perpendicular a la línea PT

que le da

abs(O - T) = R 
dotProduct(O - T, P - T) = 0 
32

Dada una línea con el primer punto final P (x1, y1) se desconoce otro punto final, se cruzan con un círculo que se encuentra en el origen con radio R en solo un punto (tangente) T (x2, y2). Alguien sabe cómo obtener el punto T?

Algunas de las otras soluciones parecen un poco exageradas. Creo que la forma más simple es solo notar que este es un triángulo rectángulo, con los vértices P, T y O (el origen). El ángulo PTO es el ángulo recto, porque una línea tangente siempre está en ángulo recto con un radio.

Usted conoce la longitud de TO porque es de longitud r y tiene un vértice en el origen; usted sabe OP porque sabe dónde O y P es. Dado dos lados de un triángulo rectángulo, es fácil encontrar la longitud y dirección del tercer lado. Esto es tarea, entonces dejaré el resto como ejercicio para el lector.

    __...------__ T(x2, y2)      
       _.-''    -(+) 
      ,-'     |----    
      ,'      |  ---- 
     ,'      |  ' ---- 
    /      |   `  ----  
    /      |   `.  ---- 
    /      |    \   ---- 
    |      |    |    ---- 
    |      |     |     ---- 
    |      |     |      ---- 
    |     (+)---------------------------------------------(+) P (x1,y1) 
    |          .'   
    |     O     |   
    |          .'   
     \         /   
     \         ,'   
     `        /   
     '.       ,'    
      '-.      _,'    
       '-._    _,(+) T'(x3, y3)     
        '`--......---'      

Hay dos posibles direcciones para TO, desde el punto T' es también un punto de tangencia válida, por lo que tendrá dos triángulos congruentes.

+18

+1 para el arte ascii! – ThibThib

+1

Esto se conoce como [el teorema de Thales] (http://en.wikipedia.org/wiki/Thales%27_theorem). – JCM

+0

@JCM No veo cómo es el teorema de Thale. Thale solo indicaría que 'OP' es el diámetro del circunferencia circunscrita para 'OPT'. –

2

No es obvio para mí que esto sea tarea, pero sí me gusta la intuición de que se define un triángulo rectángulo. Aun así, habrá algo de álgebra con esa solución.

Otro enfoque que parece viable es simplemente definir el problema como la solución de dos ecuaciones en dos incógnitas. Es decir, la ecuación de un círculo, centrado en (0,0), con un radio R es

x^2 + y^2 = R^2 

la ecuación de una línea que pasa por el punto (xt, yt), con pendiente (desconocido) S es

(y - yt) = S*(x - xt) 

Resuelve el sistema de dos ecuaciones para el punto de intersección. Dependiendo del valor de S, habrá cero, una o dos soluciones para este par de ecuaciones. También resultará que hay dos valores de S tales que la solución es única. Resuelva para esos dos valores de S que hacen que la solución sea única, luego recupere el punto de intersección (xt, yt). No examinaré en profundidad la solución real en caso de que sea una tarea, pero esa parte es álgebra trivial.

Mi punto es que este enfoque algebraico es otra forma de ver la solución del problema de la geometría computacional. Resalta un punto interesante en que hay dos líneas que se cruzan con el círculo en un punto tangente, y que cuando una línea se cruza en un punto tangente, hay un único punto de intersección.

Una falla de este enfoque es que falla debido a una singularidad para ALGUNOS problemas. Es decir, cuando la línea con pendiente S es vertical, entonces S no está definida. Otros enfoques que se basan en distancias simples y el teorema de Pitágoras son robustos para ese evento.

14

Todo lo que necesitas está en la respuesta de dmckee, pero si te importa un poco de código, verifica esta implementación usando el lienzo de Javascript y HTML.

ejemplo completo: http://jsfiddle.net/zxqCw/1/

// find tangents 
dx = cx - px; 
dy = cy - py; 
dd = Math.sqrt(dx * dx + dy * dy); 
a = Math.asin(radius/dd); 
b = Math.atan2(dy, dx); 

t = b - a 
ta = { x:radius * Math.sin(t), y:radius * -Math.cos(t) }; 

t = b + a 
tb = { x:radius * -Math.sin(t), y:radius * Math.cos(t) }; 
+0

¿Qué representa x: radius? – 130nk3r5

+1

radio = radio del círculo. ta = un objeto con propiedades xey (básicamente un punto). Para responder a su pregunta, x: radius no representa mucho por sí mismo. El código define el valor de ta.x donde x = radio * Math.sin (t). Asegúrese de consultar el jsfiddle para ver un ejemplo de trabajo. – imbrizi

+0

Estoy tratando de convertir esto a código C# ....y no pude entender qué es x: radius ... Pero leí el código incorrectamente ... Lo malentendí por ser un objeto x con radio de valor ... donde simplemente era el valor x de ta. THanks;) – 130nk3r5

3
  1. puede encontrar dirección del vector DX si gira vector de DO por el ángulo alfa (ángulo alfa se encuentra como asin (len (OX)/len (DO)), que es simplemente arcsinus de radio sobre la hipotenusa)

  2. se puede encontrar el longitud del vector DX trivialmente de la siguiente manera: sqrt (len (DO) * len (DO) - len (OX) * len (OX))

  3. Teniendo en cuenta la dirección y la longitud del vector de DX, se puede encontrar el valor de punto de X.Un enfoque sería normalizar DX y multiplicarlo por la longitud del mismo.

auto dist = D.Distance(O); 
auto side = sqrt(dist*dist - rad*rad) 
auto line = Vector2D(D, O); 
line.Rotate(asin(rad/dist)); //get the direction 
line.Normalize();    //set length to 1 
line*=side;     //we have the direction, now get length 
Point2D X = D + line; 

P. S. Tenga en cuenta que también hay una segunda tangente, que se encuentra girando DO por menos alfa

Image demonstrating the algo

4

respuesta de imbrizi supone que el centro del círculo es (0,0).

Ésta es la respuesta correcta en C Objetivo:

- (NSArray *)pointsTangentToCircleWithCenter:(CGPoint)centerPoint 
             radius:(CGFloat)radius 
            outerPoint:(CGPoint)outerPoint { 

    float dx = centerPoint.x - outerPoint.x; 
    float dy = centerPoint.y - outerPoint.y; 
    float dd = sqrt(dx*dx + dy*dy); 
    float a = asinf(radius/dd); 
    float b = atan2f(dy, dx); 
    float t1 = b - a; 
    CGPoint tangentPoint1 = CGPointMake(centerPoint.x + radius*sinf(t1), 
             centerPoint.y + radius*-cosf(t1)); 

    float t2 = b + a; 
    CGPoint tangentPoint2 = CGPointMake(centerPoint.x + radius*-sinf(t2), 
             centerPoint.y + radius*cosf(t2)); 

    NSArray *points = @[ 
         [NSValue valueWithCGPoint:tangentPoint1], 
         [NSValue valueWithCGPoint:tangentPoint2] 
         ]; 
    return points; 
} 
+0

Gracias a su solución, resolvió mi problema. ;) – crypt

1

lo general el uso de software de arce para resolver este tipo de problemas. Incluso puede generar código C a partir de esas ecuaciones.

enter image description here

Aquí está la salida:

t1 = v_x * v_x; 
t2 = t1 * t1; 
t3 = v_y * v_y; 
t6 = sqrt(t1 * t3 - t1 + t2); 
t7 = v_y + t6; 
t9 = 0.1e1/(t1 + t3); 
t13 = 0.1e1/v_x; 
x1 = -(t7 * t9 * v_y - 0.1e1) * t13; 
y1 = t7 * t9; 
t16 = (-v_y + t6) * t9; 
x2 = -(-t16 * v_y - 0.1e1) * t13; 
y2 = -t16; 

Obviamente, es necesario agregar flotador o doble para las variables, también comprobar si hay valor negativo antes de tomar la raíz cuadrada.

Cuestiones relacionadas