Ho 3 punti (lat, lon) che formano un triangolo.Come posso trovare se un punto si trova all'interno di questo triangolo?Determina se un punto si trova all'interno di un triangolo formato da 3 punti con data latitudine/longitudine
risposta
La domanda principale è se è possibile utilizzare un'approssimazione 2D per questo (in altre parole, il tuo triangolo è abbastanza piccolo).
Se è così, qualcosa di semplice come le coordinate baricentriche funzionerà bene.
Funzionano altrettanto bene in qualsiasi numero di dimensioni, AFAIK. –
La parte difficile è quando si tratta di uno spazio 2D incorporato in una sfera 3D, i bordi dei triangoli non sono linee, sono grandi archi. Tecnicamente puoi ancora utilizzare le coordinate baricentriche, ma la funzione di distanza è diversa, devi gestire la periodicità ed è solo una seccatura enorme. Le risposte che vuoi non corrispondono esattamente alle risposte del triangolo 2d per triangoli grandi o scomodamente posizionati. – tfinniga
La maggior parte delle lingue include una funzione per questo. In Java è Polygon.contains() http://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html
Basta creare un poligono dai punti e quindi chiamare contiene() sul punto di test.
In questo caso non è la lingua ma la struttura fornita con la lingua. È sempre bene sapere cosa fa il software. Per qualcosa di semplice come scoprire se un punto si trova all'interno di un triangolo, non penso che l'uso di Polygon sarebbe la soluzione migliore/più efficiente. – Christo
Sono d'accordo con @Christo. non sempre hai "awt" a tua disposizione. –
questo non è ideale in quanto Polygon.contains() supporta qualsiasi tipo di poligono e, pertanto, l'algoritmo è molto più complesso e pesante che altre soluzioni manuali (ma semplici) fornite qui in altre risposte. Inoltre, awt non è un insieme di classi che gli sviluppatori Java di solito sono pazzi da usare. –
Provare l'algoritmo di trasmissione di raggi.
http://en.wikipedia.org/wiki/Point_in_polygon
E 'abbastanza semplice da implementare.
function SameSide(p1,p2, a,b)
cp1 = CrossProduct(b-a, p1-a)
cp2 = CrossProduct(b-a, p2-a)
if DotProduct(cp1, cp2) >= 0 then return true
else return false
function PointInTriangle(p, a,b,c)
if SameSide(p,a, b,c) and SameSide(p,b, a,c)
and SameSide(p,c, a,b) then return true
else return false
spiegato sul link qui sotto
... proietta prima il punto sul piano del triangolo. –
troppo "magico" in questo esempio. 'CrossProduct' non è mai stato espulso. –
È possibile usare il test point-poligono.
È semplice. Disegna una linea dal tuo punto a Est per una distanza abbastanza grande. Conta il numero di volte in cui la linea si interseca con il tuo plygon. Se è pari, il tuo punto è all'esterno, se è strano, è dentro.
Che funziona per qualsiasi tipo di poligono.
Se si utilizza questo metodo, assicurarsi di gestire i casi limite: due linee parallele possono avere infinite intersezioni. –
Oggi ho fatto qualcosa del genere! Anche con (lat, lon), in realtà (theta, phi), anche se sapevo qualcosa in più sulla mesh con cui stavo lavorando. Sto lavorando con (theta, phi) con 0 < = theta < = PI & = phi < = 2 * PI.
Troverete che potreste avere qualche problema se uno dei vertici si trova nella parte superiore o inferiore della vostra sfera, dal momento che nel mio caso phi non è realmente definito. Finisci con una singolarità lì. Hai fondamentalmente un quadrato, il che rende più facile controllare se il tuo punto si trova all'interno di esso o meno.
In tutti gli altri casi, se hai convertito il tuo punto in (lat, lon)/(theta, phi). Dovrebbe essere semplice usare il metodo come descritto da @Michelle Six.
Codice Java per solo triangolo, ovvero 3 punti.
public static boolean pntInTriangle(double px, double py, double x1, double y1, double x2, double y2, double x3, double y3) {
double o1 = getOrientationResult(x1, y1, x2, y2, px, py);
double o2 = getOrientationResult(x2, y2, x3, y3, px, py);
double o3 = getOrientationResult(x3, y3, x1, y1, px, py);
return (o1 == o2) && (o2 == o3);
}
private static int getOrientationResult(double x1, double y1, double x2, double y2, double px, double py) {
double orientation = ((x2 - x1) * (py - y1)) - ((px - x1) * (y2 - y1));
if (orientation > 0) {
return 1;
}
else if (orientation < 0) {
return -1;
}
else {
return 0;
}
}
Non capisco perfettamente come funzioni. Da dove viene l'espressione magica di getOrientationResult? – singpolyma
non è * quella * magia, è un calcolo baricentrico –
La formula di orientamento è sbagliata. Ho trovato più fonti che confermano che la formula per un triangolo con i punti P1, P2 e P3 è: (p1.x - p3.x) * (p2.y - p3.y) - (p1.y - p3.y) * (p2.x - p3.x); e inoltre, l'orientamento dei tre triangoli deve essere uguale all'orientamento del triangolo originale, che non è detto qui. Fonti (mi dispiace, sono in spagnolo, ma le formule sono universali ;-) http://www.dma.fi.upm.es/mabellanas/tfcs/kirkpatrick/Aplicacion/algoritmos.htm#puntoInterior http: // ouphenus .scienceontheweb.net/2008/07/13/un-punto-dentro-de-un-Triangulo / –
Ecco un'implementazione JavaScript del baricentrica coordinate soluzione discussed here:
// Returns true if point P inside the triangle with vertices at A, B and C
// representing 2D vectors and points as [x,y]. Based on
// http://www.blackpawn.com/texts/pointinpoly/default.html
function pointInTriange(P, A, B, C) {
// Compute vectors
function vec(from, to) { return [to[0] - from[0], to[1] - from[1]]; }
var v0 = vec(A, C);
var v1 = vec(A, B);
var v2 = vec(A, P);
// Compute dot products
function dot(u, v) { return u[0] * v[0] + u[1] * v[1]; }
var dot00 = dot(v0, v0);
var dot01 = dot(v0, v1);
var dot02 = dot(v0, v2);
var dot11 = dot(v1, v1);
var dot12 = dot(v1, v2);
// Compute barycentric coordinates
var invDenom = 1.0/(dot00 * dot11 - dot01 * dot01);
var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
var v = (dot00 * dot12 - dot01 * dot02) * invDenom;
// Check if point is in triangle
return (u >= 0) && (v >= 0) && (u + v < 1);
}
Si dice che sia più veloce rispetto alle soluzioni basate cross-product.
- 1. Determinare se un punto si trova all'interno di un triangolo
- 2. grande triangolo da un insieme di punti
- 3. Determina se un poligono 2D può essere tracciato con un singolo ventilatore a triangolo
- 4. Identificare se un punto si trova all'interno di un poligono?
- 5. Come trovare se un punto si trova all'interno di un set di intervalli?
- 6. Qual è un modo efficace per scoprire se un punto si trova nello scafo convesso di una nuvola di punti?
- 7. Come verificare se un punto si trova su una linea tra altri 2 punti
- 8. Trova il punto più vicino di un vettore di punti
- 9. Trova se un punto è all'interno di uno scafo convesso per un insieme di punti senza calcolare lo scafo stesso
- 10. Punti di conteggio all'interno di triangolo veloce
- 11. Interpolazione di un triangolo
- 12. trova un punto più vicino ad altri punti
- 13. Trova punti d'angolo di un Quadrilatero da un insieme di punti
- 14. campione punto casuale nel triangolo
- 15. Trova punto specifico tra 2 punti - three.js
- 16. Recupera un angolo positivo o negativo da 3 punti
- 17. Mongodb: verifica se un punto si trova all'interno di un poligono memorizzato
- 18. rileva se un punto si trova all'interno di una sovrapposizione MKPolygon
- 19. Determinare se un punto si trova all'interno o all'esterno di una forma con opencv
- 20. Come verificare se un punto si trova all'interno di un poligono convesso in coordinate intere 2D?
- 21. Come verificare se un punto si trova all'interno di un ellissoide?
- 22. IOS: verificare se un punto si trova all'interno di un rect
- 23. Disegno di un triangolo
- 24. trovare un punto su una circonferenza dell'ellisse che si trova all'interno di un rettangolo con punto centrale, altezza e larghezza?
- 25. Come posso verificare se un punto si trova all'interno di una forma 3d con la sua superficie definita da una nuvola di punti?
- 26. Come verificare se un punto (o parte) di una linea si trova all'interno o tocca un rettangolo
- 27. Ricostruzione di un punto 3D da due punti 2D?
- 28. Ricostruzione di un punto 3D da più punti 2D?
- 29. Qual è il modo più veloce per verificare se un punto si trova all'interno di un poligono in python
- 30. Trova se un angolo si trova entro X gradi da un altro
Non è un problema di Project Euler? –
Quanto è grande il tuo triangolo? E 'abbastanza piccolo da supporre che la superficie possa essere considerata piatta o hai bisogno di una geometria sferica? –
Oltre a ciò che dice Mark, come definisci "dentro" rispetto a "fuori"? Se i tuoi punti sono Honolulu, Bangkok e Lagos quindi il margine del triangolo segue all'incirca l'equatore, il polo nord è all'interno o il polo sud è all'interno? –