.[ ČeskéHry.cz ].
Problém s polygonem a určením bodu uvnitř

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 19. říjen 2012, 19:12:04    Předmět: Problém s polygonem a určením bodu uvnitř Odpovědět s citátem

Čau...

nějak jsem se rozjel s tématy... každopádně, celý den řeším kravinu a nemůžu najít chybu.
Mám polygon (trojuhelnik pro jednoduchost) a chci určit bod uvnitř.. úplně stupidním testem - každá hrana vs. bod a všechna znaménka musejí být stejná.
Problém je, že mi to nefunguje a nemůžu najít proč...
polygon si vykreslím - je OK
spočítám se znaménkovou plochu - je OK
projdu všechny hrany a zjistím že koncový bod jedné = počáteční druhé - OK

pak vezmu každý bod uvnitř a udělám sign test... a výsledek je tohle:


Seznam vrcholů polygonu (start index - end index [start vrchol] - [end vrchol], kdyby někdo chtěl vidět: http://www.perry.cz/files/s.txt. Seřazeno by to mělo být CCW

Znaménkový test co mám:
kód:

for (všechna [x,y])
{
in = true;
for (uint32 i = 0; i < border.size(); i++)
{
MyMath::Vector2 a = vertices[border[i].v0];
MyMath::Vector2 b = vertices[border[i].v1];
MyMath::Vector2 c = MyMath::Vector2(x, y);

float val = ((b.X - a.X)*(c.Y - a.Y) - (b.Y - a.Y)*(c.X - a.X));
if (val < 0)
{
in = false;
break;
}
}

if (in) drawPoint(x, y);
}


Co je ovšem zajímavé, že pokud místo trojúhelníku udělám obdélník, tak vše funguje OK. Pokud udělám třeba kružnici, tak se mi vybarví asi 3/4 a tvar je něco jako 8-úhelník. Koukal jsem, jestli to třeba nedělá float aritmetika, taky jsem nazjistil že by mi výsledky vycházeli okolo 0.
Vážně jsem z toho už blbej Confused [/url]
_________________
Perry.cz


Naposledy upravil perry dne 19. říjen 2012, 22:50:58, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 19. říjen 2012, 20:18:41    Předmět: problem Odpovědět s citátem

zdravim,

ten trojuholnik ma byt akoze cely cerveny?? v poslednom case menej
chapem kym to nedostanem priamo na podnose, hmm...

zatim...
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 19. říjen 2012, 21:37:57    Předmět: Odpovědět s citátem

Jj.. přesně tak.. ten trojúhelník by měl být celý červený
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 19. říjen 2012, 22:08:37    Předmět: Odpovědět s citátem

Předpokládám, že řádek s
kód:
float val = ((b.X - a.X)*(c.Y - a.Y) - (b.Y - a.Y)*(c.X - a.X));
je něco jako 2D "vektorový" součin...dost se to tak tváří.
Neměl by být bod C vztažen k počátečnímu bodu hrany polygonu namísto k počátku souřadného systému? Když jsem dělal point-in-polygon test já, tak jsem navíc musel projít alespoň dvě hrany, abych zjistil, zda-li se znaménka liší...na druhou stranu, pokud máš hrany orientované jedním směrem (buď CW nebo CCW), tak Ti vlastně stačí najít jen jedno znaménko...což ten tvůj kód vlastně dělá...
A nemusí se při každém testu bodu resetovat proměnná notIn?
Víc mě nenapadá...bych si to musel naimplementovat a zkusit...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 19. říjen 2012, 22:42:48    Předmět: Odpovědět s citátem

kód:
float val = (a.X*b.Y + a.Y*c.X + b.X*c.Y) - (b.Y*c.X + a.Y*b.X + a.X*c.Y);


a proc kreslis bod pri splneni podminky notIn, kdyz rikas, ze chces kreslit body, ktere tam jsou?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 19. říjen 2012, 22:50:17    Předmět: Odpovědět s citátem

Jo.. to mi v tom postu v kodu vypadlo.. proměnnou notIn resetuju... Proč se to jmenuje notIn.. no protože jsem to blbě pojmenoval Very Happy.. Upravil jsem ten kod v prvnim postu
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 19. říjen 2012, 23:06:02    Předmět: Odpovědět s citátem

Takže rychle jsem napsal halfspace rasterizaci v C# - kód vypadá cca takto:
kód:
// Render single polygon
for(int x = 0; x < rasterizer.Width; x++)
{
    for(int y = 0; y < rasterizer.Height; y++)
    {
        bool inside = true;

        for (int i = 0; i < borders.Count(); i++)
        {
            Vector2 a = borders[i][0];
            Vector2 b = borders[i][1];
            Vector2 c = new Vector2((float)x, (float)y);

            if ((a.X - b.X) * (c.Y - a.Y) - (a.Y - b.Y) * (c.X - a.X) > 0)
            {
                inside = false;
                break;
            }
        }

        if (inside)
        {
            ((Bitmap)rasterizer.Image).SetPixel(x, y, Color.FromArgb(255, 255, 0, 0));
        }
    }
}


A funguje úplně bez problému, takže v znaménkovém testu to nebude (takže zbývá zřejmě zkontrolovat hrany).

Zkus hrany def. vertexy (6 verts = 3 edges):
(50, 50); (250, 70); (250, 70); (140, 210); (140, 210); (50, 50);
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 20. říjen 2012, 06:36:57    Předmět: Re: Problém s polygonem a určením bodu uvnitř Odpovědět s citátem

Robustní a jednoduchý obecný point-in-polygon test je tady:
http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

Pokud chceš něco rychlého, tak si asi rasterizovat hrany do bufferu a pak si vytáhnout segmenty (even-odd) a ty vyplnit zvlášť, dělat per pixel test se mi zdá dost pomalé.
Pokud hledáš něco hotového, je tady anti-grain geometry, ten to umí i s antialisingem podle pixel coverage.

Pak je další možnost si to ztriangulovat, nějaké linky jsou tady: http://vterrain.org/Implementation/Libs/triangulate.html
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 20. říjen 2012, 07:47:51    Předmět: Odpovědět s citátem

Zatím mi nejde o rychlost, ale jenom o jednoduché vyzkoušení principu... hrany mám definované jak psal Vilem Otte (viz. soubor co jsem linkoval).
Hrany se tváří OK

Co mi např. nejde do hlavy, že to funguje pro obdélník úplně OK... nebo pro kružnici že to vyplní střed.. ale pak čím blíž jsem ke hraně, tím víc se to podělá
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 20. říjen 2012, 08:26:26    Předmět: Odpovědět s citátem

perry napsal:
čím blíž jsem ke hraně, tím víc se to podělá


Zkus double.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 20. říjen 2012, 08:35:01    Předmět: Odpovědět s citátem

perry napsal:
Zatím mi nejde o rychlost, ale jenom o jednoduché vyzkoušení principu... hrany mám definované jak psal Vilem Otte (viz. soubor co jsem linkoval).
Hrany se tváří OK

Co mi např. nejde do hlavy, že to funguje pro obdélník úplně OK... nebo pro kružnici že to vyplní střed.. ale pak čím blíž jsem ke hraně, tím víc se to podělá

Hmm, kód, co jsi psal ty a co psal Vilém je ekvivalentní. Pokud to jemu funguje a tobě ne, tak bude problém asi někde jinde Smile

EDIT: Teď jsem zkusil tvůj kód a na trojúhelník mi to funguje bez problémů. Floatama to určitě nebude, bude to IMHO nějaká uplná blbost Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 20. říjen 2012, 08:53:55    Předmět: Odpovědět s citátem

Hm.. tak chyba je v polygonu... ona totiž v tom rastru neni vidět, ale na pár místech vz. nekonvexita... tzn., že ten test selhával. Proto všechno vypadalo OK, ale nebylo OK... a nenapadlo mě tu nekonvexitu hledat...
Všem díky za rady a pomoc Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 20. říjen 2012, 08:55:31    Předmět: Odpovědět s citátem

perry napsal:
Hm.. tak chyba je v polygonu... ona totiž v tom rastru neni vidět, ale na pár místech vz. nekonvexita... tzn., že ten test selhával. Proto všechno vypadalo OK, ale nebylo OK... a nenapadlo mě tu nekonvexitu hledat...
Všem díky za rady a pomoc Smile

Pokud chceš konkávní polygony, zkus ten test, co jsem ti na něj posílal link. Ten si s tím poradí.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 20. říjen 2012, 09:07:54    Předmět: Odpovědět s citátem

Jj.. ten jsem právě použil a tim zjistil, že to je konkávní nejspíš Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna