2009-02-03 21 views
5

¿Cómo puedo encontrar el número de ángulos internos de un polígono, más grande que 180º, teniendo solo los vértices del polígono?Encuentra el número de ángulos internos de un polígono, más grande que 180º

Para cada vértice quiero siempre el ángulo interno, no el externo.

Gracias de Brasil.

+0

No se puede definir un polígono simplemente por vértices. Debes especificar los lados también. –

+0

Tengo el vértice en orden, así que no necesito los lados. – lucasbls1

+0

Los vértices definen los puntos que se conectarían (los lados) para dar el polígono. – Swinders

Respuesta

4

Puede determinar el ángulo de dos vectores simplemente tomando el producto escalar (producto escalar).Una propiedad útil es que si los vectores son ortogonales, su producto escalar es cero; si su ángulo es obtuso, el producto es negativo, de lo contrario positivo. Por lo tanto, los pasos a seguir son los siguientes:

  • encontrar el primer borde de V0 a V1 (como un vector, se obtiene esta restando las coordenadas), y luego girarlo 90 grados a la izquierda (esto se acaba transformando (x y) a (-y x))
  • encontrar el segundo borde de V1 a V2 (no girado)
  • tomar el producto escalar (esto es sólo (x1 * x2) + (y1 * y2))
  • si el producto escalar es negativo, se trata de un giro a la derecha, de lo contrario una giro a la izquierda
  • siguiente borde ...
  • si pasa por los vértices en sentido contrario a las agujas del reloj, cuente el número de giros a la derecha, de lo contrario el número de giros a la izquierda
  • para el último vértice, tiene que volver al primero (es decir utilizar los bordes VN a V0 y V0 a V1)

edición: Usted puede encontrar si los vértices están ordenados en sentido antihorario o en sentido horario utilizando la siguiente fórmula para calcular el área del polígono:

 
    1 n-1 
A = --- SUM(x(i)*y(i+1) - x(i+1)*y(i)) 
    2 i=0 

donde n es la cantidad de vértices. x(n) y y(n) son lo mismo que x(0) y y(0) (para cerrar el polígono).

Si es positivo, entonces los vértices se ordenan en sentido antihorario, de lo contrario en el sentido de las agujas del reloj.

edit: Cuando simplifica los pasos de rotación y producto escalar, llega a la fórmula para el producto cruzado bidimensional, x1*y2 - x2*y1. Esto simplifica los primeros pasos arriba:

  • encontrar el primer borde de V0 a V1 (como un vector, restando las coordenadas)
  • dito para el segundo borde de V1 a V2
  • tomar el producto cruz ((x1 * y2) - (x2 * y1))
  • si el producto vectorial es positiva, se trata de un giro a la izquierda

lo siento por el primer enfoque complicado.

+0

¿Podría definir un producto escalar? –

+0

Probablemente el producto de puntos. Es mucho más fácil usar el producto cruzado, ya que está bien definido suponiendo que conozca el bobinado. – MSN

+0

Producto escalar: x1 * x2 + y1 * y2 = escalar –

-1

Esta es una pregunta relacionada con la geometría, no exactamente relacionada con el programa.

Si tiene los vértices, puede encontrar los ángulos internos por trigonometría, de forma similar a cómo se encuentran los ángulos de un triángulo.

Usando tres vértices adyacentes, imagina un triángulo y ellos encuentran los ángulos internos.

Por ejemplo, mira el polígono:

Polygon

Podemos construir un triángulo como:

Construct internal triangle

+0

Esto funciona solo si el polígono es totalmente convexo. – lucasbls1

0

Estoy asumiendo que esto es un polígono irregular, ya que supondría una ser realmente difícil para un polígono regular tener un ángulo interno mayor de 180 grados.

Para cada vértice, también necesitaría conocer los dos vértices vecinos. A continuación, puede convertir esto en un problema de trigonometría, donde se encuentra el ángulo desde el vértice principal hasta, por ejemplo, el vértice izquierdo, y se lo agrega al ángulo desde el vértice principal al vértice derecho.

Por ejemplo,

 
tan(angle_to_left) = (v.y-left.x)/(v.y-left.y) 
tan(angle_to_right) = (v.y-right.x)/(v.y-right.y) 

A continuación, agregue los ángulos juntos.

Finalmente, para todos los ángulos que son mayores que 180, incremente un contador. Después de pasar por todos los vértices, su contador le dirá cuántos ángulos internos son mayores que 180.

2
  1. Encuentra la convex hull de los vértices.
  2. Identifique los vértices que no mienten en el casco convexo. Estos son vértices candidatos con> 180 ángulos externos.
  3. Para cada uno de estos vértices investigar más sobre el ángulo (No se puede pensar de ninguna manera en este momento, pero puede ampliar esto).
+0

Para vértices únicos excluidos del casco convexo, el ángulo interior es> 180. Para una serie de vértices, estudie recursivamente el casco convexo del polígono formado por los vértices excluidos y los vértices incluidos en cada extremo de la serie. – user57368

+0

Esta respuesta lo tiene al revés: la forma más eficiente de encontrar el casco convexo de un polígono simple _involves_ para encontrar los ángulos interiores cóncavos. – Svante

0

El problema con la tangente es cuando x == 0. Si solo conoce los vértices del polígono, no sabe lo suficiente a menos que sea un triángulo, ya que podrían tener algún tipo de conectividad.

Suponiendo que conoce la conectividad, tendrá que calcular el orden de enrollamiento (es decir, ¿en qué dirección van los puntos alrededor del polígono?). Con el orden de enrollamiento, puede tomar el producto cruzado de cada punto con sus puntos vecinos y tomar el seno inverso de magnitud para obtener el ángulo.

+0

Los puntos ar en orden de conectividad. – lucasbls1

+0

MSN, buen punto. – Niyaz

0

Encontrar el ángulo interior de los dos últimos vectores (como un ejemplo), tenemos que aplicar esta ecuación para los dos últimos vectores del polígono:

angleRadians = Math.acos ((VX1 * vx2 + VY1 * vy2)/(Math.sqrt (vx1 * vx1 + vy1 * vy1) * Math.sqrt (vx2 * vx2 + vy2 * vy2)));

esto está utilizando el producto Punto de los vectores. Si tiene alguna pregunta sobre esto, here's a tutorial

Pero eso no tiene en cuenta la "dirección del bobinado", primero debe obtener el producto cruzado y, si el producto cruzado es positivo, fue un giro a la izquierda, si es negativo- -un giro a la derecha (para lo cual lo compensaremos restando (ext) el ángulo de 360.

He incluido mi código JS aquí, como una esencia: https://gist.github.com/3741816.

: D

Cuestiones relacionadas