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