Estoy tratando de determinar el punto en el que un segmento de línea se cruza con un círculo. Por ejemplo, dado cualquier punto entre P0 y P3 (y también suponiendo que conoce el radio), ¿cuál es el método más fácil para determinar P3?Line Intersection Circle
Respuesta
Tiene un sistema de ecuaciones. El círculo está definido por: x^2 + y^2 = r^2
. La línea está definida por y = y0 + [(y1 - y0)/(x1 - x0)]·(x - x0)
. Sustituye al segundo en el primero, obtienes x^2 + (y0 + [(y1 - y0)/(x1 - x0)]·(x - x0))^2 = r^2
. Resuelve esto y obtendrás 0-2 valores para x. Conéctelos nuevamente a cualquier ecuación para obtener sus valores para y.
En general,
- encontrar el ángulo entre P0 y P1
- dibujar una línea en ese ángulo de P0 a una distancia r, el cual le dará P3
En pseudocódigo,
theta = atan2(P1.y-P0.y, P1.x-P0.x)
P3.x = P0.x + r * cos(theta)
P3.y = P0.y + r * sin(theta)
Esto es exactamente lo que estaba buscando - tratando dibujar líneas entre dos círculos con las líneas dirigidas al centro, pero con los puntos finales en el * fuera * de los círculos en lugar de los centros reales. – Krease
Este método es bueno, pero la reestructuración para usar rsqrt y normales, en lugar de atan2 + cos + sin & angles, fue el ticket para el rendimiento para mí. Espero que ayude a alguien! :) – MickLH
esto es correcto cuando P0 es el centro del círculo, como el dibujo de arriba muestra, pero la cuestión no parece estar a punto de que –
Desde el centro del círculo y el radio puede escribir la ecuación que describe el círculo. Desde los dos puntos P0 y P1 puede escribir la ecuación que describe la línea.
Así que tienes 2 ecuaciones en 2 incógnitas, que puedes resolver mediante sustitución.
Sea (x0, y0) = coordenadas del punto P0
Y (x1, y1) = coordenadas del punto P1
y R = el radio del círculo.
La ecuación para el círculo es:
(x-x0)^2 + (y-y0)^2 = r^2
La ecuación para la línea es:
(y-y0) = M(x-x0) // where M = (y1-y0)/(x1-x0)
El tapar la segunda ecuación en la primera Da:
(x-x0)^2*(1 + M^2) = r^2
x - x0 = r/sqrt(1+M^2)
Del mismo modo, puede encontrar que
El punto (x, y) es el punto de intersección entre la línea y el círculo, (x, y) es su respuesta.
P3 = (x0 + r/sqrt(1+M^2), y0 + r/sqrt(1+1/M^2))
Siga este código ...su ahorrar el tiempo
private boolean circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr) {
float dx = x2 - x1;
float dy = y2 - y1;
float a = dx * dx + dy * dy;
float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
float c = cx * cx + cy * cy;
c += x1 * x1 + y1 * y1;
c -= 2 * (cx * x1 + cy * y1);
c -= cr * cr;
float bb4ac = b * b - 4 * a * c;
if(bb4ac<0){
return false; // No collision
}else{
return true; //Collision
}
}
Esto es para la línea, que si es diferente al segmento de línea. – Stritof
esto simplemente devuelve un booleano que dice SI hay una intersección, no devuelve la intersección misma –
MATLAB CÓDIGO
función [bandera] = circleLineSegmentIntersection2 (Ax, Ay, Bx, By, Cx, Cy, R)
% de A y B son dos puntos finales de un segmento de línea y C es el centro de el círculo,% R es el radio del círculo. Esta función de cómputo el más cercano punto de Fron C para el segmento% Si la distancia a la punto más cercano> R de retorno 0 persona 1
Dx = Bx-Ax;
Dy = By-Ay;
LAB = (Dx^2 + Dy^2);
t = ((Cx - Ax) * Dx + (Cy - Ay) * Dy)/LAB;
if t > 1
t=1;
elseif t<0
t=0;
end;
nearestX = Ax + t * Dx;
nearestY = Ay + t * Dy;
dist = sqrt((nearestX-Cx)^2 + (nearestY-Cy)^2);
if (dist > R)
flag=0;
else
flag=1;
end
final
- 1. intersecciones Circle-Polygon
- 2. Predicción de colisión Circle-Circle
- 3. Ray voxel intersection
- 4. Ray-box Intersection Theory
- 5. android asyncTask dialog Circle
- 6. Django filter on queryset intersection?
- 7. Encontrar punto en Circle en Android
- 8. SVG Half Circle: ¿Por qué se gira?
- 9. PHP Echo Line Breaks
- 10. iOS Line Graphing?
- 11. New Line Haskell
- 12. ¿Qué significa #line?
- 13. Draw Line usando CGContext
- 14. Vim global replace (line)
- 15. #line - propósitos de?
- 16. line-height sin unidades
- 17. Vim auto line-break
- 18. line-end agnostic diff?
- 19. Diseño de relación de muchos a muchos - Intersection Table Design
- 20. Better windows command line shells
- 21. Eclipse depug view current line
- 22. Usando MySQL Command Line Client
- 23. Vim Configure Line Number Coloring
- 24. Powershell replace lose line breaks
- 25. Clojure read-line function problem
- 26. C#: System.Windows.Forms.DataVisualization.Charting.Chart Set Line Size
- 27. JavaScript Platform Independent Line separator
- 28. Vim Command Line Escape Timeout
- 29. Android: Linear Layout new Line
- 30. JTree Line Style y Nimbus
Cuando se obtienen dos soluciones, ¿cómo va a decir cuál es P3 y cuál es el punto correspondiente en el otro lado del círculo? –
Encuentra la distancia entre cada punto y P1. Puede calcular el cuadrado de la distancia entre (x3-x1)^2 + (y3-y1)^2, el que sea menor será más cercano a P1. –