Some code to play with (ACE version 0.4)
These are scripts (py files open as text).
Here is a sample of the code for ZZ pattern E:
Code:
def nm2meters(coords):
res = []
for c in coords:
res.append((c[0]*1852, c[1]*1852))
return res
def rotate(coords, heading):
res = []
angle = -heading*pi/180
for c in coords:
x = c[0] * cos(angle) - c[1] * sin (angle)
y = c[0] * sin(angle) + c[1] * cos (angle)
res.append((int (x), int (y)))
return res
def coordsToWP(group,coords):
for c in coords:
wp = Waypoint(c[0]+group.longitude, c[1]+group.latitude, group.getWaypoints())
group.getWaypoints().add(wp)
def heading2rad(heading):
return (pi/180)*((360+90-heading) % 360)
def projectPoint(base,speed,heading,minutes):
angle = heading2rad(heading)
distance = speed * minutes / 60
x = base[0] + distance * cos(angle)
y = base[1] + distance * sin(angle)
return (x,y)
def zigZagA(speed):
res = []
res.append((0,0)) # Added for consistency, removed later
res.append(projectPoint(res[-1],speed,60,5))
res.append(projectPoint(res[-1],speed,30,5))
res.append(projectPoint(res[-1],speed,0,5))
res.append(projectPoint(res[-1],speed,-30,5))
res.append(projectPoint(res[-1],speed,-60,5))
res.append(projectPoint(res[-1],speed,0,5))
res.append(projectPoint(res[-1],speed,-60,5))
res.append(projectPoint(res[-1],speed,-30,5))
res.append(projectPoint(res[-1],speed,0,5))
res.append(projectPoint(res[-1],speed,30,5))
res.append(projectPoint(res[-1],speed,60,5))
res.append(projectPoint(res[-1],speed,0,5))
res.pop(0) # Remove first element (base)
return nm2meters(res)
def patternLength(pattern):
return sqrt(pattern[-1][0]*pattern[-1][0]+pattern[-1][1]*pattern[-1][1])
def patternSteps(waypoint,pattern):
return int(waypoint.length/patternLength(pattern))
def patternToWaypoint(waypoint,iterator,pattern):
last = waypoint.previous
for x in range(0,patternSteps(waypoint, pattern)-1):
wp = None
for c in pattern:
wp = Waypoint(c[0]+last.longitude, c[1]+last.latitude, group.getWaypoints())
insertWaypointBeforeCursor(iterator,wp)
last = wp
def zigZagWithPattern(group):
i = group.waypoints.iterator ()
for waypoint in i:
patternToWaypoint(waypoint,i,rotate(zigZagA(waypoint.speed),waypoint.heading))
i = mission.randomGroups.iterator ()
for group in i:
zigZagWithPattern(group)
This code within: defzigZagA(speed) is the pattern from the illustrations above. Speed, angle off base heading, and time on each leg. You can enter the angle and times right off the real japanese ZZ pattern diagram.
http://mpgtext.net/subshare/306ZigZags.rar
^^^^ my patterns so far.
Any with trailing lower case (ZZ_Pattern_A b.py, for example) are non-historical variants created by increasing leg times in order to spread out the pattern more to save waypoints and to give ships more time to reform after a turn.
tater
|