Weather routing: Difference between revisions

m
→‎{{header|Phix}}: find_range()
m (→‎{{header|Phix}}: find_range())
Line 980:
end function
 
function findfirstfind_range(atom v, sequence s)
-- Returns the indexindexes of s of the first element>=v, ofand sthe >=last <=v
for i=1 to length(s) do
if s[i]>=v then return i end if
for ij=length(s) to 1 by -1 do
if s[ij]<=v then return {i,j} end if
end for
exit
end if
end for
return {-1,-1}
end function
 
function findlast(atom v, sequence s)
-- Returns the index of the last element of s <= v
for i=length(s) to 1 by -1 do
if s[i]<=v then return i end if
end for
return -1
end function
function boatspeed(atom pointofsail, windspeed)
--
Line 1,002 ⟶ 999:
-- the previously loaded sailing polar data)
--
integer udeg{ld,ud} = findlastfind_range(pointofsail, degrees),
odeg{lv,uv} = findfirstfind_range(pointofsailwindspeed, degreeswinds),
if find(-1,{udegld, odegud, uvellv, oveluv}) then return -1 end if
uvel = findlast(windspeed, winds),
atom wu = winds[uv],
ovel = findfirst(windspeed, winds)
duwl = degreeswinds[udeglv],
if find(-1,{udeg, odeg, uvel, ovel}) then return -1 end if
atom wu du = windsdegrees[uvelud],
whdl = windsdegrees[ovelld],
du = degrees[udeg],
dh = degrees[odeg],
f
if odegld==udegud then
f = iff(uveluv==ovellv ? 1 :(windspeed-wu)/(wh-wu))
ovel = findfirst(wu-windspeed, winds)/(wu-wl))
elsif uveluv==ovellv then
f = (pointofsail-du-pointofsail)/(dh-du-dl)
else
f = ((du-pointofsail-du)/(dhdu-dudl)+(windspeed-wu)/(wh-wu))/2
uvel = findlast(wu-windspeed, winds),/(wu-wl))/2
end if
atom su = speeds[udegud,uveluv],
shsl = speeds[odegld,ovellv],
res = su +- f*(sh-su-sl) -- (equivalent)
return res
end function
Line 1,167 ⟶ 1,164:
if pyx=0 then exit end if
minpath = prepend(minpath,pyx)
paths[py,px] = 0 -- (be safe, why not)
{py,px} = pyx
end while
7,805

edits