Snažím se zjistit, zda obdélník protíná konkávní polygon. Znamená to algoritmus toho dosáhnout?

hlasů
7

Snažím se zjistit, zda obdélník protíná konkávní polygon. Našel jsem tento algoritmus:

double determinant(Vector2D vec1, Vector2D vec2){
    return vec1.x*vec2.y-vec1.y*vec2.x;
}

//one edge is a-b, the other is c-d
Vector2D edgeIntersection(Vector2D a, Vector2D b, Vector2D c, Vector2D d){
    double det=determinant(b-a,c-d);
    double t=determinant(c-a,c-d)/det;
    double u=determinant(b-a,c-a)/det;
    if ((t<0)||(u<0)||(t>1)||(u>1))return NO_INTERSECTION;
    return a*(1-t)+t*b;
}

Mám-li provést tento 4krát (Top doprava, shora dolů doleva, shora dolů pravé dolní doprava) * (všechny hrany mého polygonu) by mi účinně a přesně zjistit, zda obdélník má část nebo všechny konkávní polygon uvnitř? Pokud tomu tak není, co by chybět?

dík

Položena 11/08/2010 v 23:05
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
2

Myslím, že následující by měl fungovat:

(1) for each e1 in rectangle_edges, e2 in polygon_edges
    (1.1) if edgeIntersection(e1,e2) != NO_INTERSECTION
        (1.1.1) return true
(2) if (max_polygon_x < max_rectangle_x) and (min_polygon_x > min_rectangle_x) and (max_polygon_y < max_rectangle_y) and (min_polygon_y > min_rectangle_y)
    (2.1) return true
(2) return false

Edit : Přidána šek, zda je polygon je uvnitř obdélníku.

Odpovězeno 11/08/2010 v 23:12
zdroj uživatelem

hlasů
13

Kód se pokusí najít průsečík dvou segmentů - AB a CD.

Existuje mnoho různých způsobů, jak vysvětlit, jak se to dělá, v závislosti na tom, jak tyto operace interpretovat.

Řekněme, že bod A má souřadnice (xa, ya), B - (xb, yb) a tak dále. Řekněme

dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc

The následující systém dvou lineárních rovnic

| dxAB dxCD |   | t |   | xc-xa |
|           | * |   | = |       |
| dyAB dyCD |   | u |   | yc-ya |

pokud vyřešena pro ta u, vám poměrnou polohu průsečíku na lince AB (hodnoty t) a na řádku CD (hodnota u). Tyto hodnoty leží v rozmezí [0, 1], pokud je bod patří k odpovídajícímu segmentu a mimo tento rozsah, pokud je bod leží mimo segment (na řádek obsahující segment).

Za účelem vyřešení této soustavy lineárních rovnic můžeme použít známé pravidlo Cramerovo . K tomu budeme potřebovat determinant

| dxAB dxCD |
|           |
| dyAB dyCD |

což je přesně to, determinant(b - a, c - d)z kódu. (Ve skutečnosti to, co mám tady je determinant(b - a, d - c), ale není to opravdu důležité pro účely tohoto vysvětlení. Kód, který jste vyslán z nějakého důvodu prohodí C a D, viz poznámka PS níže).

A budeme potřebovat determinant

| xc-xa dxCD |
|            |
| yc-ya dyCD |

což je přesně to, determinant(c-a,c-d)z kódu a determinant

| dxAB xc-xa |
|            |
| dyAB yc-ya |

což je přesně to determinant(b-a,c-a).

Dělení těchto faktorů v souladu s pravidlem Cramerova nám dá hodnoty ta u, což je přesně to, co se děje v kódu, který vyslán.

Kód pak pokračuje k testování hodnot ta upro kontrolu, zda jsou segmenty skutečně protínají, tedy zda oba ta upatří do [0, 1]rozmezí. A pokud ano, tak vypočte skutečný průsečík vyhodnocením a*t+b*(1-t)(ekvivalentně, mohlo by to posoudit c*u+d*(1-u)). (Opět viz PS poznámka níže).

PS V původním kódu body D a C jsou „vyměnili“ v tom smyslu, že kód dělá c - d, kde dělám d - cve svém vysvětlení. Ale to nezáleží na obecnou představu o algoritmu, tak dlouho, dokud jeden je opatrný s příznaky.

Tato výměna z C a D bodu je také důvod pro a*(1-t)+t*bexpresi se používá při hodnocení průsečík. Za normálních okolností, jako v mém vysvětlení, one'd očekávat, že něco takového a*t+b*(1-t)existuje. (Mám pochybnosti o tom ačkoli. Očekával bych vidět a*t+b*(1-t), že i ve verzi. Mohl by to být chyba.)

PPS Autor pokud kód zapomněli zkontrolovat det == 0(nebo velmi blízko k 0 ° C), která se stane v případě, že segmenty jsou rovnoběžné.

Odpovězeno 11/08/2010 v 23:30
zdroj uživatelem

hlasů
0

Pokud je mi známo po letmém pohledu, snaží se zjistit, zda 2 úsečky protínají, a pokud ano, jaké jsou souřadnice průsečíku jsou.

Ne, to není dost dobré zjistit, zda váš obdélník a vaše polygon protínat, protože byste stále chybí případ, kdy buď polygon je zcela uvnitř obdélníku, nebo naopak.

Odpovězeno 11/08/2010 v 23:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more