4 votos

Círculo más grande entre las líneas a través de punto

Calcular círculo a través de un punto, con su centro en una línea

Estoy tratando de hacer un programa en java que calcule el círculo más grande entre dos líneas tangenciales a través de un punto que no está en una de las líneas.

Circle through point between intersecting lines

Tengo las coordenadas de a, B, C y D (el punto donde el círculo se va), el ángulo entre AB y AC y ya sé cómo conseguir la bisectriz. Si yo pudiera calcular los centros de los círculos, podría calcular sus radios, así que sé que el círculo es el más grande.

Así que mi pregunta es: ¿Cómo puedo obtener las coordenadas del centro de ambos círculos?

1voto

Sergio del Amo Puntos 390

Fórmula

La distancia del punto a la cúspide yo llame a $d$, y el componente a lo largo de la bisectriz $x$. La distancia de la bisectriz es $y$ e lo $d^2 = x^2 + y^2$. El ángulo medio (entre CA y la bisectriz) es de$ \varphi$.

The radius of the tangent circles through the point is

$$ \boxed{ r = \begin{cases} \dfrac{\sin \varphi}{\cos^2 \varphi} \left( x + \sqrt{ x^2 - d^2 \cos^2 \varphi} \right) \\ \dfrac{\sin \varphi}{\cos^2 \varphi} \left( x - \sqrt{ x^2 - d^2 \cos^2 \varphi} \right) \end{casos}} $$

How?

Development

pic

  1. Consider the big triangle BAG above, with known apex angle $\varphi$. You can write $$ \sin \varphi =\frac{r}{x+z} $$
  2. Ahora, considere el más pequeño triángulo DGE arriba. Usted puede escribir $$ r^2 = y^2 + z^2 $$

    • Dado : Lo que se sabe es $\varphi$, $x$ e $y$.
    • Encontrar : Lo que puede ser calculada a partir de las dos ecuaciones anteriores es $r$ e $z$.
    • Paso 1 : Resolver la ecuación 1. por encima de $z$ $$ z = \frac{r}{\sin \varphi}-x $$
    • Paso 2 : Sustituir $z$ en la ecuación 2. y resolver para $r$ $$ r^2 = y^2 + \left( \frac{r}{\sin \varphi}-x \right)^2 $$

    $$ -r^2 \cot^2 \varphi = - \frac{2 r x}{\sin \varphi} + x^2 + y^2 $$

    Sustituto $d^2 = x^2 + y^2$ y multiplicar ambos lados con $\sin^2\varphi$

    $$ r^2 \cos^2 \varphi = 2 r x \sin\varphi - d^2 \sin^2 \varphi $$

    Resolver para $r$

    $$ r = \frac{\sin \varphi}{\cos^2 \varphi} \left( x \pm \sqrt{ x^2 - d^2 \cos^2 \varphi} \right) $$

Ejemplo:

$$\begin{aligned} x &= 8.5523 \\ y & = 2.7469 \\ \varphi & = 27.2667° \\ \hline r & = 6.7402231186653915 \\ z & = 6.1550912324182015 \end{aligned} \tilde $$

pic

Ejemplo práctico w/ Algo

Considere la situación de los de abajo y el código que se va con ella. El resultado del código C# (integrado en los comentarios) es idéntica a la GeoGebra cálculos

geo

public enum CircleChoice
{
    Smallest,
    Largest
}
static class Program
{
    static void Main(string[] args)
    {
        // Example for answer: https://math.stackexchange.com/a/2975562/3301
        var A = new Vector2(-2.45f, -2.71f);
        var B = new Vector2(8.9222f, -3.1959f);
        var C = new Vector2(8.4971f, 6.5775f);
        var D = new Vector2(2.95f, 1.25f);

        var r_max = GetTangentCircleThroughPoint(A, B, C, D, CircleChoice.Largest);
        // r_max = 3.2795992264835716

        var r_min = GetTangentCircleThroughPoint(A, B, C, D, CircleChoice.Smallest);
        // r_min = 2.09536400590215
    }

