Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Monikulmion keskipiste

Sivun loppuun

pulis [19.09.2008 18:04:06]

#

tällainen geometrian kysymys.
2d tasossa on monikulmio, miten lasken sen keskipisteen?

ajattelin näin että rajaan reunapisteistä suorakaiteen
ja puolitan sitten sivujen pituudet, menikö oikein?

vehkis91 [19.09.2008 18:07:41]

#

vedät jokaisesta kulmasta viivan vastakkaiseen kulmaan niin viivojen leikkauspisteen pitäisi olla keskipiste.

Sanokaa joku jos olen väärässä.

Edit: mitään laskukaavaa en kyllä tiedä.

pulis [19.09.2008 18:12:00]

#

njoo, tarkennetaan tätä että kyseessä ei ole mikään säännöllinen monikulmio , vaan 3d meshi, jonka haluan keskittää

petrinm [19.09.2008 18:13:45]

#

Tuo tapa on aikas vaikea ja hidas tapa, eikä edes toimi kaikissa tapauksissa.
Miten olisi tämmäinen koodi: (javalle)

public Point getMedianPoint(final Polygon p)
{
   final int numVerts = p.npoints;
   int cx = 0, cy = 0;

   for(int i = 0;i < numVerts;i++)
   {
      cx += p.xpoints[i];
      cy += p.ypoints[i];
   }
   cx/=numVerts;
   cy/=numVerts;

   return new Point(cx,cy);
}

En nyt ehtynyt katso tarkimmin sitä, mutta kokeile. Tuo on kylläkin vain mediaani piste.

vehkis91 [19.09.2008 18:15:31]

#

Eikös se silti hae sen keskipisteen oli sitten minkämuotoinen tahansa? Mutta joo...

pulis [19.09.2008 18:18:48]

#

tuo näyttää ihan keskiarvon laskulta.
pitää varmaan väsätä joku testiohjelma ihan tätä ongelmaa varten
siinä menee taas yksi ilta..

petrinm [19.09.2008 19:22:58]

#

Huomioi että tuo on MEDIAANIPISTE, ei keskipiste.
Tästä kuvasta huomaat eron: http://img228.imageshack.us/my.php?image­=mediaanipisteed0.png
Vihreä piste on mediaanipiste ja sininen keskipiste.

Yksi tapa laskea keskipiste voisi olla laskea suorakulmion keskipiste, niin että suorakulmio olisi juuri polygonin kokoinen. En ole aivan varma onko tämä juurikin se tarkka keskipiste kaikissa tapauksissa.

Point getCenterPoint(Polygon p)
{
   int xMax, xMin, yMax, yMin;
   // Haetaan suurimmat ja pienimmät x:n ja y:n arvot ja lasketaan niiden keskiarvo

   for(int i = 0;i < p.npoints;i++)
   {
      xMax = MAX(xMax, p.xpoints[i])
      xMin = MIN(xMin, p.xpoints[i])
      yMax = MAX(yMax, p.ypoints[i])
      yMin = MIN(yMin, p.ypoints[i])
   }

   return new Point((xMax+xMin)/2, (yMax+yMin)/2);
}

edit: neliö > suorakulmio

Kray [19.09.2008 19:29:19]

#

Eikös tämä onnistu yksinkertaisesti laskemalla kaikkien pisteiden keskiarvo? Joskus kehittelin tällaisia pikkujuttuja, ja paperilla testaillessa se vaikutti toimivan aivan niin.

ByteMan [19.09.2008 19:38:46]

#

kray, meinaatkos siis että

monikulmio ABCDEF jossa
{ A(2,3), B(3,2), C(3,4), D(-6,-5), E(1,1), F(0,0) }

keskipisteen koordinaatit olisivat:
x=[2+3+3+(-6)+1+0]/6 = 3/6 && y=[3+2+4+(-5)+1+0]/6 = 5/6

näinkö siis tarkoitit vai ymmärsinkö väärin?

pulis [19.09.2008 19:51:01]

#

noniiin,
tesmin tuon mediaanin se näytti olevan suht keskellä, varmaksi en voi mennä vannomaan.
petrinm kertoi neliöstä,
tuossa alkuperäisessä ajatuksessani puhuin suorakaiteesta jonka sivut puolitetaan
ja tuo petrimin koodi tekee juuri sen..( huomaa suorakaide ei neliö )

mutta vielä on auki onko se the oikea keskipiste?

os [20.09.2008 12:21:24]

#

Tason alueilla ei normaalisti ole mitään yleispätevää keskipistettä kuten esimerkiksi ympyröillä. Yrität varmaankin löytää kuvion painopisteen

(x0, y0) = (Integraali alueen yli (x,y) dA) / (Integraali alueen yli dA),

jota et siis löydä millään yllä esitetyistä kaavoista. Painopisteen voi käytännössä laskea esimerkiksi jakamalla monikulmion kolmoihin ja laskemalla näiden painopisteiden keskiarvon painotettuna kolmoiden pinta-alalla.

User137 [20.09.2008 15:51:27]

#

1 vielä mainitsematon tapa on myös laskea suurimmat ja pienimmät x,y arvot ja laskea niiden keskiarvo:

