Use Delauney triangulation to minimize minimum angle
This commit is contained in:
parent
594bef6dcb
commit
4b2a90321a
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,6 @@
|
||||||
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
||||||
with Ada.Text_IO; use Ada.Text_IO;
|
with Ada.Text_IO; use Ada.Text_IO;
|
||||||
|
with Ada.Numerics.Generic_Elementary_Functions; use Ada.Numerics;
|
||||||
|
|
||||||
package body Dtm.Surface is
|
package body Dtm.Surface is
|
||||||
Zero : constant Dtm_Value := Dtm_Value(0);
|
Zero : constant Dtm_Value := Dtm_Value(0);
|
||||||
|
@ -123,7 +124,6 @@ package body Dtm.Surface is
|
||||||
Add_Left(SV, G);
|
Add_Left(SV, G);
|
||||||
Add_Right(SV, G);
|
Add_Right(SV, G);
|
||||||
end Add_Sides;
|
end Add_Sides;
|
||||||
|
|
||||||
|
|
||||||
procedure Constrain(SV : in out Surface_Vector; Scale_Factor : Dtm_Value) is
|
procedure Constrain(SV : in out Surface_Vector; Scale_Factor : Dtm_Value) is
|
||||||
begin
|
begin
|
||||||
|
@ -134,13 +134,20 @@ package body Dtm.Surface is
|
||||||
end loop;
|
end loop;
|
||||||
end loop;
|
end loop;
|
||||||
end Constrain;
|
end Constrain;
|
||||||
|
|
||||||
|
function Vector_Length(V : Point) return Dtm_Value is
|
||||||
|
package Dtm_Math is new Generic_Elementary_Functions(Dtm.Dtm_Value); use Dtm_Math;
|
||||||
|
begin
|
||||||
|
return Sqrt(V.X**2 + V.Y**2 + V.Z**2);
|
||||||
|
end Vector_Length;
|
||||||
|
|
||||||
procedure Surface_From_Grid(Triangles : in out Surface_Vector; Data : Dtm_Data) is
|
procedure Surface_From_Grid(Triangles : in out Surface_Vector; Data : Dtm_Data) is
|
||||||
Grid : Dtm_Grid := Data.Grid;
|
Grid : Dtm_Grid := Data.Grid;
|
||||||
begin
|
begin
|
||||||
for X in Grid'First(1) .. Grid'Last(1) - 1 loop
|
for X in Grid'First(1) .. Grid'Last(1) - 1 loop
|
||||||
for Y in Grid'First(2) .. Grid'Last(2) - 1 loop
|
for Y in Grid'First(2) .. Grid'Last(2) - 1 loop
|
||||||
declare
|
declare
|
||||||
|
-- Option 1
|
||||||
T1_P1 : Point := (Dtm_Value(X), Dtm_Value(Y), Grid(X, Y));
|
T1_P1 : Point := (Dtm_Value(X), Dtm_Value(Y), Grid(X, Y));
|
||||||
T1_P2 : Point := (Dtm_Value(X+1), Dtm_Value(Y), Grid(X+1, Y));
|
T1_P2 : Point := (Dtm_Value(X+1), Dtm_Value(Y), Grid(X+1, Y));
|
||||||
T1_P3 : Point := (Dtm_Value(X+1), Dtm_Value(Y+1), Grid(X+1, Y+1));
|
T1_P3 : Point := (Dtm_Value(X+1), Dtm_Value(Y+1), Grid(X+1, Y+1));
|
||||||
|
@ -150,10 +157,29 @@ package body Dtm.Surface is
|
||||||
T2_P2 : Point := (Dtm_Value(X+1), Dtm_Value(Y+1), Grid(X+1, Y+1));
|
T2_P2 : Point := (Dtm_Value(X+1), Dtm_Value(Y+1), Grid(X+1, Y+1));
|
||||||
T2_P3 : Point := (Dtm_Value(X), Dtm_Value(Y+1), Grid(X, Y+1));
|
T2_P3 : Point := (Dtm_Value(X), Dtm_Value(Y+1), Grid(X, Y+1));
|
||||||
Tri2 : Triangle := (T2_P1, T2_P2, T2_P3);
|
Tri2 : Triangle := (T2_P1, T2_P2, T2_P3);
|
||||||
|
|
||||||
|
O1_Length : Dtm_Value := Vector_Length(T1_P1 - T1_P3);
|
||||||
|
|
||||||
|
-- Option 2
|
||||||
|
T3_P1 : Point := (Dtm_Value(X), Dtm_Value(Y), Grid(X, Y));
|
||||||
|
T3_P2 : Point := (Dtm_Value(X+1), Dtm_Value(Y), Grid(X+1, Y));
|
||||||
|
T3_P3 : Point := (Dtm_Value(X), Dtm_Value(Y+1), Grid(X, Y+1));
|
||||||
|
Tri3 : Triangle := (T3_P1, T3_P2, T3_P3);
|
||||||
|
|
||||||
|
T4_P1 : Point := (Dtm_Value(X+1), Dtm_Value(Y), Grid(X+1, Y));
|
||||||
|
T4_P2 : Point := (Dtm_Value(X+1), Dtm_Value(Y+1), Grid(X+1, Y+1));
|
||||||
|
T4_P3 : Point := (Dtm_Value(X), Dtm_Value(Y+1), Grid(X, Y+1));
|
||||||
|
Tri4 : Triangle := (T4_P1, T4_P2, T4_P3);
|
||||||
|
|
||||||
|
O2_Length : Dtm_Value := Vector_Length(T3_P2 - T3_P3);
|
||||||
begin
|
begin
|
||||||
null;
|
if O1_Length < O2_Length then
|
||||||
Triangles.Append(Tri1);
|
Triangles.Append(Tri1);
|
||||||
Triangles.Append(Tri2);
|
Triangles.Append(Tri2);
|
||||||
|
else
|
||||||
|
Triangles.Append(Tri3);
|
||||||
|
Triangles.Append(Tri4);
|
||||||
|
end if;
|
||||||
end;
|
end;
|
||||||
end loop;
|
end loop;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
|
@ -14,9 +14,6 @@ package body Stl is
|
||||||
R.X := A.Y * B.Z - A.Z * B.Y;
|
R.X := A.Y * B.Z - A.Z * B.Y;
|
||||||
R.Y := A.Z * B.X - A.X * B.Z;
|
R.Y := A.Z * B.X - A.X * B.Z;
|
||||||
R.Z := A.X * B.Y - A.Y * B.X;
|
R.Z := A.X * B.Y - A.Y * B.X;
|
||||||
if R.Z < 0.0 then
|
|
||||||
R.Z := -R.Z;
|
|
||||||
end if;
|
|
||||||
return R;
|
return R;
|
||||||
end Cross;
|
end Cross;
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ procedure Tesselada is
|
||||||
Input : File_Type;
|
Input : File_Type;
|
||||||
Minimum_Thickness : constant := 1.0;
|
Minimum_Thickness : constant := 1.0;
|
||||||
Z_Scaling_Value : constant := 10.0;
|
Z_Scaling_Value : constant := 10.0;
|
||||||
Max_X_Y_Dimension : constant := 100.0;
|
Max_X_Y_Dimension : constant := 244.0;
|
||||||
begin
|
begin
|
||||||
Ada.Text_IO.Put_Line("Tess started.");
|
Ada.Text_IO.Put_Line("Tess started.");
|
||||||
Open(Input, In_File, "sample-data/katie.dat");
|
Open(Input, In_File, "sample-data/katie.dat");
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
project Tesselada is
|
||||||
|
for Source_Dirs use ("src");
|
||||||
|
for Object_Dir use "obj";
|
||||||
|
for Main use ("tesselada.adb");
|
||||||
|
end Tesselada;
|
Loading…
Reference in New Issue