Update: The naca5 code is wrong, updated (python) code can be found on github
Just in case its useful for somebody. C# code to generate 4 or 5 digit NACA airfoils. It requires a cubic spline interpolation method which you can easily write yourself or find on google code (please respect the licenses though)
–Dirk
//4 digit NACA // Conversions double cl = chordLength.ConvertToDouble("m"); double naca1 = int.Parse(number.Substring(0,1)); double naca2 = int.Parse(number.Substring(1,1)); double naca34 = int.Parse(number.Substring(2,2)); double dl; double ml; double pl; ml = naca1/100; pl = naca2/10; dl = naca34/100; // Number of points int n = 100; int m =n/2+1; // Airfoil-Drop double a0 = 1.4845; double a1 = -0.63; double a2 = -1.7580; double a3 = 1.4215; double a4 = -0.5075; // Create the point objects Point2D pt = new Point2D(); Point2D[] ptList = new Point2D[n]; // Calculate the points ... double x; double y; double yt; double dy; double theta; double xu; double xl; double yu; double yl; // TrailingEdge pt.X=1*cl; pt.Y=0; ptList[0] = new Point2D(pt); // Between for (int i=1;i<(m-1);i++) { x=((double) (1.0-0.5*(1.0-Math.Cos(Math.PI*(1.0*i)/(1.0*m-1.0))))); yt=dl*(a0*Math.Sqrt(x)+x*(a1+x*(a2+x*(a3+x*a4)))); if (x<=pl){ y = (ml/Math.Pow(pl,2))*(2.0*pl-x)*x; dy = (ml/Math.Pow(pl,2))*(2.0*pl-2.0*x); } else { y = (ml/Math.Pow((1.0-pl),2))*((1.0-2.0*pl)+2.0*pl*x-Math.Pow(x,2)); dy = (ml/Math.Pow((1.0-pl),2))*(2.0*pl-2.0*x); } theta = Math.Atan(dy); xu = x-yt*Math.Sin(theta); yu = y+yt*Math.Cos(theta); xl = x+yt*Math.Sin(theta); yl = y-yt*Math.Cos(theta); //upper point pt.X = xu*cl; pt.Y = yu*cl; ptList[i] = new Point2D(pt); //lower point pt.X = xl*cl; pt.Y = yl*cl; ptList[n-i] = new Point2D(pt); } // LeadingEdge point pt.X=0.0; pt.Y=0.0; ptList[m-1] = new Point2D(pt); return ptList; //5 digit NACA // Conversions double cl = chordLength.ConvertToDouble("m"); double naca1 = int.Parse(number.Substring(0,1)); double naca23 = int.Parse(number.Substring(1,2)); double naca45 = int.Parse(number.Substring(3,2)); double dl; double cld; double pl; double ml; double k1; cld = naca1*0.75/10; pl = 0.5*naca23/100; dl = naca45/100; // Number of points int n = 100; int m =n/2+1; // Airfoil-Drop double a0 = 1.4845; double a1 = -0.63; double a2 = -1.7580; double a3 = 1.4215; double a4 = -0.5075; // Create the point objects Point2D pt = new Point2D(); Point2D[] ptList = new Point2D[n]; // Calculate the points ... double x; double y; double yt; double dy; double theta; double xu; double xl; double yu; double yl; // TrailingEdge pt.X = 1*cl; pt.Y = 0.0; ptList[0] = new Point2D(pt); double[] P = new double[]{0.05,0.1,0.15,0.2,0.25}; double[] M = new double[]{0.0580,0.1260,0.2025,0.2900,0.3910}; double[] K = new double[]{361.4,51.64,15.957,6.643,3.230}; double[] mll = Interpolate(P,M,new double[]{pl}); ml = mll[0]; double[] k1l = Interpolate(M,K,new double[]{ml}); k1 = k1l[0]; for (int i=1;i<(m-1);i++) { x=((double) (1.0-0.5*(1.0-Math.Cos(Math.PI*(1.0*i)/(1.0*m-1.0))))); yt=dl*(a0*Math.Sqrt(x)+x*(a1+x*(a2+x*(a3+x*a4)))); if (x<=pl) { y = cld/0.3 * (1.0/6.0)*k1*( Math.Pow(x,3)-3.0*ml*Math.Pow(x,2)+ml*ml*(3.0-ml)*x ); dy = (1.0/6.0)*k1*( 3.0*Math.Pow(x,2)-6.0*ml*x+ml*ml*(3.0-ml) ); } else { y = cld/0.3 * (1.0/6.0)*k1*Math.Pow(ml,3)*(1.0-x); dy = -(1.0/6.0)*k1*Math.Pow(ml,3); } theta = Math.Atan(dy); xu = x-yt*Math.Sin(theta); yu = y+yt*Math.Cos(theta); xl = x+yt*Math.Sin(theta); yl = y-yt*Math.Cos(theta); //upper point pt.X = xu*cl; pt.Y = yu*cl; ptList[i] = new Point2D(pt); //lower point pt.X = xl*cl; pt.Y = yl*cl; ptList[n-i] = new Point2D(pt); } // LeadingEdge point pt.X=0.0; pt.Y=0.0; ptList[m-1] = new Point2D(pt); return ptList;