keskiX = (suurinX+pieninX)/2
keskiY = (suurinY+pieninY)/2

Edit: eikun tämä olikin jo petrinm kommentissa.

pulis [20.09.2008 20:11:14]

#

miten olisi jos rajaisi mahdollisimman pienen ympyrän,
josta katsoisi keskipisteen?

petrinm [20.09.2008 20:34:56]

#

Sama tulos kuin suorakulmion kanssa, mutta paljon pitempien laskujen kautta.

Metabolix [20.09.2008 21:17:49]

#

petrinm kirjoitti:

Sama tulos kuin suorakulmion kanssa, mutta paljon pitempien laskujen kautta.

Ei, ei tule sama. Tämän voi todeta vaikkapa tasasivuisella kolmiolla. Mutta ei tuosta olennaisesti parempi tule.

Tee aivan oman mielesi mukaan, turha sitä on täällä kysellä. Oikean vastauksen sait jo os:lta: integroi.

Grez [21.09.2008 12:55:33]

#

Metabolix kirjoitti:

Oikean vastauksen sait jo os:lta: integroi.

Minun on kyllä vaikea kuvitella miten tuon integroinnin saisi käytännössä tehtyä helpommin kuin kolmioihin hajottamisen, jonka os myös ehdotti (joka sekään ei ole maailman yksinkertaisin juttu).

Itse en ehkä tekisi kuitenkaan sinänsä jakamalla kolmioihin vaan yksinkertaistamalla kulma kerrallaan ja laskemalla näin muodostuvia yli ja ali jääviä kolmioita.

Metabolix [21.09.2008 13:15:03]

#

Samaa integrointia se niinkin on, siinä vain helpotetaan laskuja hyödyntämällä valmista tietoa kolmion keskipisteestä. Integraalihan on oikeastaan vain summa äärettömästä joukosta, ja kolmioiden avulla voidaan korvata summasta kunkin kolmion pisteet ja pisteiden peittämät alat suoraan välituloksella, kolmion keskipisteellä ja kolmion alalla. (Kukapa sitä suoraa y=x lähtisi ensi töikseen "oikeasti" integroimaan, kun määrätyn integraalin saa suoraan pinta-alana?)

Vielä jos on tosiaan kyse 3D-meshistä, niin sehän ei keskity vain tuolla, että keskitetään sen jokin poikkileikkaus tai projektio yhdessä (tai edes kolmessa) tasossa. Siinä tämän integraalilaskennallisen kolmion korvaa tetraedri, ja mallin jakaminen tetraedreiksi tapahtuu aivan vastaavalla algoritmilla kuin polygonin jakaminen kolmioiksi.

Jos on jo olemassa hyvät algoritmit tarkistukseen, onko tietty piste mallin sisällä tai leikkaako tietty jana mallin, niin yksi approksimaatiokeino on käydä läpi tietyt pisteet (säännöllisesti tai arpomalla) mallia ympäröivästä laatikosta ja laskea sisään osuneiden pisteiden keskiarvo. Pienellä pistemäärällä tämä kuitenkin on epätarkkaa ja suurella hidasta.

Grez [21.09.2008 13:21:00]

#

Metabolix kirjoitti:

Samaa integrointia se niinkin on, siinä vain helpotetaan laskuja hyödyntämällä valmista tietoa kolmion keskipisteestä.

Tietenkin lopputulos on sama riippumatta siitä mitä (toimivaa) menetelmää käytetään.

Itse tulkitsin kuitenkin tuon integroinnin terminä tarkoittamaan sitä, että tehdään esim X:n osalta kuvion korkeutta x:n funktiona kuvaava funktio joka sitten integroidaan. Kommentillani tarkoitin, että mielestäni tällainen menetelmä olisi hankalahko.

Ja tosiaan, tässähän kysyttiin 3D meshistä. Olen ymmärtänyt, että mesh on pintamuoto, ei siis täytetty objekti. Näin ollen sen painopisteen laskemiseen käytetään mielestäni edelleen kolmioita eikä tetraedrejä. Eikös mesh-malli yleensä kolmioista (faces) joten mielestäni painopisteen laskeminen pitäisi sujua ihan triviaalisti tosiaan laskemalla kolmioiden painopisteet ja niiden pinta-alalla painotettu keskiarvo.

koo [21.09.2008 19:12:24]

#

Monenlaista määritelmää keskipisteelle... Toimisiko tämä?

Grez [21.09.2008 19:22:21]

#

koo kirjoitti:

Monenlaista määritelmää keskipisteelle... Toimisiko tämä?

Tuosta on varmaankin hyötyä kysyjälle. Huomauttaisin vielä että tuolla linkittämälläsi sivulla on puhe nimenomaan painopistettä (centroid) eli "massakeskispisteestä" ja sen määritelmä onkin ihan yksiselitteinen. Keskipiste terminä voi taas tarkoittaa vaikka mitä.

os [22.09.2008 10:29:05]

#

koo kirjoitti:

Monenlaista määritelmää keskipisteelle... Toimisiko tämä?

Sieltähän se vastaus löytyi. Yllättäen taas Paul Bourken sivuilta :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta