mirror of
https://gitlab.com/gaelysam/mapgen_rivers.git
synced 2024-12-29 12:20:41 +01:00
Move geometry helpers back to heightmap.lua
This commit is contained in:
parent
6564d40b85
commit
0983c27cca
40
geometry.lua
40
geometry.lua
@ -1,40 +0,0 @@
|
|||||||
local sqrt, abs = math.sqrt, math.abs
|
|
||||||
local unpk = unpack
|
|
||||||
|
|
||||||
local function distance_to_segment(x1, y1, x2, y2, x, y)
|
|
||||||
-- get the distance between point (x,y) and segment (x1,y1)-(x2,y2)
|
|
||||||
local a = (x1-x2)^2 + (y1-y2)^2 -- square of distance
|
|
||||||
local b = (x1-x)^2 + (y1-y)^2
|
|
||||||
local c = (x2-x)^2 + (y2-y)^2
|
|
||||||
if a + b < c then
|
|
||||||
-- The closest point of the segment is the extremity 1
|
|
||||||
return sqrt(b)
|
|
||||||
elseif a + c < b then
|
|
||||||
-- The closest point of the segment is the extremity 2
|
|
||||||
return sqrt(c)
|
|
||||||
else
|
|
||||||
-- The closest point is on the segment
|
|
||||||
return abs(x1 * (y2-y) + x2 * (y-y1) + x * (y1-y2)) / sqrt(a)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function transform_quadri(X, Y, x, y)
|
|
||||||
-- To index points in an irregular quadrilateral, giving x and y between 0 (one edge) and 1 (opposite edge)
|
|
||||||
-- X, Y 4-vectors giving the coordinates of the 4 vertices
|
|
||||||
-- x, y position to index.
|
|
||||||
local x1, x2, x3, x4 = unpk(X)
|
|
||||||
local y1, y2, y3, y4 = unpk(Y)
|
|
||||||
|
|
||||||
-- Compare distance to 2 opposite edges, they give the X coordinate
|
|
||||||
local d23 = distance_to_segment(x2,y2,x3,y3,x,y)
|
|
||||||
local d41 = distance_to_segment(x4,y4,x1,y1,x,y)
|
|
||||||
local xc = d41 / (d23+d41)
|
|
||||||
|
|
||||||
-- Same for the 2 other edges, they give the Y coordinate
|
|
||||||
local d12 = distance_to_segment(x1,y1,x2,y2,x,y)
|
|
||||||
local d34 = distance_to_segment(x3,y3,x4,y4,x,y)
|
|
||||||
local yc = d12 / (d12+d34)
|
|
||||||
return xc, yc
|
|
||||||
end
|
|
||||||
|
|
||||||
return transform_quadri
|
|
@ -1,16 +1,51 @@
|
|||||||
local modpath = mapgen_rivers.modpath
|
local modpath = mapgen_rivers.modpath
|
||||||
|
|
||||||
local transform_quadri = dofile(modpath .. 'geometry.lua')
|
|
||||||
|
|
||||||
local sea_level = mapgen_rivers.settings.sea_level
|
local sea_level = mapgen_rivers.settings.sea_level
|
||||||
local riverbed_slope = mapgen_rivers.settings.riverbed_slope * mapgen_rivers.settings.blocksize
|
local riverbed_slope = mapgen_rivers.settings.riverbed_slope * mapgen_rivers.settings.blocksize
|
||||||
|
|
||||||
local out_elev = mapgen_rivers.settings.margin_elev
|
local out_elev = mapgen_rivers.settings.margin_elev
|
||||||
|
|
||||||
-- Localize for performance
|
-- Localize for performance
|
||||||
local floor, min, max = math.floor, math.min, math.max
|
local floor, min, max, sqrt, abs = math.floor, math.min, math.max, math.sqrt, math.abs
|
||||||
local unpk = unpack
|
local unpk = unpack
|
||||||
|
|
||||||
|
-- Geometrical helpers
|
||||||
|
local function distance_to_segment(x1, y1, x2, y2, x, y)
|
||||||
|
-- get the distance between point (x,y) and segment (x1,y1)-(x2,y2)
|
||||||
|
local a = (x1-x2)^2 + (y1-y2)^2 -- square of distance
|
||||||
|
local b = (x1-x)^2 + (y1-y)^2
|
||||||
|
local c = (x2-x)^2 + (y2-y)^2
|
||||||
|
if a + b < c then
|
||||||
|
-- The closest point of the segment is the extremity 1
|
||||||
|
return sqrt(b)
|
||||||
|
elseif a + c < b then
|
||||||
|
-- The closest point of the segment is the extremity 2
|
||||||
|
return sqrt(c)
|
||||||
|
else
|
||||||
|
-- The closest point is on the segment
|
||||||
|
return abs(x1 * (y2-y) + x2 * (y-y1) + x * (y1-y2)) / sqrt(a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function transform_quadri(X, Y, x, y)
|
||||||
|
-- To index points in an irregular quadrilateral, giving x and y between 0 (one edge) and 1 (opposite edge)
|
||||||
|
-- X, Y 4-vectors giving the coordinates of the 4 vertices
|
||||||
|
-- x, y position to index.
|
||||||
|
local x1, x2, x3, x4 = unpk(X)
|
||||||
|
local y1, y2, y3, y4 = unpk(Y)
|
||||||
|
|
||||||
|
-- Compare distance to 2 opposite edges, they give the X coordinate
|
||||||
|
local d23 = distance_to_segment(x2,y2,x3,y3,x,y)
|
||||||
|
local d41 = distance_to_segment(x4,y4,x1,y1,x,y)
|
||||||
|
local xc = d41 / (d23+d41)
|
||||||
|
|
||||||
|
-- Same for the 2 other edges, they give the Y coordinate
|
||||||
|
local d12 = distance_to_segment(x1,y1,x2,y2,x,y)
|
||||||
|
local d34 = distance_to_segment(x3,y3,x4,y4,x,y)
|
||||||
|
local yc = d12 / (d12+d34)
|
||||||
|
return xc, yc
|
||||||
|
end
|
||||||
|
|
||||||
-- Linear interpolation
|
-- Linear interpolation
|
||||||
local function interp(v00, v01, v11, v10, xf, zf)
|
local function interp(v00, v01, v11, v10, xf, zf)
|
||||||
local v0 = v01*xf + v00*(1-xf)
|
local v0 = v01*xf + v00*(1-xf)
|
||||||
|
Loading…
Reference in New Issue
Block a user