-
Notifications
You must be signed in to change notification settings - Fork 1
/
mesherator.rb
52 lines (42 loc) · 1.26 KB
/
mesherator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
require 'sinatra'
require 'json'
require_relative 'lib/mesherator'
if Rack::Utils.respond_to?("key_space_limit=")
Rack::Utils.key_space_limit = 262144
end
get '/' do
send_file File.expand_path('index.html', settings.public_folder)
end
post '/triangulate/:fast_or_slow' do
content_type :json
if params[:fast_or_slow] == 'slow'
triangulate(json_to_vector3_list(params[:points]))
else
triangulate_ffi(json_to_vector3_list(params[:points]))
end
end
def vector3_to_hash(vector3)
{ x: vector3.x, y: vector3.y, z: vector3.z }
end
def triangle_to_array_of_vector3_hashes(triangle)
[
vector3_to_hash(triangle.first_vertex),
vector3_to_hash(triangle.second_vertex),
vector3_to_hash(triangle.third_vertex)
]
end
def triangulate(points)
triangulator = Mesherator::DelaunayTriangulator.new(points)
triangulator.triangulate.map { |triangle|
triangle_to_array_of_vector3_hashes(triangle)
}.to_json
end
def triangulate_ffi(points)
triangulator = Mesherator::TriangleFFI::DelaunayTriangulator.new(points)
triangulator.triangulate.map { |triangle|
triangle_to_array_of_vector3_hashes(triangle)
}.to_json
end
def json_to_vector3_list(points)
points.values.map { |p| Mesherator::Vector3.new(p['x'].to_f, p['y'].to_f, p['z'].to_f) }
end