Zależności pomiędzy punktami płaszczyzny

0

Mam pytanie dotyczące ustalania zależności pomiędzy punktami na płaszczyźnie.

Sytuacja wygląda następująco: istnieje nieograniczony zbiór punktów, każdy z nich ma swój unikalny identyfikator, współrzędne x i y. Dalej dane są zależności między nimi w formie par (punkt1, punkt2). Ogólnie tworzą acykliczny, nieskierowany graf. Zrealizowałem to umieszczając w pierwszej tabeli punktID, x, y, a w drugiej pary powiązanych ze sobą punktów (punkt1, punkt2). Na początek dla każdego punktu chcę ustalić z iloma innymi jest powiązany (unikając powtórzeń typu {p1, p2} - {p2, p1}), a potem wyodrębnić grupy punktów. Tutaj planuję przyjąć kryterium: jeżeli pewna liczba punktów leży w ustalonej jako 'bliska' odległości od siebie to stanowią one grupę. Marzy mi się uzależnienie tej 'pewnej liczby punktów' od ustalonego już procentu wszystkich istniejących punktów, a 'bliskiej' odległości od procentu średniej odległości pomiędzy każdym z punktów, ale to w tej chwili chyba już za wiele dla mnie.

Pierwszym pomysłem na ustalenie liczby punktów, z jakimi każdy z nich jest powiązany, jest funkcja z dwoma kursorami w środku, choć słyszałem, że ze względu na małą wydajność stosuje się je kiedy nie mamy już pomysłu na rozwiązanie. Nie jestem pewien, czy mogę ich używać w ten sposób, dlatego proszę o opinię o tym szkicu, ogólnym kierunku poszukiwań i szansach na to, by zrealizować to w sposób, o którym napisałem plus ewentualne uwagi: gdzie powinienem poszukać, żeby znaleźć rozwiązanie przy mojej raczej podstawowej wiedzy nt. baz danych.

drop function connections
GO
create function connections()
returns @hmp table (pointID varchar(1), hm int)
as											
begin										
	declare point_ID cursor for select pointID from points
	declare @pID varchar(1)
	open point_ID
	fetch next from point_ID into @pID
	while @@FETCH_STATUS = 0
	begin 
	
		declare relationsc cursor for
			select p1, p2 from relations
			declare @h1 varchar(1); declare @h2 varchar(1);
			open relationsc
				declare @temp int = 0
				fetch next from relationsc into @h1, @h1
				while @@FETCH_STATUS = 0
				begin
					if ((@pID = @h1) or (@pID = @h2)) --zwieksz licznik powiazan dla punktu
					fetch next from relationsc into @h1, @h1
				end
			close relationsc
			deallocate relationsc
	fetch next from point_ID into @pID
	
	end
			
	close point_ID
	deallocate point_ID -- alias PIDs
	
	return
end
0

Żeby tylko zliczenie zrobić żadne kursory nie są potrzebne.

select p1, sum(count) from
(
  select p1, count(*) as count from relations group by p1
  union all
  select p2, count(*) as count from relations group by p2
) as T
0

Byłem zmuszony odłożyć to zadanie, teraz wracam z odmiennym podejściem opartym jedynie na tabeli relacji, która zawiera pary punktów mających ze sobą jakiś związek. Wykorzystując wiedzę o ilości punktów, z jakimi połączony jest każdy z nich chcę na początek jako grupę zwrócić ciąg punktów, zaczynając od tego o największej liczbie połączeń, a kończąc na połączonym z ustaloną liczbą innych (w tej chwili jest to 4) punkcie. Stworzyłem karkołomny warunek złączenia, ale rezultat nie jest tym czego potrzebuję. W zamierzeniu warunek miał wybierać/dodawać do listy punktów rozpoczętej tym o danej liczbie połączeń punkty, które występują w jakiejś konfiguracji z wybranym środkiem grupy punktów w tabeli relacji (szukanie par (punkt, srodek), (srodek, punkt)), ale dostaję złe zestawy punktów, które nie są połączone tak jak chciałem i na dodatek są to 'ciągi' max 3 punktów. Jak mogę stworzyć taki 'ciąg' punktów, by reprezentował grupę? Myślałem o tabeli tymczasowej, bo potem te wstępnie wyselekcjonowane grupy chcę jeszcze potraktować dalszymi warunkami, ale mam problem już z zapisaniem tego pomysłu. Mogę prosić o pomoc?

select t3.Os, allr.*
from
(
		select t2.P as Os, t2.STP as PDegree
		from
		(
			select p1 as P, SUM(ile) as STP
			from
			(
			  select p1, COUNT(*) as ile from relations group by p1
			  union all
			  select p2, COUNT(*) as ile from relations group by p2
			) as t1
			group by t1.p1
		) as t2
		where t2.STP >= 4
) as t3
join
(
	select p1, p2
	from relations
) as allr
on ((cast(t3.Os as varchar)+cast(allr.p1 as varchar)) in (select cast(p1 as varchar)+cast(p2 as varchar) from relations))
or ((cast(t3.Os as varchar)+cast(allr.p2 as varchar)) in (select cast(p1 as varchar)+cast(p2 as varchar) from relations))
or ((cast(allr.p1 as varchar))+(cast(t3.Os as varchar)) in (select cast(p1 as varchar)+cast(p2 as varchar) from relations))
or ((cast(allr.p2 as varchar))+(cast(t3.Os as varchar)) in (select cast(p1 as varchar)+cast(p2 as varchar) from relations))

1 użytkowników online, w tym zalogowanych: 0, gości: 1