Puede obtener un método bastante eficiente al examinar los ángulos de cada punto.
Suponga que a = (0,0) yb = (1,0). Para cada punto [matemática] p = (x, y) [/ matemática] calcule [matemática] p_ \ theta = atan2 (y, x) [/ matemática] y [matemática] p_ \ phi = atan2 (x, 1-y )[/matemáticas]. Estos son los dos ángulos base del triángulo.
Defina un buen triángulo con vértice p , para que sea uno que no contenga ningún otro punto. La condición para esto es que no hay otro punto q tal que [matemática] q_ \ theta <p_ \ theta [/ matemática] y [matemática] q_ \ phi <p_ \ phi [/ matemática]. Nuestra solución será el buen triángulo con el valor y más alto. Si trazas θ y φ obtienes un gráfico como
- Cómo encontrar la ecuación de un círculo que divide la circunferencia de los círculos [matemática] x ^ 2 + y ^ 2 = 1 [/ matemática] y [matemática] x ^ 2 + y ^ 2 + 2x = 0 [/ matemática]
- Dados N puntos en el plano real 2D, ¿cuál es el algoritmo más eficiente para encontrar la mayor cantidad de puntos que se encuentran en un círculo?
- ¿Por qué es interesante el triángulo de Sierpinski?
- ¿Dónde se usa más la geometría diferencial en física teórica, además de GR / astrofísica?
- Cómo encontrar el circuncentro de un triángulo en un espacio tridimensional
Los triángulos buenos están marcados en verde, los malos en rojo. Tenga en cuenta que para cada triángulo bueno no hay ningún punto a la izquierda del punto y debajo del punto. A medida que nos movemos de izquierda a derecha, todos los triángulos buenos tienen valores de lower más bajos.
Podemos encontrar los triángulos buenos ordenando primero los puntos por el valor θ. El triángulo con el lowest más bajo debe ser un triángulo bueno y este se convierte en nuestro triángulo bueno actual C y también en el triángulo máximo M. Ahora recorra los puntos ordenados:
- si la coordenada point del punto es mayor que la del triángulo bueno actual, contendrá C.
- si la coordenada point del punto es menor que la del triángulo bueno actual, se convierte en el triángulo bueno actual. Registre el valor y de esto y si es mayor que para M, el triángulo se convierte en nuestra nueva M.
Esto puede ser simplemente codificado
// Ordenar los puntos por su valor th
points.sort (function (p, q) {return p.th – q.th;});
maxindex = 0; // índice del triángulo más grande
maxy = 0; // valor y del triángulo más grande
lastphi = 10; // valor phi del último triángulo bueno
for (var j = 0; j <n; ++ j) {// recorrer puntos
if (puntos [j] .phi <lastphi) {// valor phi más bajo
lastphi = puntos [j] .phi; // se convierte en el nuevo triángulo bueno actual
puntos [j] .bueno = verdadero; // marca como un buen triángulo
if (puntos [j] .y> maxy) {// es este el triángulo máximo
maxy = puntos [j] .y;
maxindex = j;
}
} else {// no es un buen triángulo
puntos [j] .bueno = falso;
}
console.log (puntos [j]);
}
Una carrera típica dará resultados como
con buenos triángulos marcados con vértices verdes y el más grande de estos triángulos rellenos.
Puede pensar en el algoritmo como barrer un rayo en sentido antihorario alrededor del vértice inferior izquierdo. cada vez que llegue a un punto, encuentre su valor φ y compárelo con el último valor bueno.
Puedes ver una versión interactiva en el triángulo máximo – JSFiddle
Creo que esta solución es básicamente la misma que la de Tadeusz Panda y la complejidad es O (n log n) la del algoritmo de clasificación.