-
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ą
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
- 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
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
- Ada 2022 Language Reference Manual to be Published by Springer
- Press Release - AEiC 2023, Ada-Europe Reliable Softw. Technol.
- Ada-Europe - AEiC 2023 early registration deadline approaching
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2023
- Ile cykli zajmuje mnożenie liczb 64-bitowych?
Najnowsze wątki
- 2024-07-01 W-wa naklejki wjazd do centrum
- 2024-07-01 ładowarka zmarła
- 2024-07-01 Koder szuka pracy. Koduję w j.: Asembler, C, C++ (z Qt) i D.
- 2024-07-01 Kraków => Kierownik Działu Spedycji Międzynarodowej <=
- 2024-07-01 Białystok => Full Stack Web Developer (.Net Core, Angular6+) <=
- 2024-07-01 Berlin => Technical Rollouter (Radio Systems Software Installation and
- 2024-07-01 Warszawa => Key Account Manager <=
- 2024-07-01 Gdańsk => Programista Full Stack .Net <=
- 2024-07-01 Zabrze => Junior HelpDesk <=
- 2024-07-01 Warszawa => Key Account Manager <=
- 2024-07-01 Bielsko-Biała => Expert Migration Architect (Azure) <=
- 2024-07-01 Mini Netykieta polskich grup dyskusyjnych
- 2024-07-01 Re: Jak wypełnić polecenie francuskiego sądu blokowania niektórych zapytań DNS? Blokując Francję
- 2024-07-01 Re: Powtórne wezwanie na PO-komisję uzdrowi Ziobrę już w 10 dni
- 2024-07-01 CA -- problem z logowaniem