//风向,风速,原点半径,风杆长度,forsurf不用理会 function calcWindLines(wd, wf, p0, core_radius, shaftLength, forSurf) { var lines=[],wfmax=forSurf? 40:60; if(!wf || wd==null) // wf==0 || wf==null || wd==null return lines; var radius=core_radius!=null? core_radius:0; var slen=shaftLength!=null? shaftLength:20; var p1=calculateTerminalPoint(p0,radius,wd); var p=calculateTerminalPoint(p1,slen,wd); // shaft lines.push([p1.x,p1.y,p.x,p.y]); // feathers var v = (wf>=0)? Math.round(wf):-1; var dn; var d=wd; if (v < 0) {// create a cross at p dn = calculateTerminalPoint(p, slen/6, d+45); lines.push([p.x,p.y,dn.x,dn.y]); dn = calculateTerminalPoint(p, slen/6, d+135); lines.push([p.x,p.y,dn.x,dn.y]); dn = calculateTerminalPoint(p, slen/6, d+225); lines.push([p.x,p.y,dn.x,dn.y]); dn = calculateTerminalPoint(p, slen/6, d+315); lines.push([p.x,p.y,dn.x,dn.y]); return lines; }else if (v == 1){// do nothing return lines; }else if (v == 2) {// draw a short line p = calculateTerminalPoint(p, slen/4, d+180); dn = calculateTerminalPoint(p, slen/4,d+60); lines.push([p.x,p.y,dn.x,dn.y]); return lines; }else if (v > wfmax) {// draw a '>' on the right of the shaft var p1 = calculateTerminalPoint(p, slen/5, d+180);//沿风杆向圆心移一些位置 dn = calculateTerminalPoint(p1, slen/5, d+225); lines.push([p1.x,p1.y,dn.x,dn.y]); dn = calculateTerminalPoint(p1, slen/5, d+315); lines.push([p1.x,p1.y,dn.x,dn.y]); v = wfmax; } while(v - 20 >= 0 || v == 19){// draw triangles when necessarily dn = calculateTerminalPoint(p, slen*0.433, d+90); lines.push([p.x,p.y,dn.x,dn.y]); p = calculateTerminalPoint(p, slen/5, d+180); lines.push([p.x,p.y,dn.x,dn.y]); v -= 20; if (v < 19) p = calculateTerminalPoint(p, slen/7, d+180); } while(v - 4 >= 0 || v == 3){// draw long lines when necessarily var span=forSurf? slen/6:slen/10; dn = calculateTerminalPoint(p, slen/2, d+60); lines.push([p.x,p.y,dn.x,dn.y]); p = calculateTerminalPoint(p, span, d+180); v -= 4; } if(v > 0){// draw a short line when necessarily dn = calculateTerminalPoint(p, slen/4, d+60.0); lines.push([p.x,p.y,dn.x,dn.y]); } return lines; }; // 计算线段另一个端点(直角)坐标 // @param p0 给定已知的一个端点{x,y} // @param length 给定长度 // @param angle 给定角度(以正北起,0~360) // @return {x,y} function calculateTerminalPoint(p0, length, angle) { var a = angle * Math.PI / 180, x = length * Math.sin(a), y = length * Math.cos(a); return { x: p0.x + x, y: p0.y - y }; }; //console.log(calcWindLines(52, 1.7, p(100, 100), Math.PI * 2, 20));