Workshopspecifikation: två geometrifunktioner

Vi skrev detta dokument för workshopen. Det beskriver det förväntade beteendet för ClippedArea och ClassifyPoint i den lilla wrapper vi lade till runt Clipper2. Wrappern finns i C++ och C#. Repot innehåller många andra biblioteksfunktioner; de ligger utanför grundövningen.

Använd reglerna nedan när ni avgör om workshopkoden eller ett offentligt test behöver korrigeras. Kod, testnamn, förväntade värden och AI-förklaringar kan vara fel. Om ett offentligt test motsäger en uttrycklig regel här har regeln företräde.

Detta är en avsiktligt begränsad specifikation, inte ett påstående om att varje möjlig indata är fullständigt definierad. När dokumentet inte besvarar en fråga ska ni ange luckan i stället för att hitta på ett krav.

Koordinater

Koordinater använder 64-bitars heltal med tecken. En polygon är en lista av hörn; Clipper2 sluter polygonen från det sista hörnet tillbaka till det första, så det är onödigt att upprepa det första hörnet. Rektanglar är Rect64(left, top, right, bottom). Till exempel har Rect64(0, 0, 10, 10) arean 100.

Klippt area

ClippedArea(polygon, clip) returnerar arean av skärningen mellan en polygon och en axelparallell klipprektangel, summerad över alla resulterande delar. Kärnexemplen använder enkla, icke-självskärande polygoner, rektanglar med positiv storlek, små koordinater och skärningar med heltalskoordinater.

Punktklassificering

ClassifyPoint(polygon, point) returnerar ett av Outside, Boundary eller Inside.

Frågor som detta dokument inte avgör

Reglerna definierar inte fullständigt giltighet för indata, självskärande polygoner, upprepade eller otillräckliga hörn, rektanglar utan storlek, inverterade rektanglar eller numerisk noggrannhet vid mycket stora koordinater. Clipper2 lagrar klippresultat på ett heltalsrutnät: hörn i skärningen som inte är heltal kan avrundas, så exakt matematisk area utlovas inte för dessa indata. En koordinattyp på 64 bitar i sig fastställer inte en noggrannhetsgaranti över hela sitt intervall. Areans returtyp är flyttal.

Grundövningarna använder små, enkla polygoner. Extraövningarna 5, 6, 14 och 15 undersöker avsiktligt fall som definieras mindre väl. För dem ska ni skilja vad implementationen gjorde från vad detta dokument lovar. Föreslagna nya regler hör hemma i docs/spec-proposals.md; behandla dem inte tyst som befintliga krav.