Sie sind auf Seite 1von 1

(*3D Watson algorithm for Delaunay tessellation*)

(*Author: Yi Zhang @ Oregon State Univ.*)


Remove["Global*"]
p = RandomReal[{0, 10}, {10, 3}];
Needs["ComputationalGeometry"]
p0 = {{-2, -2, -2}, {30, -2, -2}, {-2, 30, -2}, {-2, -2, 60}} //
N;(*Enlosing tetrahedron*)
p = Join[p0, p];
tet = {{1, 2, 3, 4}};(*Enlosing tetrahedron for initialization*)
(*bars belong to tetrehedrons in list "tetlist"*)
bar[tetlist_] :=
Union[Sort /@ ((Permutations[#, {2}] & /@ tetlist) //
Flatten[#, 1] &)];
(*facets belong to tetrehedrons in list "tetlist"*)
face[tetlist_] :=
Union[Sort /@ Flatten[Partition[#, 3, 1, 1] & /@ tetlist, 1]];
plottet[tetlist_] :=
Graphics3D[Line[#] & /@ (p[[#]] & /@ (bar[tetlist])),
Boxed -> False];
v[{p1_, p2_, p3_, p4_}] :=
Abs[(p2 p1).((p3 - p1)\[Cross](p4 - p1))]/6;(*volumn of a tetrahedron*)
(*radius of circumsphere*)
r[{p1_, p2_, p3_, p4_}] :=
Norm[Norm[p4 - p1]^2*((p2 - p1)\[Cross](p3 - p1)) +
Norm[p3 - p1]^2*((p4 - p1)\[Cross](p2 - p1)) +
Norm[p2 - p1]^2*((p3 - p1)\[Cross](p4 - p1))]/(12 v[{p1, p2, p3,
p4}]);
(*Center of circumsphere*)
c[{p1_, p2_, p3_, p4_}] :=
p1 + (Norm[p4 - p1]^2*((p2 - p1)\[Cross](p3 - p1)) +
Norm[p3 - p1]^2*((p4 - p1)\[Cross](p2 - p1)) +
Norm[p2 - p1]^2*((p3 - p1)\[Cross](p4 - p1)))/(2 (p2 p1).((p3 - p1)\[Cross](p4 - p1)));
newtet[tetlist_, id_] :=
Module[{deltet, face0, face1, face2, keepface, addtet},
deltet = Select[tetlist, Norm[p[[id]] - c[p[[#]]]] < r[p[[#]]] &];
face0 = {{1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4}};
face1 = face[deltet];
face2 = face[Complement[tetlist, deltet]];
keepface = face1 \[Intersection] (face2 \[Union] face0);
addtet = Sort /@ (List[id, Sequence @@ #] & /@ keepface);
Union[Complement[tetlist, deltet], addtet]
];
meshtet[p_] := Fold[newtet, tet, Range[5, Length[p]]];

Das könnte Ihnen auch gefallen