Verificați dacă punctul aparține unui dreptunghi

Verificați dacă punctul aparține unui dreptunghi

Sunt cunoscute coordonatele vârfurilor dreptunghiului (pe plan), unghiul de rotație (în raport cu centrul) și coordonatele punctului. Cum să știți în mod programatic dacă un punct aparține unui dreptunghi sau nu?

S-au găsit în cazul general pentru poligon (puteți obține toate nodurile cu însumarea unghiurilor dintre vectorii de „point-to-top“ (dacă + -360, aparține)), dar este oarecum mai ușor de făcut.

să numere semnele de produse vectoriale ale vectorilor laturilor și punctului de vârf, adică Determinați dacă punctul se află în partea stângă a fiecărei laturi când mergeți în sens invers acelor de ceasornic

Taxi de geometrie analitică.
Orice linie dreaptă (într-un dreptunghi - acestea sunt patru linii drepte) împarte avionul în două părți + și -.
Dacă înlocuim coordonatele punctului din # xA0; ecuația liniei drepte este distanța de la un punct la o linie dreaptă, cu un semn care indică apartenența la una dintre părți.
În consecință, va fi ceva de genul:
# xA0; # xA0; # xA0; +
# xA0; -----------
| | # xA0; # xA0; - # xA0; # xA0; | |
| | # xA0; # xA0; # xA0; # xA0; # xA0; | |
+| - # xA0; # xA0; # xA0; # xA0; # xA0; - | +
| | # xA0; # xA0; # xA0; # xA0; # xA0; | |
| | # xA0; # xA0; - # xA0; # xA0; | |
# xA0; -----------
# xA0; # xA0; # xA0; +
Verificați cu tărie că rezultatul sublinierii este întotdeauna mai mic sau egal cu 0, apoi punctul din dreptunghi.

P.S.
Semnul depinde de direcția vectorului de direcționare al liniei de direcționare, aceasta trebuie luată în considerare.

stupid prin formula de rotație, toate punctele dreptunghiului sunt rotite pentru a face dreptunghiul orizontal și apoi pentru tester ca de obicei.

Sau totuși este posibil așa cum a fost specificat în [2] să facă. Căutăm înălțimea de la punctul la linia dreaptă. Dacă toate înălțimile sunt pozitive sau negative, înseamnă că înăuntru (dacă direcția traversei este aceeași). Pentru a găsi înălțimea, puteți construi două triunghiuri dreptunghiulare și din ele derivă formula piciorului comun, care este înălțimea.

---
. mergem pe o linie subțire.

hmm. citiți subj # xA0; greșit și a răspuns în [1] despre apartenența la triunghi;)

Pentru un dreptunghi, nu este nevoie să mătuiți toate cele patru laturi. Este suficient să extindeți vectorul primului vârf - un punct de-a lungul vectorilor a două laturi adiacente și să verificați că ambele coordonate parametrice sunt în interiorul 0..1. Diviziile nu sunt nici măcar necesare dacă nu ne comparăm cu unitatea, ci cu discriminarea (luând în considerare semnul ei)

> Și ceea ce se propune în [1]. Aceleași ouă, numai
> pe partea laterală.

Ouă ridicate. ))
Și algoritmul este același, dacă înțeleg corect.

Există o foarte simplu, dar, de asemenea, cel mai lent dreptunghi algoritm este de 2 triunghiuri -> găsește dimensiunea este un dreptunghi apoi să ia punct și de la ea a construi 4 treugolka (punct de sus și laterală a triunghiului coincide cu una din laturile dreptunghiului) în jos este dimensiunea de 4 triunghiuri și compară cu o eroare planul dreptunghiului este totul.

# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; în cazul în care pavilion atunci
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; începeți
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; // de lângă linie, în cadrul w.
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; // h (aici, probabil, l) este distanța de la un punct la o linie dreaptă.
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; sfârșitul;
# xA0; # xA0; # xA0; # xA0; # xA0; sfârșitul;
se încheie;

Pe scurt, dacă vă gândiți la asta, puteți face ceea ce aveți nevoie)


> Dacă înlocuim coordonatele unui punct în # xA0; ecuația liniei este
> obține distanța de la un punct la o linie dreaptă,

Mă întreb cum vă determinați în acest caz ecuația liniei verticale)))

> [11] Darkwingg # xA0; (Aug 27, 07 10:02 AM)

Și există unele probleme. ))

IMHO recalculeze majoritatea pravlno coordonatele unui punct într-un sistem de coordonate bazat fie pe partea de sus și două laturi perpendiculare ale dreptunghiului, și apoi comparate cu coordonatele lungimile laturilor. (esența procesului a fost deja descrisă mai sus, citez formulele)

alegem ca punct de referință al noului sistem de coordonate punctul de stânga-jos al dreptunghiului.

px, py sunt coordonatele punctului din vechiul sistem de coordonate
newpx, newpy - coordonatele punctului din noul sistem de coordonate
ax, ay - coordonatele punctului din stânga al dreptunghiului (estessno în sistemul de coordonate.)
la, lb - lungimea laturilor dreptunghiului

G este unghiul de rotație al dreptunghiului în sensul acelor de ceasornic, în raport cu punctul său inferior stâng.

1. newpx = (px - ax) * cos (G) - (py - ay) * sin (G)
(2) (2) (2) (2)

dacă newpx <= la и newpy <= lb, то точка лежит внутри прямоугольника.

