summaryrefslogtreecommitdiff
path: root/main.lua
blob: ae9595c85beb46f21b68d39d12c85761e18c9f04 (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
local G = love.graphics

local function plot(f,x0,xn)
	local n = 30
	x0 = x0 or G.inverseTransformPoint(0,0)
	xn = xn or G.inverseTransformPoint(G.getDimensions(),0)
	local h = (xn-x0)/n
	local ps = {}
	for x=x0,xn+h,h do
		local y = f(x)
		table.insert(ps,x)
		table.insert(ps,y)
		print(x,xn)
	end
	G.line(ps)
end


local function atanh(x)
	return (1/2) * math.log((1+x)/(1-x))
end

local function solve_for_A(r)
	local A
	if r < 3 then
		A = math.sqrt(6 * (r-1))
	else
		A = math.log(2*r) + math.log(math.log(2*r))
	end
	for i=1,5 do
		A = A - (math.sinh(A) - r*A)/(math.cosh(A)-r)
	end
	return A
end

local L = 20
function love.wheelmoved(x,y)
	L = L + (y/5)
end

local function catenary(x1,y1,x2,y2)
	y1 = -y1
	y2 = -y2
	local dx = x2-x1
	local dy = y2-y1
	local mx = (x1+x2)/2
	local my = (y1+y2)/2

	local D = math.sqrt(dx^2+dy^2)
	-- local L = D*1.2

	local r = math.sqrt(L^2 - dy^2)/dx
	local A = solve_for_A(r)

	local a = dx/(2*A)
	local b = mx - a*atanh(dy/L)
	local c = my - L/(2*math.tanh(A))

	return function(x) return -(a * math.cosh((x-b)/a) + c) end
end

local Ps = {{-1,1}, {1,1}}

function love.update(dt)
	for b = 1,2 do
		if love.mouse.isDown(b) then
			Ps[b] = {G.inverseTransformPoint(love.mouse.getPosition())}
		end
	end
end


function love.draw()
	local W,H = G.getDimensions()
	G.clear(1,1,1)
	G.setColor(0,0,0)
	G.origin()
	G.print(L,10,10)
	G.setLineWidth(0.01)
	G.translate(W/2,H/2)
	G.scale(150)

	-- G.setColor(0.8,0.8,0.8)
	-- G.line(-10,0,10,0)
	-- G.line(0,-10,0,10)

	-- G.circle('line',0,0,1)

	-- G.setColor(0,0,0)
	-- -- plot(function(x) return x^2 end)
	-- plot(math.tanh)
	-- G.setColor(0,1,0)
	-- plot(atanh)

	plot(catenary(Ps[1][1],Ps[1][2], Ps[2][1], Ps[2][2]),
		Ps[1][1], Ps[2][1])

	G.setColor(1,0,0)
	G.circle('fill',Ps[1][1],Ps[1][2],0.05)
	G.setColor(0,0,1)
	G.circle('fill',Ps[2][1],Ps[2][2],0.05)
end