6 votos

Newbie: determinar si la línea * segmento * interseca el círculo

He leído posts relacionados, incluyendo:

Cómo saber si un segmento de línea que se cruza con un círculo? donde las sugerencias que probablemente son relevantes, pero por encima de mi nivel, y la solución final no es realmente lo que necesito, y

El círculo y la Línea de intersección segmento Que puede ser lo que necesito, pero adquiere más conocimientos matemáticos que está en mi cerebro.

Contexto: tengo dos círculos en powerpoint, cada uno de los cuales tiene 8 puntos (anclajes) en el perímetro. Yo soy el ciclismo a través de todas las 64 combinaciones en VBA para identificar que dos líneas de proporcionar la más larga de punto-a-punto de conectores que hacer no es ir a través de cualquiera de los círculos. Para su comodidad, puedo comprobar cada línea en contra de cada círculo por separado.

Básicamente, estoy tratando de crear el código que me permitirá crear automáticamente algo como esto http://www.harrisgolfonline.com/userfiles/image/wlcc%201932%20bylaws%20callout.jpg excepto yo también voy a tener un pequeño círculo alrededor de la parte ampliada de la imagen original. Estoy tratando de hacer los cálculos para averiguar que el círculo anclajes me va a dar esos dos líneas exteriores.

Así, por ejemplo, si estoy de sorteo en el plazo más breve posible segmento de línea entre los dos más cercanos conectores, yo no se cruzan con cualquiera de los círculos. Una línea entre el más lejano de los conectores tienen que viajar a través de los círculos, y por lo tanto, no cualquiera de los círculos de la prueba.

De todos modos, estoy esperando que alguien me puede ayudar con la ecuación de la instalación, ya que las dos páginas que me de referencia de poner en ecuaciones múltiples y, a continuación, decir ", a continuación, acaba de resolver". No estoy exactamente seguro de cómo combinar las fórmulas para resolver. Lo que estoy esperando es algo más parecido a esta ecuación, excepto que esta se evalúa basándose en toda la línea y no sólo un segmento de línea:

Función privada LineCrossesCircle(x1, y1, x2, y2, cx, cy, cr) as Boolean

x1 = x1 - cx

y1 = y1 - cy

x2 = x2 - cx

y2 = y2 - cy

LineCrossesCircle = 0 <= cr ^ 2 * ((x2 - x1) ^ 2 + (y2 - y1) ^ 2) - (x1 * y2 - x2 * y1) ^ 2

Final De La Función

La lectura de las respuestas, yo no entiendo que puede haber varias condiciones, por ejemplo, puede ser algo similar a la anterior Y algunos otros ecuación o dos.

Mis puntos de conexión siempre estará en la circunferencia del círculo, por lo que me estaba ajustando mi calcula el valor del radio para ser [r*.95] de lo contrario podrían todos se cruzan en los extremos. Que significa que mi extremos nunca caiga dentro de los círculos, sino que forma parte de la línea va a caer en uno o en ambos círculos probablemente el 80% del tiempo. Una vez que encuentre las líneas que no, puedo comprobar sus longitudes y agregarlos como conectores.

Cualquier ayuda en la traducción de las soluciones anteriores en una o más ecuaciones que acaba de tomar los dos extremos (x1, y1, x2, y2) y el círculo info (cx, cy, cr) y devolver un valor booleano para indicar si hay un cruzan sería muy apreciada!!

===================================================================================

Ejemplo de código basado en OAO útil el post. Creo que tengo algo mal, porque no es con conectores que se cruza, cuando sé que aproximadamente el 80% debe tener una intersección.

EDIT: actualizado las fórmulas para MA y MB (he tenido algunos de los elementos invertidos creo), pero todavía no muestra que se cruza

Private Function IntersectCheck(ByVal Cx As Single, _
                            ByVal Cy As Single, _
                            ByVal Radius As Single, _
                            ByVal Ax As Single, _
                            ByVal Ay As Single, _
                            ByVal Bx As Single, _
                            ByVal By As Single) As Boolean

la distancia entre los extremos

d = (((Bx - Ax) ^ 2) + ((By - Ay) ^ 2)) ^ 0.5

'no totalmente seguro de lo que esto es

alfa = (1 / (d ^ 2)) * ((Bx - Ax) * (Cx - Ax) + (Bx - Ax) * (Cx - Ax))

el punto más cercano círculo de centro

mx = Ax + ((Bx - Ax) * alfa)

mi = Ay + ((By - Ay) * alfa)

MC = ((Cx - mx) ^ 2 + (Cy - mi) ^ 2) ^ 0.5

MA = ((Ax - mx) ^ 2 + (Ay - mi) ^ 2) ^ 0.5

MB = ((Bx - mx) ^ 2 + (Por mi) ^ 2) ^ 0.5

AC = ((Cx - Ax) ^ 2 + (Cy - Ay) ^ 2) ^ 0.5

BC = ((Cx - Bx) ^ 2 + (Cy) ^ 2) ^ 0.5

IntersectCheck = False

Si MC > Radius, a Continuación,

"no hay cruzan

Otra cosa

If (MA < d) And (MB < d) Then

    'there is an intersect

    IntersectCheck = True

Else

    If AC <= Radius Or BC <= Radius Then

        'there is an intersect

        IntersectCheck = True

    End If

End If

End If

Final De La Función

2voto

zyx Puntos 20965

Dadas las coordenadas de dos distintos puntos, representada por los vectores de coordenadas $v_p$$v_q$, las coordenadas de los vectores de puntos en la línea entre ellos puede ser parametrizado por $v(t) = tv_p + (1-t)v_q$, en el que el $x$ $y$ coordenadas de $v(t)$ son funciones lineales de $t$. El cuadrado de la distancia de $v(t)$ al centro del círculo es una función cuadrática de $t$ con coeficientes calculable a partir de la información dada, $At^2 + Bt + C$$A > 0$, y desea saber si su mínimo (que es el valor al $t = -\frac{B}{2A}$) es menor o igual a $R^2$.

0voto

gasfight Puntos 16

Deje el nombre de su segmento $[A,B]$, $C$ el centro de su círculo y $R$ radio. $d=\sqrt{(Bx-Ax)^2 + (By-Ay)^2}$ es la distancia entre los dos puntos.

Primero se obtiene el punto de que es el más cercano de C, en $(A,B)$. En este punto, M, tiene coordenadas $Ax + (Bx-Ax)\ \alpha$ y $Ay + (By-Ay)\ \alpha$ , donde $\alpha=\frac{1}{d^2}\left((Bx-Ax)\ (Cx-Ax) + (By-Ay)\ (Cy-Ay) \right)$ es la distancia entre a y B. Esto es sólo $\overrightarrow{AM}=\left( \frac{\overrightarrow{AB}}{AB} \cdot\overrightarrow{AC}\right) \frac{\overrightarrow{AB}}{AB}$

A continuación, compruebe si este punto está en el círculo. Si $|MC|=\sqrt{((Cx-Mx)^2+(Cy-My)^2)}>R$, el círculo y la línea no se cruzan, por lo que el círculo y el segmento no se cruzan.

Si $|MC| \leq R$, usted tiene que comprobar si M es en el segmento, es decir, si $|MA| \leq d$$|MB| \leq d$. Si es cierto, el círculo y la recta se cortan.

Si $|MC| \leq R$ pero M no es en el segmento, usted sólo tiene que comprobar si $|AC| \leq R$ o $|BC| \leq R$. Si es cierto, el segmento y el círculo se cruzan. Si es que es falso, que no se intersectan.

0voto

Swapnil Tathe Puntos 11

@Mooncat39: he cargado el trabajo de archivo de powerpoint aquí (enlace de abajo)- no he tocado el código en un tiempo, y es muy posible que me quedan fragmentos de otros intentos de introducción del código en el que yo no borro cuando llegué a este trabajo... pero este no trabajo, instrucciones incluidas. Usted es bienvenido para adaptarlo como mejor le parezca. Te dejo este enlace en vivo para un par de días (o hasta que veo una respuesta post de confirmación ha descargado una copia), de modo que usted puede tener acceso al código de VBA que las unidades de la llamada maker.

https://drive.google.com/file/d/0B1a_NxK2EF77ckR4WWFKclVoOE0/view?usp=sharing

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