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