eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingEliminacja podwójnych wierzchołków = uniq na liście cyklicznej › Eliminacja podwójnych wierzchołków = uniq na liście cyklicznej
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: Borneq <b...@a...hidden.pl>
    Newsgroups: pl.comp.programming
    Subject: Eliminacja podwójnych wierzchołków = uniq na liście cyklicznej
    Date: Thu, 06 Nov 2014 16:15:30 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 78
    Message-ID: <m3g3bl$11v$1@node2.news.atman.pl>
    NNTP-Posting-Host: 91.239.205.62
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1415286966 1087 91.239.205.62 (6 Nov 2014 15:16:06 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Thu, 6 Nov 2014 15:16:06 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101
    Thunderbird/31.2.0
    Xref: news-archive.icm.edu.pl pl.comp.programming:206849
    [ ukryj nagłówki ]

    Jak przepisać jeden wielokąt na inny zamieniając się duplikujące się
    (lub zwielokrotnione) wierzchołki oznaczające krawędzie długości zero?
    Problem wydaje się banalny, oto przelatujemy w pętli listę wierzchołków
    i kopiujemy do drugiej listy tylko gdy się różnią i tylko wtedy
    zwiększamy drugi indeks.
    Ale problemy są:
    - jest to lista cykliczna, musimy usuwać ostatni równy pierwszemu
    - chcę by pierwszy punkt pozostał pierwszym, choć ten warunek jest nie
    taki ważny
    - mogą być całe serie, więcej niż dwa takie same

    Najpierw zliczamy ilość powtórek, to proste i działa dobrze:
    int cntZeroLen = 0;
    for (int i = 0; i < polyIn->n; i++)
    {
    Point P0 = polyIn->pts[i];
    Point P1;
    if (i<polyIn->n - 1)
    P1 = polyIn->pts[i + 1];
    else
    P1 = polyIn->pts[0];
    if (P0.x==P1.x && P0.y==P1.y)
    cntZeroLen++;
    }
    To potrzebne do zaalokowania miejsca w drugim
    tmpPoly.SetSize(polyIn->n - cntZeroLen);

    Komplikuje się przepisywanie:
    if (polyIn->n>=1) tmpPoly.pts[0] = polyIn->pts[0];
    int ii=1;
    for (int i = 1; i < polyIn->n; i++)
    {
    Point prevp = polyIn->pts[i-1];
    Point p = polyIn->pts[i];
    if (i<polyIn->n-1)
    {
    if (prevp.x!=p.x || prevp.y!=p.y)
    {
    tmpPoly.pts[ii] = polyIn->pts[i];
    ii++;
    }
    }
    else
    {
    Point firstP = polyIn->pts[0];
    if ((prevp.x!=p.x || prevp.y!=p.y)
    && (firstP.x!=p.x || firstP.y!=p.y))
    {
    tmpPoly.pts[ii] = polyIn->pts[i];
    ii++;
    }
    }
    }
    Najpierw osobno obrabiam punkt zerowy, potem inaczej zwykłe a inaczej
    ostatni, ale to i tak nie działa gdy na końcu mamy więcej niż dwa jednakowe.
    Przykład: nie działało dla:
    n=77
    [0]=[1]
    [72]=[73]
    [75]=[76]
    [76]=[0]
    czyli cała czwórka [75]=[76]=[0]=[1]
    W pętli mieliśmy
    tmp[1]:=in[2]
    tmp[2]:=in[3]
    tmp[3]:=in[4]
    ......
    tmp[69]:=in[70]
    tmp[70]:=in[71]
    tmp[71]:=in[72]
    tmp[72]:=in[74]
    tmp[73]:=in[75]
    Jak widać, źle jest dla tmp[73]:=in[75], bo in[75]=in[0]
    A może jakoś cyklicznie usuwać też zerowy?
    Problem trudniejszy niż działanie procedury uniq, która usuwa duplikaty
    bo mamy listę cykliczną


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: