-
Data: 2014-11-06 16:15:30
Temat: Eliminacja podwójnych wierzchołków = uniq na liście cyklicznej
Od: Borneq <b...@a...hidden.pl> szukaj wiadomości tego autora
[ pokaż wszystkie 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ą
Następne wpisy z tego wątku
- 06.11.14 16:26 Borneq
- 06.11.14 16:46 Borneq
- 07.11.14 17:13 bartekltg
- 07.11.14 17:56 Borneq
- 07.11.14 18:34 bartekltg
- 07.11.14 18:36 Borneq
- 07.11.14 20:59 bartekltg
- 07.11.14 21:17 Borneq
Najnowsze wątki z tej grupy
- Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
Najnowsze wątki
- 2025-02-03 Awaria BNP Paribas
- 2025-02-03 kryminalni i dochodzeniowcy
- 2025-02-03 Szczecin => Senior Field Sales (system ERP) <=
- 2025-02-03 Bydgoszcz => Specjalista ds. Sprzedaży (transport drogowy) <=
- 2025-02-03 jaki zasilacz laboratoryjny
- 2025-02-03 jaki zasilacz laboratoryjny
- 2025-02-03 Puszka w ziemię
- 2025-02-03 Białystok => Full Stack web developer (obszar .Net Core, Angular6+) <
- 2025-02-03 Kraków => Programista Full Stack .Net <=
- 2025-02-03 Kraków => MS Dynamics 365BC/NAV Developer <=
- 2025-02-03 Bez żadnego trybu
- 2025-02-03 Gliwice => Business Development Manager - Network and Network Security
- 2025-02-03 Gliwice => IT Expert (Network Systems area) <=
- 2025-02-03 Lublin => Delphi Programmer <=
- 2025-02-03 Lublin => Programista Delphi <=