Ytberäkningar av Polygoner ligger lite neutralt under "Systemutveckling Generellt" Hej Sven, Vill inte låta okunnig . Men kan inte hålla mig. Precis som du säger så är en konvex polygon en polygon som "buktar utåt". Som en t ex stoppskylt ungefär. Se denna länk för ett exempel på en konvex och en konkav polygon : Aha var det så enkelt. Testade en Konkav enl nedan tycker att det blir rätt. Har nu lagt in din funktion efter Jans metod.Fy fae vad duktiga Ni är att fixa detta så snabbt. Läste nyss definitionen på konvex. (Vet inte om det var exakt så här, men det är ju ganska självklart) Den definitionen är solklar och jag känner igen den från mina matematikstudier. Det är dock en definition som är av karaktären "lättare sagt än gjort" :-) Naturligtvis går det inte att använda definitionen i praktiken. =) Intressant att följa "snille spekulerar" tror att jag förstår det mesta Ni Hultan skrev:Mattesnille Polygon Area
så jag tillåter mig att sk. dubbelposta även här.
Skulle vara intressant att få reda på om det här programmet räknar rätt Programarkivet:Polygon beräkna Area
Mina mattekunskaper sträcker sig bara till Trianglar och Kvadrater,där funkar det.Sv: Mattesnille Polygon Area
Det verkar fungera på konvexa polygoner, t ex :
0,0
6,-1
8,0
6,3
3,3
0,0
som har arean 20,5. Denna ger korrekt resultat. Men det exemplet som Niklas Jansson gav i Systemutvecklings-tråden fungerar inte :
0,0
9,0
9,5
7,5
7,2
3,5
0,5
0,0
Ditt program ger storleken 60 men korrekt svar är 39 om jag räknat rätt. Jag har skrivit om funktionen CalculateArea så att den använder Jans metod (som han föreslog i Systemutvecklingstråden) :
<code>
Function CalculateArea(ByVal GridSpacing As Integer) As Double
Dim Area As Double
For N = 1 To UBound(c) - 1
Area = Area + (c(N + 1).X - c(N).X) * (c(N + 1).Y + c(N).Y)
Next
Area = Area + (c(1).X - c(UBound(c)).X) * (c(1).Y + c(UBound(c)).Y)
Area = Area / 2 / GridSpacing / GridSpacing
CalculateArea = Round(Area, 10)
End Function
</code>Sv: Mattesnille Polygon Area
Vad är en konvex polygon ? och vad är motsatsen ? Konvex buktar utåt(översida hand).Sv: Mattesnille Polygon Area
http://www.abc.se/~m9847/matmin/polygon.html
Sedan verkar man skilja på komplexa och icke-komplexa polygoner vilket kan ses på följande länk :
http://www.alienryderflex.com/polygon/Sv: Mattesnille Polygon Area
X = 0 Y = 0
X = 4 Y = 0
X = 4 Y = 4
X = 2 Y = 2
X = 0 Y = 4
X = 0 Y = 4
X = 0 Y = 0
Svaret blir 12 Rätt. Något förbiseende från min sida ?Sv: Mattesnille Polygon Area
Störtimpad. Har nu lagt en korrigerad version i FilArean Programarkivet:Polygon beräkna AreaSv: Mattesnille Polygon Area
Tag en godtrycklig punkt P och en godtycklig punkt Q inuti polygonen, och kalla linjen som går mellan P och Q för L. Om hela L ligger i polygonen för alla P och Q så är polygonen konvex.
Så hade vi löst det... =)Sv: Mattesnille Polygon Area
Skulle man programmera en funktion IsConvex som avgör huruvida polygonen är konvex enligt den definitionen så skulle det bli jobbigt :-)
Kunde man inte definiera en konvex polygon som att varje linje i polygonen ska "vrida sig åt vänster" (alternativt åt höger). Man skulle nog kunna utnyttja formeln för vinkeln mellan två räta linjer :
tan(µ)=+/- (k1-k2)/(1+k1*k2)
där k1 är riktningskoefficienten för linje L1 och k2 för linje L2. Med denna så borde man kunna säga att
(k1-k2)/(1+k1*k2)>0 (alt <0)
för alla linjer i polygonen, eller något sådant. Spånar bara lite...Sv: Mattesnille Polygon Area
Problemet med din variant är att man inte kan upptäcka om det är en polygon som korsar sig själv, men vid närmare eftertanke kunde man ju tänka sig att kolla på totalsumman. Är jag inte helt ute och cyklar nu så kan den inte överstiga PI radianer.
Fast jag tror fortfarande det är enklast med en metod med orientering mha determinanter. De är ganska snabba att beräkna och man får resultatet direkt.Sv: Mattesnille Polygon Area
skriver , tycker det var en förbaskat bra tråd.Såg för många år sedan en vbx
som byggde på polygoner och USAkartan med deras stater.
Om man klickade inom en stats polygon så "vipps" hände det Datasaker.
Nu förstår jag mer om detta Tack.Sv: Mattesnille Polygon Area
(k1-k2)/(1+k1*k2)>0 (alt <0)
Varför dela med (1+k1*k2) ?? den producerar ju ett odefinierat värde om k1 * k2 = -1 (rätvinkliga) så en kub skulle inte fungera teoretiskt
är det inte lättare att bara kolla om k1 > k2 (alt. <)
orkar inte kolla om ovanstående stämmer eftersom det är ganska sent...