obliczyć punkt na linii, która jest najbliżej tego punktu .
Zakładając, że segment linii to aib, a punktem jest p.
float vAPx = p.x - a.x;
float vAPy = p.y - a.y;
float vABx = b.x - a.x;
float vABy = b.y - a.y;
float sqDistanceAB = a.distanceSq(b);
float ABAPproduct = vABx*vAPx + vABy*vAPy;
float amount = ABAPproduct/sqDistanceAB;
if (amount > 1) amount = 1;
if (amount < 0) amount = 0;
Który daje "kwotę", jak daleko w segmencie linii jesteś między A i B (odpowiednio ograniczone).
float nx = (amount * (b.x - a.x)) + a.x;
float ny = (amount * (b.y - a.y)) + a.y;
Daje punkt (nx, ny).
if (p.distance(nx,ny) > threshold) reject;
ten będzie działał poprawnie poza koniec odcinka linii, ponieważ utrzymuje „ilość” pomiędzy 0 a 1.
Jeśli nie chcesz to odcinek ograniczonym pozbyć granicach za kwotę. Reszta kodu nadal będzie działać, obliczając pozycje poza i przed A i poza B.
Było jeszcze jedno pytanie, które twierdziło, że to pytanie było duplikatem, ale prosi o coś innego, dlatego moje rozwiązanie rozwiązuje pozycję punktu, a następnie rozwiązuje dystans euklidesowy (który faktycznie rozwiązuje oba pytania).
a.distanceSq (b) może być również wykonane jako vABx vABx + vABy vABy, ponieważ już to zrobiliśmy.
Uwaga: Jeśli mamy do czynienia z odcinków (czyli nieskończenie długich linii), może to dawać błędne wyniki: Punkt może być daleki od punktów końcowych segmentu, a mimo to mieć niewielką normalną odległość ... – MartinStettner
Należy również pamiętać, że jeśli zamierzasz odwrócić i porównać d do D, bardziej efektywne będzie porównywanie | (x2 - x1) x (x1 - x0) |^2 do D^2 | x2 - x1 |^2, oszczędzając dwa pierwiastki kwadratowe i podział na koszt mnożenia . – Dave
Dziękuję Mr.Alan Ale link nie działa !. Próbowałem równania, które podałeś wcześniej, ale to daje mi odległość między nowym punktem a pierwszym punktem linii, a nie linii otworów. Przepraszam za mój wulgaryzm. Sincerly, Wahid –