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?
Respuesta
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.
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.
** @ 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
arcsin es correcto: sine (alfa) = opuesto (R)/hipotenusa (D) – Argalatyr
\ alpha = arcsin (R/D) debería ser \ alpha = arccos (R/D) –
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
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.
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.
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) };
¿Qué representa x: radius? – 130nk3r5
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
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
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)
se puede encontrar el longitud del vector DX trivialmente de la siguiente manera: sqrt (len (DO) * len (DO) - len (OX) * len (OX))
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
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;
}
Gracias a su solución, resolvió mi problema. ;) – crypt
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.
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.
- 1. ¿Cómo calculo un punto en la circunferencia de un círculo?
- 2. Encuentra ángulo de un punto desde el centro del círculo
- 3. La mejor manera de encontrar un punto en un círculo más cercano a un punto dado
- 4. Buscar grados (0-360º) de punto en un círculo
- 5. dibujando un círculo de radio R alrededor de un punto
- 6. Encuentra la tangente de un punto en una curva de Bezier cúbico
- 7. WPF: cambiar el tamaño de un círculo, manteniendo el punto central en lugar de TopLeft?
- 8. ¿Cálculo del punto en la circunferencia de un círculo desde el ángulo en C#?
- 9. Curva de Bezier cuadrática: Calcular la tangente
- 10. UIImage en un círculo
- 11. ¿por qué hacer clic derecho crea un punto naranja en el centro del círculo?
- 12. GeoDjango: Cómo crear un círculo basado en punto y el radio
- 13. ¿Por qué no "glEnable (GL_POINT_SMOOTH);" trabajar para hacer el siguiente punto como un círculo?
- 14. Dibuje un círculo con ggplot2
- 15. posición Componentes en el círculo
- 16. Cómo crear un círculo con un agujero en un círculo en WPF?
- 17. matlab: poner un número en un círculo en un gráfico
- 18. dibujar un círculo lleno
- 19. ¿Cambiar el color de un pequeño círculo (punto) contenido en el botón de opción para que sea rojo?
- 20. mvc: ¿el favicon.ico también busca un controlador?
- 21. matplotlib: agregue el círculo a la gráfica
- 22. Encontrar si un círculo está dentro de otro círculo
- 23. Trazar un punto en el borde de una esfera
- 24. ¿Cómo obtengo la tangente "inversa" en Object-C?
- 25. Dibuja un círculo hueco en SVG
- 26. Cómo dibujar un círculo concéntrico en iphone?
- 27. centrar una imagen en un círculo css
- 28. Dibuja parte de un círculo
- 29. Cómo dibujar un círculo lleno en Java?
- 30. Embalaje máximo de rectángulos en un círculo
¿cómo es una línea si solo tiene un punto final dado? – obelix
tiene dos puntos finales diferentes porque sabe que la línea es tangente. – andandandand
dmindreader realmente entiendes mi punto. Gracias. –