adevărul nu este în întregime gud, dacă lungimile laturilor dreptunghiului nu sunt cunoscute și numai coordonatele nodurilor sunt cunoscute)) este necesar să le analizăm și ele, lucru care necesită mai multe operații.


> Și există unele probleme. ))

hmm)), atunci, scrieți apoi ecuația unei linii drepte care trece prin puncte

> [14] Darkwingg # xA0; (Aug 27, 07 10:59 AM)

Tu în universitate nu ai învățat proprietățile directe. )

Prima proprietate:
Prin oricare două puncte care nu coincide, se poate desena o singură linie dreaptă.

În cazul de față, ecuația liniei drepte va fi:
x = x1
iar distanța de la linie la punct va fi găsită ca diferența x1 și x a coordonatei punctului.

hmm. hmm), ci prin oricare două puncte distincte, puteți desena o linie dreaptă, cu toate acestea, că este doar în cazul unei linii verticale va necesita o condiție suplimentară pentru a testa dacă acesta este vertical nu fiecare linie poate fi descrisă de ecuația y = f (x).

Vi se spune că este suficient să înlocuiți coordonatele în ecuația liniei, în acest caz scrieți această ecuație pentru toate liniile drepte, inclusiv cele verticale)))

> [16] Darkwingg # xA0; (08/27/07 12:00)

Aici nu este necesar să prindem astfel de lucruri.
Și idiotul știe că linia verticală nu este o linie dreaptă obișnuită, doar pentru că nu este un grafic.
În consecință, trebuie să se pronunțe separat.
IMHO mai ușor de verificat decât să utilizați metoda.
Da, și va fi mai rapid.


> Aici nu este necesar să prindem astfel de lucruri.

Și asta nu e deloc. Iată un exemplu despre ce veți face cu o linie dreaptă aproape verticală?

Bănuiesc că formula dvs. y = x (Y2-Y1) / (x2-x1) + b, în ​​acest caz, un mic, dar nu este zero (x2-x1), are doar o directă, aproape de verticală, veți obține o mare eroare și poate fi lipsită de poziția punctului și, în plus, poate să apară diviziunea cu zero.

> Darkwingg
orice linie poate fi descrisă, de exemplu, prin ecuația ax + cu + c = 0


> [18] Darkwingg # xA0; (Aug 27, 07 1:03 PM)

Hmm. Și, de obicei, dimpotrivă, evit liniile verticale prin aplicarea unei linii drepte aproape de verticală, de obicei suficientă este acuratețea, chiar și pe linii drepte foarte lungi.

> În acest caz, nu există nici un sens din această descriere
Dacă este vorba de ce parte a liniei este punctul, atunci această descriere este excelentă.

Bliin. Am devenit proastă. În general, nu stau la matematică, trebuie să rezolv problemele.

Darkwingg, aici este - aceeași ecuație.

> @ ex !!
Cu toate acestea, pentru construirea de ecuații este necesar să se facă calcule pentru toate părțile, ceea ce nu este necesar.

în [5] este descrisă o metodă mai economică.

Numai aici, pentru acest tip de ecuație, trebuie totuși să fie citată, mi se pare că în această metodă, de la diviziune la zero, nu se poate ajunge nicăieri. O linie care trece prin două puncte, dacă nu mă înșel, este descrisă de o astfel de formulă:

prin tamburină și cthulhu, ea poate fi redusă la forma ax + cu + c = 0, unde rezultatul va fi (x1 - x2) în numitor.

> [24] Darkwingg # xA0; (08/27/2007 15:28)

Pentru a fi sincer nu-mi amintesc acum, dar ne-au spus cum să evite cazul în care componenta a vectorului de direcție este 0, se pare oarecum simplu, dar a fost mult timp în urmă și nu-mi amintesc.

de fapt, problema este că cu sinusurile, cosinusele, unghiurile și vectorii nu trebuie să apară nici o problemă. în general, nu există diviziune. că sobsno și reflectate în metoda mea))). tot ce am inundat. ultimul post din acest thread.

> Cu toate acestea, pentru a construi ecuațiile, este necesar să se facă calcule
> pentru toate părțile, ceea ce nu este necesar.
>
> în [5] este descrisă o metodă mai economică.

De ce? numără perechi, direcționează vectori, atunci perechile de linii drepte sunt aceleași.
Și dacă este un dreptunghi, atunci e suficient să găsești unul, iar al doilea va fi sub 90 de grade.


> [26] Darkwingg # xA0; (Aug 27, 07 15:41)

Nuuu. Totuși, sunt în mod special tuplen.
Nu există nici o diviziune la zero. Chiar și cu o linie dreaptă verticală.
Același component prost al vectorului, bine, unul dintre ele este egal cu zero, în același loc înmulțire, și nu diviziune!

> Cu toate acestea, pentru a construi ecuațiile, este necesar să se facă calcule
> pentru toate părțile, ceea ce nu este necesar.
>
> în [5] este descrisă o metodă mai economică.

De ce? numără perechi, direcționează vectori, atunci perechile de linii drepte sunt aceleași.
Și dacă este un dreptunghi, atunci e suficient să găsești unul, iar al doilea va fi sub 90 de grade.


> [26] Darkwingg # xA0; (Aug 27, 07 15:41)

Nuuu. Totuși, sunt în mod special tuplen.
Nu există nici o diviziune la zero. Chiar și cu o linie dreaptă verticală.
Același component prost al vectorului, bine, unul dintre ele este egal cu zero, în același loc înmulțire, și nu diviziune!

Memorie: 0,81 MB
Durată: 0,03 secunde