    /// <summary>
    /// Find the radius of the largest (or smallest) circle that is tangent to
    /// two lines and is passing through a point.  
    /// Answer to question https://math.stackexchange.com/q/2975304
    /// </summary>
    /// <param name="A">The apex point</param>
    /// <param name="B">A point on one line</param>
    /// <param name="C">A point on the other line</param>
    /// <param name="D">The target point</param>
    /// <returns>The radius value</returns>
    static double GetTangentCircleThroughPoint(Vector2 A, Vector2 B, Vector2 C, Vector2 D, CircleChoice circle = CircleChoice.Largest)
    {
        // Get the half-angle between the two lines
        var apex_angle = 0.5*GetAngleBetweenVectors(B - A, C - A);
        // θ = 0.3731322286751852r = 21.378901903398422°

        // Get the direction vectors from A to B, and from A to C
        var dir_B = Vector2.Normalize(B - A);
        var dir_C = Vector2.Normalize(C - A);

        // Bisector direction is average of the two above vectors
        var bisector_dir = Vector2.Normalize( (dir_B + dir_C) / 2 );
        // Bisector othogonal from 90° rotation
        var bisector_otho = new Vector2(-bisector_dir.Y, bisector_dir.X);

        // Measure distance between A and D, along bisector (x), and away (y).
        var x = Vector2.Dot(D - A, bisector_dir);
        // x = 6.39269924
        var y = Vector2.Dot(D - A, bisector_otho);
        // y = 1.99373889

        // Hypotenouse of (x,y) distances
        var d = Math.Sqrt(x * x + y * y);
        // Intermediate values for trig of half-angle
        var sin = Math.Sin(apex_angle);
        var cos = Math.Cos(apex_angle);

        if (circle == CircleChoice.Largest)
        {
            // This is the largest circle radius
            return sin / (cos * cos) * (x + Math.Sqrt(x * x - (d * cos) * (d * cos)));
        }
        else
        {
            // This is the smallest circle radius
            return sin / (cos * cos) * (x - Math.Sqrt(x * x - (d * cos) * (d * cos)));
        }
    }
    /// <summary>
    /// Return the angle between two 2D vectors
    /// </summary>
    /// <returns>Angle in radians</returns>
    static double GetAngleBetweenVectors(Vector2 A, Vector2 B)
    {
        // dot(A,B) = norm(A)*norm(B)*cos(angle)
        // norm(cross(A,B)) = norm(A)*norm(B)*sin(angle)
        var cos = Vector2.Dot(A, B);
        var sin = -A.Y * B.X + A.X * B.Y;
        // Convention: atan2(dy, dx)
        return Math.Atan2(sin, cos);
    }
}

1voto

Esto puede ser resuelto mediante la trigonometría de triángulos y una ecuación cuadrática.

Me he tomado la libertad de re-etiquetar su ángulo de $x$ como ángulo de $\alpha$. Sólo hay dos círculos que pasa a través del punto de $D$ y la tangente a las dos rectas, y desea el mayor de los dos. Cuando llegamos a la solución de la ecuación cuadrática, esto le importe a tomar el 'plus' de la opción de la 'más o menos' en la solución.

Largest circle containing D tangent to two intersecting lines

Para especificar el círculo más grande que contenga $D$ necesitamos saber la distancia $h$ de $E$ de $A$ y el radio de $r=ED=EG$ del círculo. Para estas dos cantidades desconocidas, tenemos disponibles dos ecuaciones.

De $\triangle AGE$ hemos

$$ r=h\sin\alpha \tag{1}$$ A partir de la ecuación de un círculo que hemos $$ r^2=(x-h)^2+y^2\tag{2} $$

La combinación de los dos da

$$h^2\sin^2\alpha=(x-h)^2+y^2$$

que puede ser re-organizadas (usando la identidad de $1-\sin^2\alpha=\cos^2\alpha$) en una ecuación de segundo grado en $h$:

$$ \left(\cos^2\alpha\right)h^2-2xh+\left(x^2+y^2\right)=0 $$

El uso de la fórmula cuadrática y un poco de simplificación trigonométricas

$$ h=\frac{x+\sqrt{x^2\sin^2\alpha-y^2\cos^2\alpha}}{\cos^2\alpha} \tag{3}$$

Este valor se puede sustituir en la ecuación (1) para hallar el $r$.

Aquí hay un enlace a un Applet de Geogebra utilizando las ecuaciones para $h$ e $r$ dado anteriormente. Usted puede cambiar el ángulo de $\alpha$ moviendo el punto de $B$ y también se puede mover el punto de $D$.

1voto

Brian Deacon Puntos 4185

Supongamos que las líneas dadas hacer un ángulo de $2\theta$ en su intersección, $O$, y que el punto dado, $P$, es tal que $\overline{OP}$ hace un ángulo de $\phi$ con la bisectriz de un ángulo. (Vamos a suponer $-\theta \leq \phi \leq \theta$.) Definir $p := |OP|$. Deje que los círculos de ser tangente a una de las líneas en $S$ e $T$, y deje $M$ ser el punto medio de la $\overline{ST}$. Deje $P^\prime$ e $M^\prime$ ser el reflejo de $P$ e $M$ en la bisectriz. Por último, vamos a $R$ e $R^\prime$ a ser los pies de las perpendiculares desde $P$ a las líneas, como se muestra.

