UNPKG

@gml/truewind

Version:

Modern ES6+ library for apparent to true wind calculation in sailing applications.

2 lines (1 loc) 2.14 kB
!function(a,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((a="undefined"!=typeof globalThis?globalThis:a||self).TrueWind={})}(this,(function(a){"use strict";const t=Math.PI/180,o=180/Math.PI;class s{static getTrue(a){const s={...a};if(void 0===s.variation&&(s.variation=0),void 0===s.bspd&&void 0!==s.sog?s.bspd=s.sog:void 0===s.sog&&void 0!==s.bspd&&(s.sog=s.bspd),void 0===s.heading&&void 0!==s.cog?s.heading=s.cog:void 0===s.cog&&void 0!==s.heading&&(s.cog=s.heading),void 0===s.awa&&void 0!==s.awd){for(s.awa=s.awd-(s.heading+s.variation);s.awa>180;)s.awa-=360;for(;s.awa<-180;)s.awa+=360}if(void 0===s.awa||void 0===s.aws||void 0===s.heading||void 0===s.bspd)throw new Error("Please supply at least the parameters { awa, aws, heading, bspd }");let i;if(s.awa>180?s.awa-=360:s.awa<-180&&(s.awa+=360),Object.assign(s,this.getAttitudeCorrections(s)),!s.bspd||!s.roll||!s.K||s.roll>0&&s.awa>0||s.roll<0&&s.awa<0)i=0;else{const a=1.94384*s.bspd;i=s.K*s.roll/(a*a),i>45?i=45:i<-45&&(i=-45)}const e=s.bspd/Math.cos(i*t),d=e*Math.sin(i*t),n=(270-s.awa)*t,r=s.aws*Math.cos(n)+d,h=s.aws*Math.sin(n)+s.bspd,w=Math.sqrt(r*r+h*h),c=Math.atan2(h,r);let l;Number.isNaN(c)?l=h<0?180:0:(l=270-c*o,s.awa>=0?l%=360:l-=360,l>180?l-=360:l<-180&&(l+=360));const g=e*Math.cos((-l+i)*t);let v=s.heading+l;v>360?v-=360:v<0&&(v+=360);const p=s.cog-s.variation,M=(90-(s.heading+i))*t,f=(90-p)*t,u=s.sog*Math.cos(f)-e*Math.cos(M),b=s.sog*Math.sin(f)-e*Math.sin(M),y=Math.sqrt(u*u+b*b),m=Math.atan2(b,u);let N;return Number.isNaN(m)?N=b<0?180:0:(N=90-m*o,N>360?N-=360:N<0&&(N+=360)),{awa:s.awa,aws:s.aws,leeway:i,stw:e,vmg:g,tws:w,twa:l,twd:v+s.variation,soc:y,doc:N+s.variation}}static getAttitudeCorrections(a){const{roll:s,pitch:i}=a;if(void 0===s||void 0===i)return a;let e=a.awa;e<0&&(e+=360);const d=e,n=a.aws,r=n*Math.sin(d*t),h=n*Math.cos(d*t),w=r/Math.cos(s*t),c=h/Math.cos(i*t);let l=Math.sqrt(w**2+c**2);0!==w&&0!==c||(l=n);let g=Math.atan2(w,c)*o;return g<0&&(g+=360),{...a,aws:l,awa:g}}}a.TrueWind=s,a.default=s,Object.defineProperty(a,"__esModule",{value:!0})}));