May the wind be always at your back You are Odysseus, and are finally free from Calypso (who has kept you captive for many years) after you drugged her while she was sleeping1. You wish to return to your homeland of Ithaca, but the ship you've stolen is a bit damaged and cannot steer. However, you have also stolen a map which contains the location of Calypso’s island as well as the locations of Ithaca and the small islands that lie in between, as well as information about the wind currents of the area. Your ship can only sail by the wind currents, but you get to choose the direction you start in (north, south, east, west). If the currents bring you to another island, you also get to choose the direction in which you depart that island.
Can you get home to Ithaca?
[1] Because that definitely happens in the epic.
Input Format
The input consists of:

positive integers w and h
a w-by-h grid of characters representing the map, where:

~ denotes calm sea
^ denotes a wind blowing north
v denotes a wind blowing south
&lt; denotes a wind blowing west
&gt; denotes a wind blowing east
c denotes Calypso's island, your starting point
i denotes Ithaca, the destination
* denotes an intermediate island



Each “wind” character moves you one cell in the direction of the wind, and winds never form loops (i.e. there is no way to get trapped in a cycle of winds).
You may take input however you want (reading a file, from STDIN, as function parameters etc.)
Output
Output a truthy value if it is possible to get to Ithaca, and a falsy value if that is not possible.
Test Cases
w=10, h=5
~^~~~~~~~~
~c&gt;&gt;*&gt;&gt;v~~
~v~~v~~v~~
~&gt;&gt;*&lt;~~*&gt;i
~~~v~~~~~~
Expected Output: True
Explanation: Go east, then east again, then east again

w=8, h=5
~~~~~~~~
~~&gt;&gt;v~~~
&lt;&lt;c~~~~~
~~&gt;~i~~~
~~~~~~~~
Expected Output: False
Explanation: There are two paths that lead to cells neighboring Ithaca,
but there is no wind on those cells.

w=5, h=2
&lt;c&gt;&gt;&gt;
~v~~i
Expected Output: False
Explanation: Although you can get to a distance of one cell away from
Ithaca, the wind on that cell is eastward which pushes Odysseus
off the map instead of to Ithaca.

w=20, h=6
~~~~~~~~~~~~~~~~~~~~
~~v&lt;&lt;&lt;&lt;&lt;&lt;*&lt;&lt;&gt;&gt;&gt;v&gt;~~~
~~i~&lt;&lt;*&lt;&lt;&lt;&lt;c~~~*~~~~
~~~~~~^~~~~v~~~^~~~~
~~~~~~&lt;&lt;*&gt;&gt;&gt;&gt;&gt;&gt;^~~~~
~~~~~~~~~~~~~~~~~~~~
Expected Output: True
Explanation: North, then West

w=20, h=6
~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~*&lt;&lt;&gt;&gt;&gt;v&gt;~~~
~~i&lt;v&lt;*&lt;&lt;&lt;&lt;c~~~*~~~~
~~~~v~^~~~~v~~~^~~~~
~~~~v~&lt;&lt;*&gt;&gt;&gt;&gt;&gt;&gt;^~~~~
~~~~v~~~~~~~~~~~~~~~
Expected Output: False
Explanation: Although there is a wind leading to Ithaca, it is inaccessible.

Standard loopholes are prohibited. This is code-golf, so the shortest solution in bytes in each language wins.
Python 3.8 (pre-release), 176 bytes

lambda w,h,b:b.find('i')in(r:={b.find('c')})|{r.update(*([{(d:={'&lt;':i-1,'&gt;':i+1,'^':i+~w,'v':i-~w}).get(b[i],i)},{*d.values()}][b[i]in'*c']for i in r if-1&lt;i&lt;len(b)))for _ in b}

Try it online!
Ungolfed
def f(w,h,b):
  r = {b.find('c')}
  for _ in b:
    for i in list(r):
      if 0 &lt;= i &lt; len(b):
        d = {'&lt;':i-1,'&gt;':i+1,'^':i-w-1,'v':i+w+1}
        if b[i] in '*c':
          r.update(d.values())
        r.add(d.get(b[i],i))
  return b.find('i') in r