Tenga en cuenta que $\overleftrightarrow{PP^\prime}$ es el eje radical de las dos circunferencias, que pasa necesariamente por la $M$ e $M^\prime$.

enter image description here

Ahora, por simple trigonometría,

$$|OM| = |OM^\prime| = |ON|\sec\theta = |OP| \cos\phi\sec\theta = p\cos\phi\sec\theta \tag{1}$$ También, $$\begin{align} |MP\phantom{^\prime}|\phantom{=|PM^\prime|}\; &= |PR\phantom{^\prime}|\sec\theta = |OP|\sin(\theta+\phi)\sec\theta = p\sin(\theta+\phi)\sec\theta \\ |MP^\prime| = |PM^\prime| &= |PR^\prime|\sec\theta = |OP|\sin(\theta-\phi)\sec\theta = p\sin(\theta-\phi)\sec\theta \end{align} \etiqueta{2}$$

Por el poder de un teoremas de punto, podemos expresar el poder de la $M$ con respecto a la "más grande" círculo de dos maneras: $$|MT|^2 = |MP||MP^\prime| \quad\to\quad |MT|=p\sec\theta\;\sqrt{\sin(\theta+\phi)\sin(\theta-\phi)} \tag{3}$$

Vemos, entonces, que el punto de tangencia $T$ es el punto en la línea que $$|OT|= |OM|+|MT| = p\sec\theta\left(\;\cos\phi + \sqrt{\sin(\theta+\phi)\sin(\theta-\phi)}\;\right) \tag{4}$$

Finalmente, la perpendicular a la $T$ cumple con la bisectriz de un ángulo en $T_\star$, el centro del círculo mayor, y tenemos

$$\begin{align} |OT_\star| &= |OT|\sec\theta = p \sec^2\theta\;\left(\;\cos\phi + \sqrt{\sin(\theta+\phi)\sin(\theta-\phi)}\;\right) \\ |TT_\star| &= |OT|\tan\theta = p \sec\theta\tan\theta \;\left(\;\cos\phi + \sqrt{\sin(\theta+\phi)\sin(\theta-\phi)}\;\right) \end{align} \etiqueta{$\star$}$$

dando la ubicación del centro y el radio del círculo mayor. $\square$


Observar que las diversas trig valores son todos fácilmente calculada a través del vector de métodos.

Escribir $u$ e $v$ para la unidad de los vectores de dirección de las líneas, y $w$ para la unidad de vector de dirección de la bisectriz (es decir, $w=(u+v)/|u+v|$). Y deje $q$ ser el vector $\overrightarrow{OP}$ (quiero llamarlo $p$, pero que en el uso de la longitud de dicho vector); si distribuimos $p$ a través de las expresiones en $(\star)$, que no tiene que preocuparse de "unificar" $q$.

$$p\cos\phi + \sqrt{p\sin(\theta+\phi)\,p\sin(\theta-\phi)} = q\cdot w + \sqrt{|u\times q|\,|q\times v|}$$ $$\s^2\theta = \frac1{\cos^2\theta} = \frac{1}{(u\cdot w)^2} \qquad \sec\theta\tan\theta = \frac{\sin\theta}{\cos^2\theta} = \frac{|u\times w|}{(u\cdot w)^2}$$

0voto

Vincent Puntos 5027

Deje $a=\tan x$ ser la pendiente de la línea de $AB$. Deje $G=(G_x,G_y)$ ser el punto de contacto entre el círculo y la línea de $AB$ (de modo que $G_y=aG_x$). A continuación, $E=(E_x,0)$, donde $E_x=aG_y+G_x$ (debido a $GE$ es perpendicular a $AB$, por lo que su pendiente es $-1/a$).

Tenemos $|GE|^2=|DE|^2$, por lo que $$(E_x-G_x)^2+(E_y-G_y)^2=(E_x-D_x)^2+(E_y-D_y)^2$$ $$(aG_y)^2+G_y^2=((aG_y+G_x)-D_x)^2+D_y^2$$ $$(a^2+1)G_y^2=((a^2+1)G_x-D_x)^2+D_y^2$$ $$(a^2+1)a^2G_x^2=((a^2+1)G_x-D_x)^2+D_y^2$$

Las cantidades $a,D_x,$ e $D_y$ son de todos conocidos, así que esto es sólo una ecuación de segundo grado en $G_x$. Resolver, y tomar la mayor de las dos soluciones. Esto le dará inmediatamente $G_y=aG_x$ e $E_x=aG_y+G_x$.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X