Jeg prøver å finne ut om et rektangel krysser en konkav polygon. Betyr denne algoritmen oppnå det?

stemmer
7

Jeg prøver å finne ut om et rektangel krysser en konkav polygon. Jeg fant denne algoritmen:

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;
}

Hvis jeg utfører dette 4 ganger (topp til høyre, øverst til nederst til venstre, øverst til nederst til høyre, nederst til høyre) * (alle kanter av min polygon) vil dette effektivt og nøyaktig fortelle meg om rektangelet har en del av eller hele den konkave polygon inne? Hvis ikke det ville være mangler?

Takk

Publisert på 11/08/2010 klokken 22:05
kilden bruker
På andre språk...                            


3 svar

stemmer
2

Jeg tror følgende skal fungere:

(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 : Lagt til sjekk på om polygon er inne i rektangelet.

Svarte 11/08/2010 kl. 22:12
kilden bruker

stemmer
13

Koden forsøker å finne skjæringspunktet mellom to segmenter - AB og CD.

Det er mange forskjellige måter å forklare hvordan den gjør det, avhengig av hvordan du tolker disse operasjonene.

La oss si at punkt A har koordinatene (xa, ya), B - (xb, yb) og så videre. La oss si

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

Det følgende system av to lineære ligninger

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

hvis løses for tog uvil gi den forholdsmessige posisjonen til skjæringspunkt på linje AB (verdi t) og på linje CD (verdi u). Disse verdiene vil ligge i området fra [0, 1]om punktet hører til det tilsvarende segment og utenfor dette området hvis det punkt ligger utenfor segmentet (på linjen som inneholder segmentet).

For å løse dette systemet av lineære ligninger vi kan bruke den velkjente Cramers regel . For at vi trenger determinant av

| dxAB dxCD |
|           |
| dyAB dyCD |

som er nøyaktig determinant(b - a, c - d)fra koden. (Egentlig det jeg har her er determinant(b - a, d - c), men det er egentlig ikke viktig i forbindelse med denne forklaringen. Koden du skrev for noen grunn bytter C og D, se PS merknad nedenfor).

Og vi vil også trenge determinant av

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

som er nøyaktig determinant(c-a,c-d)fra koden, og determinant av

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

som er nøyaktig determinant(b-a,c-a).

Splitte disse determinanter i samsvar med Cramers regel vil gi oss verdiene av tog u, som er nøyaktig hva som er gjort i koden du postet.

Koden deretter fortsetter å teste verdiene tog ufor å sjekke om segmentene faktisk krysser hverandre, det vil si om både tog utilhører [0, 1]variere. Og hvis de gjør, beregner den faktiske skjæringspunktet ved å evaluere a*t+b*(1-t)(ekvivalent, kan det evaluere c*u+d*(1-u)). (Igjen, se PS merknad nedenfor).

PS I den opprinnelige koden punktene D og C er "byttet" i en forstand at koden gjør c - d, hvor jeg gjør d - ci min forklaring. Men dette gjør ingen forskjell for den generelle ideen om algoritmen, så lenge man er forsiktig med skilt.

Dette bytte av C og D punkt er også årsaken til at a*(1-t)+t*buttrykket blir brukt ved vurdering av skjæringspunktet. Normalt, som i min forklaring, one'd forvente å se noe sånt a*t+b*(1-t)der. (Jeg har mine tvil om dette selv. Jeg forventer å se a*t+b*(1-t)det selv i din versjon. Kan være en bug.)

PPS Forfatteren hvis koden glemte å sjekke for det == 0(eller svært nær 0), som vil skje i tilfelle når segmentene er parallelle.

Svarte 11/08/2010 kl. 22:30
kilden bruker

stemmer
0

Så vidt jeg kan fortelle etter et raskt blikk, prøver den å finne ut om 2 linjesegmenter krysser hverandre, og hvis de gjør det, hva koordinatene til skjæringspunktet er.

Nei, det er ikke bra nok til å finne ut om rektangel og din polygon krysser hverandre, fordi du fortsatt savner tilfelle der enten polygon er helt inne i rektangelet, eller den andre veien rundt.

Svarte 11/08/2010 kl. 22:56
kilden bruker

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