DERIVER.TXT - Derivering

===============================================================================
     Date: 07-24-95    Time: 01:34a     Number: 18     
     From: Bjorn-Tore Dale               Refer:         
       To: Morten Vold                Board ID: SKRIBENT        Reply: 
  Subject: "Derivering"?!??                173: Ice/Programm   Status: Public 
-------------------------------------------------------------------------------
 On 06-27-95 Morten Vold wrote to All...

 MV> Hei der!  Jeg lurte på om det er noen mattegenier her som kan hjelpe
 MV> meg med
 MV> noe jeg kanskje skal programmere. Han som skal ha det kaller det
 MV> 'derivering',
 MV> ikke vet jeg :)
 MV>
 MV> I allefall, dette er situasjonen;  Du har en polygon, og har x og
 MV> y-koordinatene til alle hjørnene i polygonen.  Så får du gitt et annet
 MV> punkt i
 MV> det samme koordinat-systemet, og skal regne ut om det er inni eller
 MV> utenfor
 MV> polygonen.
 MV>
 MV> Er det noen som har peiling?

Er litt sent ute med svar, men jeg har vært på ferie...

Har ikke programmert akkurat denne algoritmen, men jeg har vært borti en slik
situasjon i et kurs.  Jeg tror følgende metode er brukbar, vel og merke bare
for *konvekse* polygon. Et polygon er konvekst bare dersom alle vinklene er
mindre enn 180 grader.

Eksempelvis definerer følgende punkt P1..P4 et konvekst polygon:
   P2
  P1
 P3
P4

Dette er ikke konvekst:

   P2  P3

     P1 P5

   P4

Metode:

Pr. linje i polygonet sjekker en om punktet er over eller under denne. Hvis
punktet er over en av linjene som er på "oppsiden" av polygonet, vet vi helt
sikkert at punktet er utenfor polygonet. Tilsvarende, dersom punktet er under
en av linjene som er på "undersiden" av polygonet, vet vi helt sikkert at
punktet er utenfor polygonet. Dersom ikke dette kan vises for noen av linjene,
må punktet være innenfor polygonet.
Vertikale linjer må behandles spesielt.


1. Først må vi ha en metode for å finne ut om et punkt er
   over, på, eller under en gitt linje i polygonet.


   Likningen for en linje er:
        y = a*x + b

   La oss si at hver linje i polygonet er definert av punktet (x0,y0)
   og punktet (x1,y1).

   a er lik                     (antar ikke-vertikal linje)
        a = (y1-y0)/(x1-x0)

   Dette er stigningstallet for linjen, og er lik den deriverte
   av samme linjen.

   b er lik
        b = y0 - a*x0

   Likningen kan omskrives slik:
        a*x - y + b = 0

   Fra denne lager vi så en funksjon f(x,y) slik:
        f(x,y) = a*x - y + b

   Dersom punktet (x,y) ligger *på*    linjen er f(x,y) = 0.
   Dersom punktet (x,y) ligger *under* linjen er f(x,y) > 0.
   Dersom punktet (x,y) ligger *over*  linjen er f(x,y) < 0.


2. Sørg for å definere alle n punktene i polygonet slik
   at rekkefølgen punktene P1..Pn er gitt er *med* klokken.
   Eks. med n=5:

       P5 o       o   P1


P4 o   o  P2

               o P3

3. La oss si at punktet som vi skal sjekke om er inni eller
   utenfor polygonet er definert som (g,h).

   Da blir algoritmen noe slikt (ha meg unnskyldt miks norsk-engelsk!):

   (Laget som en funksjon som returnerer true dersom punktet
    er innenfor).


   int   i;
   float a,b,f;

   for i = 1 til n         (hvert punkt i polygonet)

     punkt (x0,y0) = P(i)      (fra-punkt)

     hvis ix0 så
             return (false)
             (punktet er over en linje som er på oversiden av polygonet)
       ellers hvis f > 0 så
          hvis x1y0 så
          hvis gx0 så
             return (false)
             (punktet er til høyre for linje som er på høyre
              side av polygonet)

   next i

   (punktet er innenfor siden vi ikke kan bevise det motsatte!)

   return (true)




Puh! Håper detta er rektig, da!!


_BT_


... OFFLINE 1.42

--- BBBS/2 v3.14.95 RämiWörk-6
 * Origin: Errors HQ: Programming & emulators, +47-56350198 (47:55/103)
===============================================================================