Mam taki problem.
Mam dane obiektu (kształt) który składa się z kilku tysięcy sześcianów. Oczywiście dla każdego szescianu znam numerację węzłów oraz dla każdego węzła posiadam współrzędne.
Gdzie w procedurze użyto zmienne:
numTriangles - ilość sześcianów
Triangles - numery poszczególnych węzłow kolejnego szescianu
Korzystając z biblioteki OpenGL wyświetlam cały obiekt poprzez generowanie tych kilku tysięcy sześcianów. Jednak trochę czasu to zajmuje. Więc pomysłałem aby wyświetlać tylko zewnętrzna powierzchnię. Napisałem procedure która znajduje która ściana każdego sześcianu jest tą zewnętrzną, poprzez sprawdzanie każdej ścianki danego szęscianu (cztery wspólne wierzchołki) z pozostałymi ściankami sześcianów. Jednak długo to trwa (około 25s). Zorientowałem się ze głównie przyczyną jest instrukcja sprawdzająca if. Więc potrzebuję jakiego nowego genalnego pomysłu na rozwiązanie tego problemu, bowiem chyba się sam zapętliłem.
procedure TForm1.Rys_Volume_Vertex;
var
i,j,k:integer;
a1,a2,a3,a4,a5,a6,a7,a8:integer;
begin
k:=0;
for i:=0 to numTriangles-1 do
begin
//przypisanie kolejnych wierzchołków do sprawdzania
a1:=Triangles[i].v1;
a2:=Triangles[i].v2;
a3:=Triangles[i].v3;
a4:=Triangles[i].v4;
a5:=Triangles[i].v5;
a6:=Triangles[i].v6;
a7:=Triangles[i].v7;
a8:=Triangles[i].v8;
for j:=0 to numTriangles-1 do
begin
if j<>i then //nie sprawdzaj tego samego sześcianu
begin
//prawy
if (a2=Triangles[j].v1) and (a3=Triangles[j].v4) and (a6=Triangles[j].v5) and (a7=Triangles[j].v8) then begin Edges[i,0]:=j; k:=k+1; end;
//góra
if (a5=Triangles[j].v1) and (a6=Triangles[j].v2) and (a7=Triangles[j].v3) and (a8=Triangles[j].v4) then begin Edges[i,1]:=j; k:=k+1; end;
//dol
if (a1=Triangles[j].v5) and (a2=Triangles[j].v6) and (a3=Triangles[j].v7) and (a4=Triangles[j].v8) then begin Edges[i,2]:=j; k:=k+1; end;
//lewy
if (a1=Triangles[j].v2) and (a5=Triangles[j].v6) and (a8=Triangles[j].v7) and (a4=Triangles[j].v3) then begin Edges[i,3]:=j; k:=k+1; end;
//front
if (a1=Triangles[j].v4) and (a2=Triangles[j].v3) and (a6=Triangles[j].v7) and (a5=Triangles[j].v8) then begin Edges[i,4]:=j; k:=k+1; end;
//back
if (a4=Triangles[j].v1) and (a3=Triangles[j].v2) and (a7=Triangles[j].v6) and (a8=Triangles[j].v5) then begin Edges[i,5]:=j; k:=k+1; end;
if k>=6 then break;
end; //if
end;//j
k:=0;
end;//i
end;
Jeszcze kilka wyjaśnień:
Jezeli znajdzie cztery takie same numeracje wierzchołków to zapisuje do tabliczy Edges[] numer sześcianu z którym ta ścianka się kontaktuje. Dodatkowo jezeli znajdzie ściankę to zwieksza wartość k. Jezeli wszystkie ścianki danego sześcianu mają kontakt czyli k=6 to nie ma sensu dalej sprawdzania i wyjście z petli poprzez break.
Jezeli ktos bedzie chciał przetestować swój pomysł mogę podesłąć plik z danymi.
Zdrówka
Kochgz