├── .editorconfig ├── .gitattributes ├── .gitignore ├── BezierAirfoilDesigner.sln ├── BezierAirfoilDesigner ├── .resx ├── Airfoil.cs ├── BezierAirfoilDesigner.csproj ├── BezierAirfoilDesigner.ico ├── CircleProperties.cs ├── DeCasteljau.cs ├── Form1.Designer.cs ├── Form1.cs ├── Form1.resx ├── GlobalSuppressions.cs ├── PointD.cs ├── Program.cs ├── Properties │ ├── ToolTips_de.Designer.cs │ ├── ToolTips_de.resx │ ├── ToolTips_en.Designer.cs │ └── ToolTips_en.resx ├── bezier icon v2.ico ├── bezier icon v3.ico ├── bezier icon v4.ico └── bezier icon.ico ├── LICENSE ├── README.md ├── RG15.bez.dat ├── RG15_BezierMod.dat └── RG15mod.dat /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.cs] 2 | 3 | # Default severity for all analyzer diagnostics 4 | dotnet_analyzer_diagnostic.severity = none 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Oo]ut/ 33 | [Ll]og/ 34 | [Ll]ogs/ 35 | 36 | # Visual Studio 2015/2017 cache/options directory 37 | .vs/ 38 | # Uncomment if you have tasks that create the project's static files in wwwroot 39 | #wwwroot/ 40 | 41 | # Visual Studio 2017 auto generated files 42 | Generated\ Files/ 43 | 44 | # MSTest test Results 45 | [Tt]est[Rr]esult*/ 46 | [Bb]uild[Ll]og.* 47 | 48 | # NUnit 49 | *.VisualState.xml 50 | TestResult.xml 51 | nunit-*.xml 52 | 53 | # Build Results of an ATL Project 54 | [Dd]ebugPS/ 55 | [Rr]eleasePS/ 56 | dlldata.c 57 | 58 | # Benchmark Results 59 | BenchmarkDotNet.Artifacts/ 60 | 61 | # .NET Core 62 | project.lock.json 63 | project.fragment.lock.json 64 | artifacts/ 65 | 66 | # ASP.NET Scaffolding 67 | ScaffoldingReadMe.txt 68 | 69 | # StyleCop 70 | StyleCopReport.xml 71 | 72 | # Files built by Visual Studio 73 | *_i.c 74 | *_p.c 75 | *_h.h 76 | *.ilk 77 | *.meta 78 | *.obj 79 | *.iobj 80 | *.pch 81 | *.pdb 82 | *.ipdb 83 | *.pgc 84 | *.pgd 85 | *.rsp 86 | *.sbr 87 | *.tlb 88 | *.tli 89 | *.tlh 90 | *.tmp 91 | *.tmp_proj 92 | *_wpftmp.csproj 93 | *.log 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio LightSwitch build output 298 | **/*.HTMLClient/GeneratedArtifacts 299 | **/*.DesktopClient/GeneratedArtifacts 300 | **/*.DesktopClient/ModelManifest.xml 301 | **/*.Server/GeneratedArtifacts 302 | **/*.Server/ModelManifest.xml 303 | _Pvt_Extensions 304 | 305 | # Paket dependency manager 306 | .paket/paket.exe 307 | paket-files/ 308 | 309 | # FAKE - F# Make 310 | .fake/ 311 | 312 | # CodeRush personal settings 313 | .cr/personal 314 | 315 | # Python Tools for Visual Studio (PTVS) 316 | __pycache__/ 317 | *.pyc 318 | 319 | # Cake - Uncomment if you are using it 320 | # tools/** 321 | # !tools/packages.config 322 | 323 | # Tabs Studio 324 | *.tss 325 | 326 | # Telerik's JustMock configuration file 327 | *.jmconfig 328 | 329 | # BizTalk build output 330 | *.btp.cs 331 | *.btm.cs 332 | *.odx.cs 333 | *.xsd.cs 334 | 335 | # OpenCover UI analysis results 336 | OpenCover/ 337 | 338 | # Azure Stream Analytics local run output 339 | ASALocalRun/ 340 | 341 | # MSBuild Binary and Structured Log 342 | *.binlog 343 | 344 | # NVidia Nsight GPU debugger configuration file 345 | *.nvuser 346 | 347 | # MFractors (Xamarin productivity tool) working folder 348 | .mfractor/ 349 | 350 | # Local History for Visual Studio 351 | .localhistory/ 352 | 353 | # BeatPulse healthcheck temp database 354 | healthchecksdb 355 | 356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 357 | MigrationBackup/ 358 | 359 | # Ionide (cross platform F# VS Code tools) working folder 360 | .ionide/ 361 | 362 | # Fody - auto-generated XML schema 363 | FodyWeavers.xsd -------------------------------------------------------------------------------- /BezierAirfoilDesigner.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33516.290 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BezierAirfoilDesigner", "BezierAirfoilDesigner\BezierAirfoilDesigner.csproj", "{F8E8CE46-747D-4247-8EEF-C7AA44CA5E20}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3E242B98-EDCF-4F47-A4B1-15C53886D4B7}" 9 | ProjectSection(SolutionItems) = preProject 10 | .editorconfig = .editorconfig 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|Any CPU = Debug|Any CPU 16 | Release|Any CPU = Release|Any CPU 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {F8E8CE46-747D-4247-8EEF-C7AA44CA5E20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 20 | {F8E8CE46-747D-4247-8EEF-C7AA44CA5E20}.Debug|Any CPU.Build.0 = Debug|Any CPU 21 | {F8E8CE46-747D-4247-8EEF-C7AA44CA5E20}.Release|Any CPU.ActiveCfg = Release|Any CPU 22 | {F8E8CE46-747D-4247-8EEF-C7AA44CA5E20}.Release|Any CPU.Build.0 = Release|Any CPU 23 | EndGlobalSection 24 | GlobalSection(SolutionProperties) = preSolution 25 | HideSolutionNode = FALSE 26 | EndGlobalSection 27 | GlobalSection(ExtensibilityGlobals) = postSolution 28 | SolutionGuid = {D0FB3F5C-D239-4A72-96E7-4D611CB8709C} 29 | EndGlobalSection 30 | EndGlobal 31 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Airfoil.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace BezierAirfoilDesigner 5 | { 6 | internal class Airfoil 7 | { 8 | private string airfoilName; 9 | private int numberOfCurvePoints; 10 | private List controlPointsTop; 11 | private List controlPointsBottom; 12 | private List curvePointsTop; 13 | private List curvePointsBottom; 14 | 15 | public Airfoil() 16 | { 17 | airfoilName = "Default Airfoil"; 18 | numberOfCurvePoints = 150; 19 | 20 | controlPointsTop = new List 21 | { 22 | new PointD(0, 0), 23 | new PointD(0, 0.1), 24 | new PointD(0.5, 0.1), 25 | new PointD(1, 0) 26 | }; 27 | 28 | controlPointsBottom = new List 29 | { 30 | new PointD(0, 0), 31 | new PointD(0, -0.1), 32 | new PointD(0.5, -0.1), 33 | new PointD(1, 0) 34 | }; 35 | 36 | curvePointsTop = new List(); 37 | curvePointsBottom = new List(); 38 | 39 | CalculateCurvePoints(); 40 | } 41 | 42 | public Airfoil(string name, List controlPointsTop, List controlPointsBottom) 43 | { 44 | airfoilName = name; 45 | this.controlPointsTop = controlPointsTop; 46 | this.controlPointsBottom = controlPointsBottom; 47 | CalculateCurvePoints(); 48 | } 49 | 50 | public string AirfoilName 51 | { 52 | get { return airfoilName; } 53 | set { airfoilName = value; } 54 | } 55 | 56 | public int NumberOfCurvePoints 57 | { 58 | get { return numberOfCurvePoints; } 59 | set 60 | { 61 | if (value >= 2) 62 | { 63 | numberOfCurvePoints = value; 64 | CalculateCurvePoints(); 65 | } 66 | else 67 | { 68 | MessageBox.Show("Invalid number of curve points. Value must be at least 2."); 69 | } 70 | } 71 | } 72 | 73 | public List ControlPointsTop 74 | { 75 | get { return controlPointsTop; } 76 | set { controlPointsTop = value; CalculateCurvePoints(); } 77 | } 78 | 79 | public List ControlPointsBottom 80 | { 81 | get { return controlPointsBottom; } 82 | set { controlPointsBottom = value; CalculateCurvePoints(); } 83 | } 84 | 85 | public List CurvePointsTop 86 | { 87 | get { return curvePointsTop; } 88 | set { curvePointsTop = value; } 89 | } 90 | 91 | public List CurvePointsBottom 92 | { 93 | get { return curvePointsBottom; } 94 | set { curvePointsBottom = value; } 95 | } 96 | 97 | public void CalculateCurvePoints() 98 | { 99 | curvePointsTop = DeCasteljau.BezierCurve(controlPointsTop, numberOfCurvePoints); 100 | curvePointsBottom = DeCasteljau.BezierCurve(controlPointsBottom, numberOfCurvePoints); 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/BezierAirfoilDesigner.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net7.0-windows 6 | true 7 | bezier icon v3.ico 8 | latest 9 | enable 10 | annotations 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | True 35 | True 36 | ToolTips_en.resx 37 | 38 | 39 | True 40 | True 41 | ToolTips_de.resx 42 | 43 | 44 | 45 | 46 | 47 | ResXFileCodeGenerator 48 | ToolTips_en.Designer.cs 49 | 50 | 51 | ResXFileCodeGenerator 52 | ToolTips_de.Designer.cs 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/BezierAirfoilDesigner.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marc-frank/BezierAirfoilDesigner/8be8e1ca5d58a66f3803ece053ecbe1073e8cb9a/BezierAirfoilDesigner/BezierAirfoilDesigner.ico -------------------------------------------------------------------------------- /BezierAirfoilDesigner/CircleProperties.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace BezierAirfoilDesigner 8 | { 9 | public class CircleProperties 10 | { 11 | public static PointD CalculateMidpoint(PointD p1, PointD p2, PointD p3) 12 | { 13 | double D = 2 * (p1.X * (p2.Y - p3.Y) + p2.X * (p3.Y - p1.Y) + p3.X * (p1.Y - p2.Y)); 14 | 15 | double Ux = ((p1.X * p1.X + p1.Y * p1.Y) * (p2.Y - p3.Y) + (p2.X * p2.X + p2.Y * p2.Y) * (p3.Y - p1.Y) + (p3.X * p3.X + p3.Y * p3.Y) * (p1.Y - p2.Y)) / D; 16 | double Uy = ((p1.X * p1.X + p1.Y * p1.Y) * (p3.X - p2.X) + (p2.X * p2.X + p2.Y * p2.Y) * (p1.X - p3.X) + (p3.X * p3.X + p3.Y * p3.Y) * (p2.X - p1.X)) / D; 17 | 18 | return new PointD(Ux, Uy); 19 | } 20 | 21 | public static double CalculateRadius(PointD p1, PointD p2, PointD p3) 22 | { 23 | PointD midpoint = CalculateMidpoint(p1, p2, p3); 24 | 25 | double radius = (double)Math.Sqrt(Math.Pow(p1.X - midpoint.X, 2) + Math.Pow(p1.Y - midpoint.Y, 2)); 26 | 27 | return radius; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/DeCasteljau.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using MathNet.Numerics.LinearAlgebra; 7 | using MathNet.Numerics.LinearAlgebra.Double; 8 | using System.Numerics; 9 | using MathNet.Numerics.Optimization; 10 | 11 | namespace BezierAirfoilDesigner 12 | { 13 | public class DeCasteljau 14 | { 15 | // Calculate a point on a Bezier curve using the de Casteljau algorithm 16 | private static PointD DeCasteljauPoint(List controlPoints, double t) 17 | { 18 | List points = new List(controlPoints); 19 | int n = points.Count; 20 | 21 | for (int r = 1; r < n; r++) 22 | { 23 | for (int i = 0; i < n - r; i++) 24 | { 25 | double x = (1 - (double)t) * points[i].X + (double)t * points[i + 1].X; 26 | double y = (1 - (double)t) * points[i].Y + (double)t * points[i + 1].Y; 27 | points[i] = new PointD(x, y); 28 | } 29 | } 30 | 31 | return points[0]; 32 | } 33 | 34 | // Calculate points on a Bezier curve using the de Casteljau algorithm 35 | public static List BezierCurve(List controlPoints, int nPoints) 36 | { 37 | List points = new List(); 38 | double step = 1.0 / (nPoints - 1); 39 | 40 | for (int i = 0; i < nPoints; i++) 41 | { 42 | double t = i * step; 43 | points.Add(DeCasteljauPoint(controlPoints, t)); 44 | } 45 | 46 | return points; 47 | } 48 | 49 | public static List IncreaseOrder(List controlPoints) 50 | { 51 | int n = controlPoints.Count - 1; 52 | List increasedControlPoints = new List(); 53 | 54 | increasedControlPoints.Add(controlPoints[0]); 55 | 56 | for (int i = 1; i <= n; i++) 57 | { 58 | double x = (i * controlPoints[i - 1].X + (n - i + 1) * controlPoints[i].X) / (n + 1); 59 | double y = (i * controlPoints[i - 1].Y + (n - i + 1) * controlPoints[i].Y) / (n + 1); 60 | 61 | increasedControlPoints.Add(new PointD(x, y)); 62 | } 63 | 64 | increasedControlPoints.Add(controlPoints[n]); 65 | 66 | return increasedControlPoints; 67 | } 68 | 69 | public static List DecreaseOrder(List controlPoints) 70 | { 71 | if (controlPoints.Count <= 2) { return controlPoints; } 72 | 73 | int n = controlPoints.Count - 1; 74 | List decreasedControlPoints = new List(); 75 | 76 | decreasedControlPoints.Add(controlPoints[0]); 77 | 78 | for (int i = 1; i < n; i++) 79 | { 80 | double x = ((n + 1) * controlPoints[i].X - i * decreasedControlPoints[i - 1].X) / (n - i + 1); 81 | double y = ((n + 1) * controlPoints[i].Y - i * decreasedControlPoints[i - 1].Y) / (n - i + 1); 82 | 83 | decreasedControlPoints.Add(new PointD(x, y)); 84 | } 85 | 86 | decreasedControlPoints[decreasedControlPoints.Count - 1] = controlPoints[controlPoints.Count - 1]; 87 | 88 | return decreasedControlPoints; 89 | } 90 | 91 | public static List DecreaseOrder2(List controlPoints) 92 | { 93 | int n = controlPoints.Count - 1; 94 | if (n <= 0) 95 | throw new System.Exception("No further dimensional reduction possible!"); 96 | 97 | // Construct the Matrix 98 | double[,] M = new double[n + 1, n]; 99 | M[0, 0] = 1; 100 | M[n, n - 1] = 1; 101 | for (int i = 1; i < n; i++) 102 | { 103 | M[i, i - 1] = i / (double)(n + 1); 104 | M[i, i] = 1 - i / (double)(n + 1); 105 | } 106 | 107 | // Find the least squares solution 108 | double[,] K = Multiply(Inverse(Multiply(Transpose(M), M)), Transpose(M)); 109 | 110 | PointD[] pts = controlPoints.ToArray(); 111 | PointD[] result = new PointD[K.GetLength(0)]; 112 | for (int i = 0; i < K.GetLength(0); i++) 113 | { 114 | double x = 0, y = 0; 115 | for (int j = 0; j < K.GetLength(1); j++) 116 | { 117 | x += K[i, j] * pts[j].X; 118 | y += K[i, j] * pts[j].Y; 119 | } 120 | result[i] = new PointD(x, y); 121 | } 122 | 123 | result[0] = controlPoints[0]; 124 | result[n - 1] = controlPoints[n]; 125 | 126 | return new List(result); 127 | } 128 | 129 | private static double[,] Transpose(double[,] matrix) 130 | { 131 | int rows = matrix.GetLength(0); 132 | int columns = matrix.GetLength(1); 133 | double[,] result = new double[columns, rows]; 134 | for (int i = 0; i < rows; i++) 135 | { 136 | for (int j = 0; j < columns; j++) 137 | { 138 | result[j, i] = matrix[i, j]; 139 | } 140 | } 141 | return result; 142 | } 143 | 144 | private static double[,] Multiply(double[,] matrix1, double[,] matrix2) 145 | { 146 | int rows1 = matrix1.GetLength(0); 147 | int columns1 = matrix1.GetLength(1); 148 | int rows2 = matrix2.GetLength(0); 149 | int columns2 = matrix2.GetLength(1); 150 | 151 | if (columns1 != rows2) 152 | throw new ArgumentException("Matrix dimensions are not compatible for multiplication."); 153 | 154 | double[,] result = new double[rows1, columns2]; 155 | 156 | for (int i = 0; i < rows1; i++) 157 | { 158 | for (int j = 0; j < columns2; j++) 159 | { 160 | double sum = 0; 161 | for (int k = 0; k < columns1; k++) 162 | { 163 | sum += matrix1[i, k] * matrix2[k, j]; 164 | } 165 | result[i, j] = sum; 166 | } 167 | } 168 | 169 | return result; 170 | } 171 | 172 | private static double[,] Inverse(double[,] matrix) 173 | { 174 | int size = matrix.GetLength(0); 175 | double[,] augmentedMatrix = new double[size, 2 * size]; 176 | for (int i = 0; i < size; i++) 177 | { 178 | for (int j = 0; j < size; j++) 179 | { 180 | augmentedMatrix[i, j] = matrix[i, j]; 181 | } 182 | augmentedMatrix[i, size + i] = 1; 183 | } 184 | 185 | for (int i = 0; i < size; i++) 186 | { 187 | double pivot = augmentedMatrix[i, i]; 188 | for (int j = i; j < 2 * size; j++) 189 | { 190 | augmentedMatrix[i, j] /= pivot; 191 | } 192 | for (int j = 0; j < size; j++) 193 | { 194 | if (j != i) 195 | { 196 | double factor = augmentedMatrix[j, i]; 197 | for (int k = i; k < 2 * size; k++) 198 | { 199 | augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k]; 200 | } 201 | } 202 | } 203 | } 204 | 205 | double[,] inverse = new double[size, size]; 206 | for (int i = 0; i < size; i++) 207 | { 208 | for (int j = 0; j < size; j++) 209 | { 210 | inverse[i, j] = augmentedMatrix[i, size + j]; 211 | } 212 | } 213 | 214 | return inverse; 215 | } 216 | 217 | public static double CalculateRadius(List controlPoints) 218 | { 219 | if (controlPoints.Count < 2) 220 | { 221 | throw new ArgumentException("Expected at least 2 control points for a Bezier curve."); 222 | } 223 | 224 | var P0 = new Vector2((float)controlPoints[0].X, (float)controlPoints[0].Y); 225 | var P1 = new Vector2((float)controlPoints[1].X, (float)controlPoints[1].Y); 226 | 227 | var B1 = P1 - P0; // First derivative at t=0 228 | 229 | // If there is only two points, it's a straight line and radius of curvature is infinity 230 | if (controlPoints.Count == 2) 231 | { 232 | return double.PositiveInfinity; 233 | } 234 | 235 | var P2 = new Vector2((float)controlPoints[2].X, (float)controlPoints[2].Y); 236 | var B2 = P2 - 2 * P1 + P0; // Second derivative at t=0 237 | 238 | var numerator = Math.Abs(B1.X * B2.Y - B1.Y * B2.X); 239 | var denominator = Math.Pow(Math.Pow(B1.X, 2) + Math.Pow(B1.Y, 2), 1.5); 240 | 241 | // Check for division by zero, which would suggest a straight line 242 | if (denominator == 0) 243 | { 244 | return double.PositiveInfinity; // radius of curvature is infinity for a straight line 245 | } 246 | 247 | var curvature = numerator / denominator; 248 | var radius = 1 / curvature; 249 | 250 | return radius; 251 | } 252 | } 253 | } 254 | 255 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace BezierAirfoilDesigner 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 32 | formsPlot1 = new ScottPlot.FormsPlot(); 33 | txtAirfoilParam = new RichTextBox(); 34 | lblAirfoilParam = new Label(); 35 | chkShowControlTop = new CheckBox(); 36 | chkShowThickness = new CheckBox(); 37 | chkShowRadius = new CheckBox(); 38 | chkShowCamber = new CheckBox(); 39 | btnAxisAuto = new Button(); 40 | chkShowReferenceTop = new CheckBox(); 41 | chkShowReferenceBottom = new CheckBox(); 42 | chkShowTop = new CheckBox(); 43 | chkShowBottom = new CheckBox(); 44 | chkShowControlBottom = new CheckBox(); 45 | txtCamberPosition = new TextBox(); 46 | txtThicknessStepSize = new TextBox(); 47 | txtCamberStepSize = new TextBox(); 48 | lblThicknessStepSize = new Label(); 49 | lblCamberStepSize = new Label(); 50 | lblCamberPosition = new Label(); 51 | progressBar1 = new ProgressBar(); 52 | cmbLanguage = new ComboBox(); 53 | btnCheckForUpdates = new Button(); 54 | tabControl1 = new TabControl(); 55 | tabPageGridView = new TabPage(); 56 | lblTop = new Label(); 57 | dataGridViewTop = new DataGridView(); 58 | panel2 = new Panel(); 59 | lblOrderBottom = new Label(); 60 | btnIncreaseOrderBottom = new Button(); 61 | txtNumOfPointBottom = new TextBox(); 62 | lblNumOfPointBottom = new Label(); 63 | btnDecreaseOrderBottom = new Button(); 64 | dataGridViewBottom = new DataGridView(); 65 | panel1 = new Panel(); 66 | lblOrderTop = new Label(); 67 | btnIncreaseOrderTop = new Button(); 68 | txtNumOfPointsTop = new TextBox(); 69 | lblNumOfPointTop = new Label(); 70 | btnDecreaseOrderTop = new Button(); 71 | lblBottom = new Label(); 72 | tabPageLoad = new TabPage(); 73 | btnLoadBez = new Button(); 74 | btnLoadBezDat = new Button(); 75 | btnLoadDat = new Button(); 76 | btnDefault = new Button(); 77 | chkMatchTEGap = new CheckBox(); 78 | tabPageCurveFitting = new TabPage(); 79 | lblErrorThresholdTop = new Label(); 80 | lblNumberOfParticles = new Label(); 81 | txtNumberOfParticles = new TextBox(); 82 | btnStopSearch = new Button(); 83 | lblErrorNumberOfSteps = new Label(); 84 | lblElapsedTime = new Label(); 85 | txtErrorNumberOfSteps = new TextBox(); 86 | btnAutoSearch = new Button(); 87 | btnStartPSOBottom = new Button(); 88 | btnSearchBottom = new Button(); 89 | lblErrorCalculationDistribution = new Label(); 90 | btnSearchTop = new Button(); 91 | cmbErrorCalculationDistribution = new ComboBox(); 92 | btnStartPSOTop = new Button(); 93 | chkUpdateUI = new CheckBox(); 94 | txtErrorThresholdTop = new TextBox(); 95 | lblErrorThresholdBottom = new Label(); 96 | txtErrorThresholdBottom = new TextBox(); 97 | lblErrorThreshold = new Label(); 98 | tabAirfoilBlending = new TabPage(); 99 | tabPageSave = new TabPage(); 100 | btnSaveDXF = new Button(); 101 | btnSaveDat = new Button(); 102 | btnSaveBezDat = new Button(); 103 | btnSaveBez = new Button(); 104 | label1 = new Label(); 105 | cmbCoordinateStyle = new ComboBox(); 106 | lblChord = new Label(); 107 | txtChord = new TextBox(); 108 | tabPagePlotVisibility = new TabPage(); 109 | formsPlot2 = new ScottPlot.FormsPlot(); 110 | tabAirfoilBlending = new TabPage(); 111 | tabControl1.SuspendLayout(); 112 | tabPageGridView.SuspendLayout(); 113 | ((System.ComponentModel.ISupportInitialize)dataGridViewTop).BeginInit(); 114 | panel2.SuspendLayout(); 115 | ((System.ComponentModel.ISupportInitialize)dataGridViewBottom).BeginInit(); 116 | panel1.SuspendLayout(); 117 | tabPageLoad.SuspendLayout(); 118 | tabPageCurveFitting.SuspendLayout(); 119 | tabAirfoilBlending.SuspendLayout(); 120 | tabPageSave.SuspendLayout(); 121 | tabPagePlotVisibility.SuspendLayout(); 122 | SuspendLayout(); 123 | // 124 | // formsPlot1 125 | // 126 | formsPlot1.BackColor = SystemColors.Control; 127 | formsPlot1.Location = new Point(0, 0); 128 | formsPlot1.Margin = new Padding(3, 0, 3, 0); 129 | formsPlot1.Name = "formsPlot1"; 130 | formsPlot1.Size = new Size(875, 660); 131 | formsPlot1.TabIndex = 0; 132 | formsPlot1.AxesChanged += formsPlot1_AxesChanged; 133 | formsPlot1.PlottableDragged += formsPlot1_PlottableDragged; 134 | formsPlot1.MouseMove += formsPlot1_MouseMove; 135 | // 136 | // txtAirfoilParam 137 | // 138 | txtAirfoilParam.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 139 | txtAirfoilParam.Location = new Point(875, 472); 140 | txtAirfoilParam.Name = "txtAirfoilParam"; 141 | txtAirfoilParam.Size = new Size(361, 144); 142 | txtAirfoilParam.TabIndex = 18; 143 | txtAirfoilParam.Text = ""; 144 | // 145 | // lblAirfoilParam 146 | // 147 | lblAirfoilParam.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 148 | lblAirfoilParam.AutoSize = true; 149 | lblAirfoilParam.Location = new Point(875, 452); 150 | lblAirfoilParam.Margin = new Padding(3); 151 | lblAirfoilParam.Name = "lblAirfoilParam"; 152 | lblAirfoilParam.Size = new Size(101, 15); 153 | lblAirfoilParam.TabIndex = 19; 154 | lblAirfoilParam.Text = "Airfoil Parameters"; 155 | // 156 | // chkShowControlTop 157 | // 158 | chkShowControlTop.AutoSize = true; 159 | chkShowControlTop.Location = new Point(6, 6); 160 | chkShowControlTop.Name = "chkShowControlTop"; 161 | chkShowControlTop.Size = new Size(64, 19); 162 | chkShowControlTop.TabIndex = 25; 163 | chkShowControlTop.Text = "ctrl top"; 164 | chkShowControlTop.UseVisualStyleBackColor = true; 165 | chkShowControlTop.CheckedChanged += chkShowControlTop_CheckedChanged; 166 | // 167 | // chkShowThickness 168 | // 169 | chkShowThickness.AutoSize = true; 170 | chkShowThickness.Location = new Point(6, 106); 171 | chkShowThickness.Name = "chkShowThickness"; 172 | chkShowThickness.Size = new Size(75, 19); 173 | chkShowThickness.TabIndex = 26; 174 | chkShowThickness.Text = "thickness"; 175 | chkShowThickness.UseVisualStyleBackColor = true; 176 | chkShowThickness.CheckedChanged += chkShowThickness_CheckedChanged; 177 | // 178 | // chkShowRadius 179 | // 180 | chkShowRadius.AutoSize = true; 181 | chkShowRadius.Location = new Point(6, 293); 182 | chkShowRadius.Name = "chkShowRadius"; 183 | chkShowRadius.Size = new Size(58, 19); 184 | chkShowRadius.TabIndex = 27; 185 | chkShowRadius.Text = "radius"; 186 | chkShowRadius.UseVisualStyleBackColor = true; 187 | chkShowRadius.CheckedChanged += chkShowRadius_CheckedChanged; 188 | // 189 | // chkShowCamber 190 | // 191 | chkShowCamber.AutoSize = true; 192 | chkShowCamber.Location = new Point(6, 185); 193 | chkShowCamber.Name = "chkShowCamber"; 194 | chkShowCamber.Size = new Size(66, 19); 195 | chkShowCamber.TabIndex = 29; 196 | chkShowCamber.Text = "camber"; 197 | chkShowCamber.UseVisualStyleBackColor = true; 198 | chkShowCamber.CheckedChanged += chkShowCamber_CheckedChanged; 199 | // 200 | // btnAxisAuto 201 | // 202 | btnAxisAuto.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 203 | btnAxisAuto.AutoSize = true; 204 | btnAxisAuto.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular, GraphicsUnit.Point); 205 | btnAxisAuto.Location = new Point(1049, 631); 206 | btnAxisAuto.Margin = new Padding(3, 0, 3, 0); 207 | btnAxisAuto.Name = "btnAxisAuto"; 208 | btnAxisAuto.Size = new Size(49, 25); 209 | btnAxisAuto.TabIndex = 30; 210 | btnAxisAuto.Text = "Zoom"; 211 | btnAxisAuto.UseVisualStyleBackColor = true; 212 | btnAxisAuto.Click += btnAxisAuto_Click; 213 | // 214 | // chkShowReferenceTop 215 | // 216 | chkShowReferenceTop.AutoSize = true; 217 | chkShowReferenceTop.Location = new Point(6, 343); 218 | chkShowReferenceTop.Name = "chkShowReferenceTop"; 219 | chkShowReferenceTop.Size = new Size(61, 19); 220 | chkShowReferenceTop.TabIndex = 35; 221 | chkShowReferenceTop.Text = "ref top"; 222 | chkShowReferenceTop.UseVisualStyleBackColor = true; 223 | chkShowReferenceTop.CheckedChanged += chkShowReferenceTop_CheckedChanged; 224 | // 225 | // chkShowReferenceBottom 226 | // 227 | chkShowReferenceBottom.Location = new Point(73, 343); 228 | chkShowReferenceBottom.Name = "chkShowReferenceBottom"; 229 | chkShowReferenceBottom.Size = new Size(69, 19); 230 | chkShowReferenceBottom.TabIndex = 36; 231 | chkShowReferenceBottom.Text = "ref btm"; 232 | chkShowReferenceBottom.UseVisualStyleBackColor = true; 233 | chkShowReferenceBottom.CheckedChanged += chkShowReferenceBottom_CheckedChanged; 234 | // 235 | // chkShowTop 236 | // 237 | chkShowTop.AutoSize = true; 238 | chkShowTop.Location = new Point(6, 56); 239 | chkShowTop.Name = "chkShowTop"; 240 | chkShowTop.Size = new Size(44, 19); 241 | chkShowTop.TabIndex = 40; 242 | chkShowTop.Text = "top"; 243 | chkShowTop.UseVisualStyleBackColor = true; 244 | chkShowTop.CheckedChanged += chkShowTop_CheckedChanged; 245 | // 246 | // chkShowBottom 247 | // 248 | chkShowBottom.AutoSize = true; 249 | chkShowBottom.Location = new Point(56, 56); 250 | chkShowBottom.Name = "chkShowBottom"; 251 | chkShowBottom.Size = new Size(66, 19); 252 | chkShowBottom.TabIndex = 41; 253 | chkShowBottom.Text = "bottom"; 254 | chkShowBottom.UseVisualStyleBackColor = true; 255 | chkShowBottom.CheckedChanged += chkShowBottom_CheckedChanged; 256 | // 257 | // chkShowControlBottom 258 | // 259 | chkShowControlBottom.AutoSize = true; 260 | chkShowControlBottom.Location = new Point(76, 6); 261 | chkShowControlBottom.Name = "chkShowControlBottom"; 262 | chkShowControlBottom.Size = new Size(68, 19); 263 | chkShowControlBottom.TabIndex = 43; 264 | chkShowControlBottom.Text = "ctrl btm"; 265 | chkShowControlBottom.UseVisualStyleBackColor = true; 266 | chkShowControlBottom.CheckedChanged += chkShowControlBottom_CheckedChanged; 267 | // 268 | // txtCamberPosition 269 | // 270 | txtCamberPosition.Location = new Point(76, 239); 271 | txtCamberPosition.Name = "txtCamberPosition"; 272 | txtCamberPosition.Size = new Size(57, 23); 273 | txtCamberPosition.TabIndex = 44; 274 | txtCamberPosition.Text = "0,5"; 275 | txtCamberPosition.TextChanged += txtCamberPosition_TextChanged; 276 | // 277 | // txtThicknessStepSize 278 | // 279 | txtThicknessStepSize.Location = new Point(76, 131); 280 | txtThicknessStepSize.Name = "txtThicknessStepSize"; 281 | txtThicknessStepSize.Size = new Size(57, 23); 282 | txtThicknessStepSize.TabIndex = 45; 283 | txtThicknessStepSize.Text = "1000"; 284 | txtThicknessStepSize.TextChanged += txtThicknessStepSize_TextChanged; 285 | // 286 | // txtCamberStepSize 287 | // 288 | txtCamberStepSize.Location = new Point(76, 210); 289 | txtCamberStepSize.Name = "txtCamberStepSize"; 290 | txtCamberStepSize.Size = new Size(57, 23); 291 | txtCamberStepSize.TabIndex = 46; 292 | txtCamberStepSize.Text = "1000"; 293 | txtCamberStepSize.TextChanged += txtCamberStepSize_TextChanged; 294 | // 295 | // lblThicknessStepSize 296 | // 297 | lblThicknessStepSize.AutoSize = true; 298 | lblThicknessStepSize.Location = new Point(6, 134); 299 | lblThicknessStepSize.Margin = new Padding(3); 300 | lblThicknessStepSize.Name = "lblThicknessStepSize"; 301 | lblThicknessStepSize.Size = new Size(61, 15); 302 | lblThicknessStepSize.TabIndex = 47; 303 | lblThicknessStepSize.Text = "# of steps:"; 304 | // 305 | // lblCamberStepSize 306 | // 307 | lblCamberStepSize.AutoSize = true; 308 | lblCamberStepSize.Location = new Point(6, 213); 309 | lblCamberStepSize.Margin = new Padding(3); 310 | lblCamberStepSize.Name = "lblCamberStepSize"; 311 | lblCamberStepSize.Size = new Size(61, 15); 312 | lblCamberStepSize.TabIndex = 48; 313 | lblCamberStepSize.Text = "# of steps:"; 314 | // 315 | // lblCamberPosition 316 | // 317 | lblCamberPosition.AutoSize = true; 318 | lblCamberPosition.Location = new Point(6, 242); 319 | lblCamberPosition.Margin = new Padding(3); 320 | lblCamberPosition.Name = "lblCamberPosition"; 321 | lblCamberPosition.Size = new Size(53, 15); 322 | lblCamberPosition.TabIndex = 49; 323 | lblCamberPosition.Text = "position:"; 324 | // 325 | // progressBar1 326 | // 327 | progressBar1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; 328 | progressBar1.Location = new Point(0, 660); 329 | progressBar1.Margin = new Padding(3, 2, 3, 2); 330 | progressBar1.Name = "progressBar1"; 331 | progressBar1.Size = new Size(1243, 4); 332 | progressBar1.Style = ProgressBarStyle.Continuous; 333 | progressBar1.TabIndex = 52; 334 | // 335 | // cmbLanguage 336 | // 337 | cmbLanguage.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 338 | cmbLanguage.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular, GraphicsUnit.Point); 339 | cmbLanguage.FormattingEnabled = true; 340 | cmbLanguage.Location = new Point(1201, 632); 341 | cmbLanguage.Margin = new Padding(3, 2, 3, 2); 342 | cmbLanguage.Name = "cmbLanguage"; 343 | cmbLanguage.Size = new Size(36, 23); 344 | cmbLanguage.TabIndex = 56; 345 | cmbLanguage.SelectedIndexChanged += cmbLanguage_SelectedIndexChanged; 346 | // 347 | // btnCheckForUpdates 348 | // 349 | btnCheckForUpdates.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 350 | btnCheckForUpdates.AutoSize = true; 351 | btnCheckForUpdates.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular, GraphicsUnit.Point); 352 | btnCheckForUpdates.Location = new Point(1104, 631); 353 | btnCheckForUpdates.Margin = new Padding(3, 2, 3, 2); 354 | btnCheckForUpdates.Name = "btnCheckForUpdates"; 355 | btnCheckForUpdates.Size = new Size(91, 25); 356 | btnCheckForUpdates.TabIndex = 57; 357 | btnCheckForUpdates.Text = "check version"; 358 | btnCheckForUpdates.UseVisualStyleBackColor = true; 359 | btnCheckForUpdates.Click += btnCheckForUpdates_Click; 360 | // 361 | // tabControl1 362 | // 363 | tabControl1.Anchor = AnchorStyles.Top | AnchorStyles.Right; 364 | tabControl1.Controls.Add(tabPageGridView); 365 | tabControl1.Controls.Add(tabPageLoad); 366 | tabControl1.Controls.Add(tabPageCurveFitting); 367 | tabControl1.Controls.Add(tabAirfoilBlending); 368 | tabControl1.Controls.Add(tabPageSave); 369 | tabControl1.Controls.Add(tabPagePlotVisibility); 370 | tabControl1.Location = new Point(875, 0); 371 | tabControl1.Name = "tabControl1"; 372 | tabControl1.SelectedIndex = 0; 373 | tabControl1.Size = new Size(361, 450); 374 | tabControl1.TabIndex = 62; 375 | tabControl1.MouseMove += tabControl1_MouseMove; 376 | // 377 | // tabPageGridView 378 | // 379 | tabPageGridView.Controls.Add(lblTop); 380 | tabPageGridView.Controls.Add(dataGridViewTop); 381 | tabPageGridView.Controls.Add(panel2); 382 | tabPageGridView.Controls.Add(dataGridViewBottom); 383 | tabPageGridView.Controls.Add(panel1); 384 | tabPageGridView.Controls.Add(lblBottom); 385 | tabPageGridView.Location = new Point(4, 24); 386 | tabPageGridView.Name = "tabPageGridView"; 387 | tabPageGridView.Size = new Size(353, 422); 388 | tabPageGridView.TabIndex = 3; 389 | tabPageGridView.Text = "grid view"; 390 | tabPageGridView.UseVisualStyleBackColor = true; 391 | tabPageGridView.Click += tabPageGridView_Click; 392 | // 393 | // lblTop 394 | // 395 | lblTop.AutoSize = true; 396 | lblTop.Location = new Point(3, 3); 397 | lblTop.Margin = new Padding(3); 398 | lblTop.Name = "lblTop"; 399 | lblTop.Size = new Size(26, 15); 400 | lblTop.TabIndex = 3; 401 | lblTop.Text = "Top"; 402 | // 403 | // dataGridViewTop 404 | // 405 | dataGridViewTop.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; 406 | dataGridViewTop.Location = new Point(3, 20); 407 | dataGridViewTop.Margin = new Padding(3, 2, 3, 2); 408 | dataGridViewTop.Name = "dataGridViewTop"; 409 | dataGridViewTop.RowHeadersWidth = 47; 410 | dataGridViewTop.RowTemplate.Height = 28; 411 | dataGridViewTop.Size = new Size(266, 190); 412 | dataGridViewTop.TabIndex = 1; 413 | dataGridViewTop.CellValueChanged += dataGridView1_CellValueChanged; 414 | // 415 | // panel2 416 | // 417 | panel2.Controls.Add(lblOrderBottom); 418 | panel2.Controls.Add(btnIncreaseOrderBottom); 419 | panel2.Controls.Add(txtNumOfPointBottom); 420 | panel2.Controls.Add(lblNumOfPointBottom); 421 | panel2.Controls.Add(btnDecreaseOrderBottom); 422 | panel2.Location = new Point(275, 229); 423 | panel2.Margin = new Padding(3, 2, 3, 2); 424 | panel2.Name = "panel2"; 425 | panel2.Size = new Size(75, 190); 426 | panel2.TabIndex = 59; 427 | // 428 | // lblOrderBottom 429 | // 430 | lblOrderBottom.AutoSize = true; 431 | lblOrderBottom.Location = new Point(0, 0); 432 | lblOrderBottom.Name = "lblOrderBottom"; 433 | lblOrderBottom.Size = new Size(38, 15); 434 | lblOrderBottom.TabIndex = 15; 435 | lblOrderBottom.Text = "order:"; 436 | // 437 | // btnIncreaseOrderBottom 438 | // 439 | btnIncreaseOrderBottom.AutoSize = true; 440 | btnIncreaseOrderBottom.Location = new Point(0, 17); 441 | btnIncreaseOrderBottom.Margin = new Padding(3, 2, 3, 2); 442 | btnIncreaseOrderBottom.Name = "btnIncreaseOrderBottom"; 443 | btnIncreaseOrderBottom.Size = new Size(25, 25); 444 | btnIncreaseOrderBottom.TabIndex = 9; 445 | btnIncreaseOrderBottom.Text = "+"; 446 | btnIncreaseOrderBottom.UseVisualStyleBackColor = true; 447 | btnIncreaseOrderBottom.Click += btnIncreaseOrderBottom_Click; 448 | // 449 | // txtNumOfPointBottom 450 | // 451 | txtNumOfPointBottom.Location = new Point(0, 60); 452 | txtNumOfPointBottom.Margin = new Padding(3, 2, 3, 2); 453 | txtNumOfPointBottom.Name = "txtNumOfPointBottom"; 454 | txtNumOfPointBottom.Size = new Size(76, 23); 455 | txtNumOfPointBottom.TabIndex = 11; 456 | txtNumOfPointBottom.Text = "150"; 457 | txtNumOfPointBottom.TextChanged += txtNumOfPointsBottom_TextChanged; 458 | // 459 | // lblNumOfPointBottom 460 | // 461 | lblNumOfPointBottom.AutoSize = true; 462 | lblNumOfPointBottom.Location = new Point(0, 43); 463 | lblNumOfPointBottom.Name = "lblNumOfPointBottom"; 464 | lblNumOfPointBottom.Size = new Size(64, 15); 465 | lblNumOfPointBottom.TabIndex = 13; 466 | lblNumOfPointBottom.Text = "# of points"; 467 | // 468 | // btnDecreaseOrderBottom 469 | // 470 | btnDecreaseOrderBottom.AutoSize = true; 471 | btnDecreaseOrderBottom.BackColor = SystemColors.Control; 472 | btnDecreaseOrderBottom.ForeColor = SystemColors.ControlText; 473 | btnDecreaseOrderBottom.Location = new Point(31, 17); 474 | btnDecreaseOrderBottom.Margin = new Padding(3, 2, 3, 2); 475 | btnDecreaseOrderBottom.Name = "btnDecreaseOrderBottom"; 476 | btnDecreaseOrderBottom.Size = new Size(25, 25); 477 | btnDecreaseOrderBottom.TabIndex = 17; 478 | btnDecreaseOrderBottom.Text = "-"; 479 | btnDecreaseOrderBottom.UseVisualStyleBackColor = true; 480 | btnDecreaseOrderBottom.Click += btnDecreaseOrderBottom_Click; 481 | // 482 | // dataGridViewBottom 483 | // 484 | dataGridViewBottom.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; 485 | dataGridViewBottom.Location = new Point(3, 229); 486 | dataGridViewBottom.Margin = new Padding(3, 2, 3, 2); 487 | dataGridViewBottom.Name = "dataGridViewBottom"; 488 | dataGridViewBottom.RowHeadersWidth = 47; 489 | dataGridViewBottom.RowTemplate.Height = 28; 490 | dataGridViewBottom.Size = new Size(266, 190); 491 | dataGridViewBottom.TabIndex = 2; 492 | dataGridViewBottom.CellValueChanged += dataGridView2_CellValueChanged; 493 | // 494 | // panel1 495 | // 496 | panel1.Controls.Add(lblOrderTop); 497 | panel1.Controls.Add(btnIncreaseOrderTop); 498 | panel1.Controls.Add(txtNumOfPointsTop); 499 | panel1.Controls.Add(lblNumOfPointTop); 500 | panel1.Controls.Add(btnDecreaseOrderTop); 501 | panel1.Location = new Point(275, 20); 502 | panel1.Margin = new Padding(3, 2, 3, 2); 503 | panel1.Name = "panel1"; 504 | panel1.Size = new Size(75, 190); 505 | panel1.TabIndex = 58; 506 | // 507 | // lblOrderTop 508 | // 509 | lblOrderTop.AutoSize = true; 510 | lblOrderTop.Location = new Point(0, 0); 511 | lblOrderTop.Name = "lblOrderTop"; 512 | lblOrderTop.Size = new Size(38, 15); 513 | lblOrderTop.TabIndex = 14; 514 | lblOrderTop.Text = "order:"; 515 | // 516 | // btnIncreaseOrderTop 517 | // 518 | btnIncreaseOrderTop.AutoSize = true; 519 | btnIncreaseOrderTop.Location = new Point(0, 17); 520 | btnIncreaseOrderTop.Margin = new Padding(3, 2, 3, 2); 521 | btnIncreaseOrderTop.Name = "btnIncreaseOrderTop"; 522 | btnIncreaseOrderTop.Size = new Size(25, 25); 523 | btnIncreaseOrderTop.TabIndex = 8; 524 | btnIncreaseOrderTop.Text = "+"; 525 | btnIncreaseOrderTop.UseVisualStyleBackColor = true; 526 | btnIncreaseOrderTop.Click += btnIncreaseOrderTop_Click; 527 | // 528 | // txtNumOfPointsTop 529 | // 530 | txtNumOfPointsTop.Location = new Point(0, 60); 531 | txtNumOfPointsTop.Margin = new Padding(3, 2, 3, 2); 532 | txtNumOfPointsTop.Name = "txtNumOfPointsTop"; 533 | txtNumOfPointsTop.Size = new Size(76, 23); 534 | txtNumOfPointsTop.TabIndex = 10; 535 | txtNumOfPointsTop.Text = "150"; 536 | txtNumOfPointsTop.TextChanged += txtNumOfPointsTop_TextChanged; 537 | // 538 | // lblNumOfPointTop 539 | // 540 | lblNumOfPointTop.AutoSize = true; 541 | lblNumOfPointTop.Location = new Point(0, 43); 542 | lblNumOfPointTop.Name = "lblNumOfPointTop"; 543 | lblNumOfPointTop.Size = new Size(64, 15); 544 | lblNumOfPointTop.TabIndex = 12; 545 | lblNumOfPointTop.Text = "# of points"; 546 | // 547 | // btnDecreaseOrderTop 548 | // 549 | btnDecreaseOrderTop.AutoSize = true; 550 | btnDecreaseOrderTop.Location = new Point(31, 17); 551 | btnDecreaseOrderTop.Margin = new Padding(3, 2, 3, 2); 552 | btnDecreaseOrderTop.Name = "btnDecreaseOrderTop"; 553 | btnDecreaseOrderTop.Size = new Size(25, 25); 554 | btnDecreaseOrderTop.TabIndex = 16; 555 | btnDecreaseOrderTop.Text = "-"; 556 | btnDecreaseOrderTop.UseVisualStyleBackColor = true; 557 | btnDecreaseOrderTop.Click += btnDecreaseOrderTop_Click; 558 | // 559 | // lblBottom 560 | // 561 | lblBottom.AutoSize = true; 562 | lblBottom.Location = new Point(3, 212); 563 | lblBottom.Margin = new Padding(3); 564 | lblBottom.Name = "lblBottom"; 565 | lblBottom.Size = new Size(47, 15); 566 | lblBottom.TabIndex = 4; 567 | lblBottom.Text = "Bottom"; 568 | // 569 | // tabPageLoad 570 | // 571 | tabPageLoad.Controls.Add(btnLoadBez); 572 | tabPageLoad.Controls.Add(btnLoadBezDat); 573 | tabPageLoad.Controls.Add(btnLoadDat); 574 | tabPageLoad.Controls.Add(btnDefault); 575 | tabPageLoad.Controls.Add(chkMatchTEGap); 576 | tabPageLoad.Location = new Point(4, 24); 577 | tabPageLoad.Name = "tabPageLoad"; 578 | tabPageLoad.Padding = new Padding(3); 579 | tabPageLoad.Size = new Size(353, 422); 580 | tabPageLoad.TabIndex = 0; 581 | tabPageLoad.Text = "load"; 582 | tabPageLoad.UseVisualStyleBackColor = true; 583 | // 584 | // btnLoadBez 585 | // 586 | btnLoadBez.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 587 | btnLoadBez.Location = new Point(6, 147); 588 | btnLoadBez.Name = "btnLoadBez"; 589 | btnLoadBez.Size = new Size(75, 23); 590 | btnLoadBez.TabIndex = 53; 591 | btnLoadBez.Text = ".bez"; 592 | btnLoadBez.UseVisualStyleBackColor = true; 593 | btnLoadBez.Click += btnLoadBez_Click; 594 | // 595 | // btnLoadBezDat 596 | // 597 | btnLoadBezDat.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 598 | btnLoadBezDat.Location = new Point(6, 176); 599 | btnLoadBezDat.Name = "btnLoadBezDat"; 600 | btnLoadBezDat.Size = new Size(75, 23); 601 | btnLoadBezDat.TabIndex = 32; 602 | btnLoadBezDat.Text = ".bez.dat"; 603 | btnLoadBezDat.UseVisualStyleBackColor = true; 604 | btnLoadBezDat.Click += btnLoadBezDat_Click; 605 | // 606 | // btnLoadDat 607 | // 608 | btnLoadDat.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 609 | btnLoadDat.Location = new Point(6, 64); 610 | btnLoadDat.Name = "btnLoadDat"; 611 | btnLoadDat.Size = new Size(75, 23); 612 | btnLoadDat.TabIndex = 31; 613 | btnLoadDat.Text = ".dat"; 614 | btnLoadDat.UseVisualStyleBackColor = true; 615 | btnLoadDat.Click += btnLoadDat_Click; 616 | btnLoadDat.MouseDown += btnLoadDat_MouseDown; 617 | // 618 | // btnDefault 619 | // 620 | btnDefault.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 621 | btnDefault.Location = new Point(6, 6); 622 | btnDefault.Name = "btnDefault"; 623 | btnDefault.Size = new Size(75, 23); 624 | btnDefault.TabIndex = 20; 625 | btnDefault.Text = "default"; 626 | btnDefault.UseVisualStyleBackColor = true; 627 | btnDefault.Click += btnDefault_Click; 628 | // 629 | // chkMatchTEGap 630 | // 631 | chkMatchTEGap.AutoSize = true; 632 | chkMatchTEGap.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 633 | chkMatchTEGap.Location = new Point(6, 93); 634 | chkMatchTEGap.Name = "chkMatchTEGap"; 635 | chkMatchTEGap.Size = new Size(75, 19); 636 | chkMatchTEGap.TabIndex = 71; 637 | chkMatchTEGap.Text = "match TE"; 638 | chkMatchTEGap.UseVisualStyleBackColor = true; 639 | // 640 | // tabPageCurveFitting 641 | // 642 | tabPageCurveFitting.Controls.Add(lblErrorThresholdTop); 643 | tabPageCurveFitting.Controls.Add(lblNumberOfParticles); 644 | tabPageCurveFitting.Controls.Add(txtNumberOfParticles); 645 | tabPageCurveFitting.Controls.Add(btnStopSearch); 646 | tabPageCurveFitting.Controls.Add(lblErrorNumberOfSteps); 647 | tabPageCurveFitting.Controls.Add(lblElapsedTime); 648 | tabPageCurveFitting.Controls.Add(txtErrorNumberOfSteps); 649 | tabPageCurveFitting.Controls.Add(btnAutoSearch); 650 | tabPageCurveFitting.Controls.Add(btnStartPSOBottom); 651 | tabPageCurveFitting.Controls.Add(btnSearchBottom); 652 | tabPageCurveFitting.Controls.Add(lblErrorCalculationDistribution); 653 | tabPageCurveFitting.Controls.Add(btnSearchTop); 654 | tabPageCurveFitting.Controls.Add(cmbErrorCalculationDistribution); 655 | tabPageCurveFitting.Controls.Add(btnStartPSOTop); 656 | tabPageCurveFitting.Controls.Add(chkUpdateUI); 657 | tabPageCurveFitting.Controls.Add(txtErrorThresholdTop); 658 | tabPageCurveFitting.Controls.Add(lblErrorThresholdBottom); 659 | tabPageCurveFitting.Controls.Add(txtErrorThresholdBottom); 660 | tabPageCurveFitting.Controls.Add(lblErrorThreshold); 661 | tabPageCurveFitting.Location = new Point(4, 24); 662 | tabPageCurveFitting.Name = "tabPageCurveFitting"; 663 | tabPageCurveFitting.Padding = new Padding(3); 664 | tabPageCurveFitting.Size = new Size(353, 422); 665 | tabPageCurveFitting.TabIndex = 1; 666 | tabPageCurveFitting.Text = "curve fitting"; 667 | tabPageCurveFitting.UseVisualStyleBackColor = true; 668 | // 669 | // lblErrorThresholdTop 670 | // 671 | lblErrorThresholdTop.AutoSize = true; 672 | lblErrorThresholdTop.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 673 | lblErrorThresholdTop.Location = new Point(6, 88); 674 | lblErrorThresholdTop.Margin = new Padding(3); 675 | lblErrorThresholdTop.Name = "lblErrorThresholdTop"; 676 | lblErrorThresholdTop.Size = new Size(26, 15); 677 | lblErrorThresholdTop.TabIndex = 77; 678 | lblErrorThresholdTop.Text = "Top"; 679 | // 680 | // lblNumberOfParticles 681 | // 682 | lblNumberOfParticles.AutoSize = true; 683 | lblNumberOfParticles.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 684 | lblNumberOfParticles.Location = new Point(6, 209); 685 | lblNumberOfParticles.Margin = new Padding(3); 686 | lblNumberOfParticles.Name = "lblNumberOfParticles"; 687 | lblNumberOfParticles.Size = new Size(75, 15); 688 | lblNumberOfParticles.TabIndex = 76; 689 | lblNumberOfParticles.Text = "# of particles"; 690 | // 691 | // txtNumberOfParticles 692 | // 693 | txtNumberOfParticles.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 694 | txtNumberOfParticles.Location = new Point(87, 201); 695 | txtNumberOfParticles.Name = "txtNumberOfParticles"; 696 | txtNumberOfParticles.Size = new Size(75, 23); 697 | txtNumberOfParticles.TabIndex = 75; 698 | txtNumberOfParticles.Text = "100"; 699 | // 700 | // btnStopSearch 701 | // 702 | btnStopSearch.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; 703 | btnStopSearch.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 704 | btnStopSearch.Location = new Point(6, 393); 705 | btnStopSearch.Name = "btnStopSearch"; 706 | btnStopSearch.Size = new Size(75, 23); 707 | btnStopSearch.TabIndex = 51; 708 | btnStopSearch.Text = "stop"; 709 | btnStopSearch.UseVisualStyleBackColor = true; 710 | btnStopSearch.Click += btnStopSearch_Click; 711 | // 712 | // lblErrorNumberOfSteps 713 | // 714 | lblErrorNumberOfSteps.AutoSize = true; 715 | lblErrorNumberOfSteps.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 716 | lblErrorNumberOfSteps.Location = new Point(168, 117); 717 | lblErrorNumberOfSteps.Margin = new Padding(3); 718 | lblErrorNumberOfSteps.Name = "lblErrorNumberOfSteps"; 719 | lblErrorNumberOfSteps.Size = new Size(58, 15); 720 | lblErrorNumberOfSteps.TabIndex = 74; 721 | lblErrorNumberOfSteps.Text = "# of steps"; 722 | // 723 | // lblElapsedTime 724 | // 725 | lblElapsedTime.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; 726 | lblElapsedTime.AutoSize = true; 727 | lblElapsedTime.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 728 | lblElapsedTime.Location = new Point(170, 399); 729 | lblElapsedTime.Margin = new Padding(3); 730 | lblElapsedTime.Name = "lblElapsedTime"; 731 | lblElapsedTime.Size = new Size(49, 15); 732 | lblElapsedTime.TabIndex = 50; 733 | lblElapsedTime.Text = "00:00:00"; 734 | // 735 | // txtErrorNumberOfSteps 736 | // 737 | txtErrorNumberOfSteps.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 738 | txtErrorNumberOfSteps.Location = new Point(249, 114); 739 | txtErrorNumberOfSteps.Name = "txtErrorNumberOfSteps"; 740 | txtErrorNumberOfSteps.Size = new Size(75, 23); 741 | txtErrorNumberOfSteps.TabIndex = 73; 742 | txtErrorNumberOfSteps.Text = "1000"; 743 | // 744 | // btnAutoSearch 745 | // 746 | btnAutoSearch.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 747 | btnAutoSearch.Location = new Point(168, 6); 748 | btnAutoSearch.Name = "btnAutoSearch"; 749 | btnAutoSearch.Size = new Size(75, 23); 750 | btnAutoSearch.TabIndex = 39; 751 | btnAutoSearch.Text = "auto"; 752 | btnAutoSearch.UseVisualStyleBackColor = true; 753 | btnAutoSearch.Click += btnAutoSearch_Click; 754 | // 755 | // btnStartPSOBottom 756 | // 757 | btnStartPSOBottom.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 758 | btnStartPSOBottom.Location = new Point(87, 172); 759 | btnStartPSOBottom.Name = "btnStartPSOBottom"; 760 | btnStartPSOBottom.Size = new Size(75, 23); 761 | btnStartPSOBottom.TabIndex = 72; 762 | btnStartPSOBottom.Text = "PSO btm"; 763 | btnStartPSOBottom.UseVisualStyleBackColor = true; 764 | btnStartPSOBottom.Click += btnStartPSOBottom_Click; 765 | // 766 | // btnSearchBottom 767 | // 768 | btnSearchBottom.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 769 | btnSearchBottom.Location = new Point(87, 6); 770 | btnSearchBottom.Name = "btnSearchBottom"; 771 | btnSearchBottom.Size = new Size(75, 23); 772 | btnSearchBottom.TabIndex = 38; 773 | btnSearchBottom.Text = "bottom"; 774 | btnSearchBottom.UseVisualStyleBackColor = true; 775 | btnSearchBottom.Click += btnSearchBottom_Click; 776 | btnSearchBottom.MouseDown += btnSearchBottom_MouseDown; 777 | // 778 | // lblErrorCalculationDistribution 779 | // 780 | lblErrorCalculationDistribution.AutoSize = true; 781 | lblErrorCalculationDistribution.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 782 | lblErrorCalculationDistribution.Location = new Point(168, 88); 783 | lblErrorCalculationDistribution.Margin = new Padding(3); 784 | lblErrorCalculationDistribution.Name = "lblErrorCalculationDistribution"; 785 | lblErrorCalculationDistribution.Size = new Size(68, 15); 786 | lblErrorCalculationDistribution.TabIndex = 70; 787 | lblErrorCalculationDistribution.Text = "ErrCalcDistr"; 788 | // 789 | // btnSearchTop 790 | // 791 | btnSearchTop.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 792 | btnSearchTop.Location = new Point(6, 6); 793 | btnSearchTop.Name = "btnSearchTop"; 794 | btnSearchTop.Size = new Size(75, 23); 795 | btnSearchTop.TabIndex = 37; 796 | btnSearchTop.Text = "top"; 797 | btnSearchTop.UseVisualStyleBackColor = true; 798 | btnSearchTop.Click += btnSearchTop_Click; 799 | btnSearchTop.MouseDown += btnSearchTop_MouseDown; 800 | // 801 | // cmbErrorCalculationDistribution 802 | // 803 | cmbErrorCalculationDistribution.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 804 | cmbErrorCalculationDistribution.FormattingEnabled = true; 805 | cmbErrorCalculationDistribution.Location = new Point(249, 85); 806 | cmbErrorCalculationDistribution.Name = "cmbErrorCalculationDistribution"; 807 | cmbErrorCalculationDistribution.Size = new Size(75, 23); 808 | cmbErrorCalculationDistribution.TabIndex = 61; 809 | cmbErrorCalculationDistribution.SelectedIndexChanged += cmbErrorCalculationDistribution_SelectedIndexChanged; 810 | // 811 | // btnStartPSOTop 812 | // 813 | btnStartPSOTop.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 814 | btnStartPSOTop.Location = new Point(6, 172); 815 | btnStartPSOTop.Name = "btnStartPSOTop"; 816 | btnStartPSOTop.Size = new Size(75, 23); 817 | btnStartPSOTop.TabIndex = 61; 818 | btnStartPSOTop.Text = "PSO top"; 819 | btnStartPSOTop.UseVisualStyleBackColor = true; 820 | btnStartPSOTop.Click += btnStartPSOTop_Click; 821 | // 822 | // chkUpdateUI 823 | // 824 | chkUpdateUI.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; 825 | chkUpdateUI.AutoSize = true; 826 | chkUpdateUI.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 827 | chkUpdateUI.Location = new Point(87, 398); 828 | chkUpdateUI.Name = "chkUpdateUI"; 829 | chkUpdateUI.Size = new Size(77, 19); 830 | chkUpdateUI.TabIndex = 61; 831 | chkUpdateUI.Text = "update UI"; 832 | chkUpdateUI.UseVisualStyleBackColor = true; 833 | chkUpdateUI.CheckedChanged += chkUpdateUI_CheckedChanged; 834 | // 835 | // txtErrorThresholdTop 836 | // 837 | txtErrorThresholdTop.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 838 | txtErrorThresholdTop.Location = new Point(56, 85); 839 | txtErrorThresholdTop.Name = "txtErrorThresholdTop"; 840 | txtErrorThresholdTop.Size = new Size(106, 23); 841 | txtErrorThresholdTop.TabIndex = 65; 842 | txtErrorThresholdTop.Text = "7,5e-5"; 843 | txtErrorThresholdTop.TextChanged += txtErrorThresholdTop_TextChanged; 844 | // 845 | // lblErrorThresholdBottom 846 | // 847 | lblErrorThresholdBottom.AutoSize = true; 848 | lblErrorThresholdBottom.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 849 | lblErrorThresholdBottom.Location = new Point(6, 117); 850 | lblErrorThresholdBottom.Margin = new Padding(3); 851 | lblErrorThresholdBottom.Name = "lblErrorThresholdBottom"; 852 | lblErrorThresholdBottom.Size = new Size(47, 15); 853 | lblErrorThresholdBottom.TabIndex = 69; 854 | lblErrorThresholdBottom.Text = "Bottom"; 855 | // 856 | // txtErrorThresholdBottom 857 | // 858 | txtErrorThresholdBottom.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 859 | txtErrorThresholdBottom.Location = new Point(56, 114); 860 | txtErrorThresholdBottom.Name = "txtErrorThresholdBottom"; 861 | txtErrorThresholdBottom.Size = new Size(106, 23); 862 | txtErrorThresholdBottom.TabIndex = 66; 863 | txtErrorThresholdBottom.Text = "7,5e-5"; 864 | txtErrorThresholdBottom.TextChanged += txtErrorThresholdBottom_TextChanged; 865 | // 866 | // lblErrorThreshold 867 | // 868 | lblErrorThreshold.AutoSize = true; 869 | lblErrorThreshold.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); 870 | lblErrorThreshold.Location = new Point(6, 64); 871 | lblErrorThreshold.Margin = new Padding(3); 872 | lblErrorThreshold.Name = "lblErrorThreshold"; 873 | lblErrorThreshold.Size = new Size(87, 15); 874 | lblErrorThreshold.TabIndex = 68; 875 | lblErrorThreshold.Text = "Error Threshold"; 876 | // 877 | // tabAirfoilBlending 878 | // 879 | tabAirfoilBlending.Controls.Add(formsPlot2); 880 | tabAirfoilBlending.Location = new Point(4, 24); 881 | tabAirfoilBlending.Name = "tabAirfoilBlending"; 882 | tabAirfoilBlending.Padding = new Padding(3); 883 | tabAirfoilBlending.Size = new Size(353, 422); 884 | tabAirfoilBlending.TabIndex = 5; 885 | tabAirfoilBlending.Text = "blending"; 886 | tabAirfoilBlending.UseVisualStyleBackColor = true; 887 | // 888 | // tabPageSave 889 | // 890 | tabPageSave.Controls.Add(btnSaveDXF); 891 | tabPageSave.Controls.Add(btnSaveDat); 892 | tabPageSave.Controls.Add(btnSaveBezDat); 893 | tabPageSave.Controls.Add(btnSaveBez); 894 | tabPageSave.Controls.Add(label1); 895 | tabPageSave.Controls.Add(cmbCoordinateStyle); 896 | tabPageSave.Controls.Add(lblChord); 897 | tabPageSave.Controls.Add(txtChord); 898 | tabPageSave.Location = new Point(4, 24); 899 | tabPageSave.Name = "tabPageSave"; 900 | tabPageSave.Padding = new Padding(3); 901 | tabPageSave.Size = new Size(353, 422); 902 | tabPageSave.TabIndex = 2; 903 | tabPageSave.Text = "save"; 904 | tabPageSave.UseVisualStyleBackColor = true; 905 | // 906 | // btnSaveDXF 907 | // 908 | btnSaveDXF.AutoSize = true; 909 | btnSaveDXF.Location = new Point(6, 99); 910 | btnSaveDXF.Name = "btnSaveDXF"; 911 | btnSaveDXF.Size = new Size(75, 25); 912 | btnSaveDXF.TabIndex = 77; 913 | btnSaveDXF.Text = ".dxf"; 914 | btnSaveDXF.UseVisualStyleBackColor = true; 915 | btnSaveDXF.Click += btnSaveDXF_Click; 916 | // 917 | // btnSaveDat 918 | // 919 | btnSaveDat.AutoSize = true; 920 | btnSaveDat.Location = new Point(6, 6); 921 | btnSaveDat.Name = "btnSaveDat"; 922 | btnSaveDat.Size = new Size(75, 25); 923 | btnSaveDat.TabIndex = 70; 924 | btnSaveDat.Text = ".dat"; 925 | btnSaveDat.UseVisualStyleBackColor = true; 926 | btnSaveDat.Click += btnSaveDat_Click; 927 | // 928 | // btnSaveBezDat 929 | // 930 | btnSaveBezDat.AutoSize = true; 931 | btnSaveBezDat.Location = new Point(6, 37); 932 | btnSaveBezDat.Name = "btnSaveBezDat"; 933 | btnSaveBezDat.Size = new Size(75, 25); 934 | btnSaveBezDat.TabIndex = 71; 935 | btnSaveBezDat.Text = ".bez.dat"; 936 | btnSaveBezDat.UseVisualStyleBackColor = true; 937 | btnSaveBezDat.Click += btnSaveBezDat_Click; 938 | // 939 | // btnSaveBez 940 | // 941 | btnSaveBez.AutoSize = true; 942 | btnSaveBez.Location = new Point(6, 68); 943 | btnSaveBez.Name = "btnSaveBez"; 944 | btnSaveBez.Size = new Size(75, 25); 945 | btnSaveBez.TabIndex = 72; 946 | btnSaveBez.Text = ".bez"; 947 | btnSaveBez.UseVisualStyleBackColor = true; 948 | btnSaveBez.Click += btnSaveBez_Click; 949 | // 950 | // label1 951 | // 952 | label1.Anchor = AnchorStyles.Top | AnchorStyles.Right; 953 | label1.AutoSize = true; 954 | label1.Location = new Point(87, 73); 955 | label1.Margin = new Padding(3); 956 | label1.Name = "label1"; 957 | label1.Size = new Size(68, 15); 958 | label1.TabIndex = 76; 959 | label1.Text = "export style"; 960 | // 961 | // cmbCoordinateStyle 962 | // 963 | cmbCoordinateStyle.Anchor = AnchorStyles.Top | AnchorStyles.Right; 964 | cmbCoordinateStyle.FormattingEnabled = true; 965 | cmbCoordinateStyle.Location = new Point(87, 101); 966 | cmbCoordinateStyle.Name = "cmbCoordinateStyle"; 967 | cmbCoordinateStyle.Size = new Size(75, 23); 968 | cmbCoordinateStyle.TabIndex = 74; 969 | // 970 | // lblChord 971 | // 972 | lblChord.Anchor = AnchorStyles.Top | AnchorStyles.Right; 973 | lblChord.AutoSize = true; 974 | lblChord.Location = new Point(87, 11); 975 | lblChord.Margin = new Padding(3); 976 | lblChord.Name = "lblChord"; 977 | lblChord.Size = new Size(38, 15); 978 | lblChord.TabIndex = 75; 979 | lblChord.Text = "chord"; 980 | // 981 | // txtChord 982 | // 983 | txtChord.Anchor = AnchorStyles.Top | AnchorStyles.Right; 984 | txtChord.Location = new Point(87, 39); 985 | txtChord.Name = "txtChord"; 986 | txtChord.Size = new Size(75, 23); 987 | txtChord.TabIndex = 73; 988 | txtChord.Text = "1"; 989 | // 990 | // tabPagePlotVisibility 991 | // 992 | tabPagePlotVisibility.Controls.Add(chkShowControlTop); 993 | tabPagePlotVisibility.Controls.Add(chkShowControlBottom); 994 | tabPagePlotVisibility.Controls.Add(chkShowTop); 995 | tabPagePlotVisibility.Controls.Add(chkShowBottom); 996 | tabPagePlotVisibility.Controls.Add(chkShowReferenceBottom); 997 | tabPagePlotVisibility.Controls.Add(txtCamberPosition); 998 | tabPagePlotVisibility.Controls.Add(chkShowReferenceTop); 999 | tabPagePlotVisibility.Controls.Add(lblCamberPosition); 1000 | tabPagePlotVisibility.Controls.Add(chkShowRadius); 1001 | tabPagePlotVisibility.Controls.Add(chkShowThickness); 1002 | tabPagePlotVisibility.Controls.Add(txtCamberStepSize); 1003 | tabPagePlotVisibility.Controls.Add(lblCamberStepSize); 1004 | tabPagePlotVisibility.Controls.Add(lblThicknessStepSize); 1005 | tabPagePlotVisibility.Controls.Add(txtThicknessStepSize); 1006 | tabPagePlotVisibility.Controls.Add(chkShowCamber); 1007 | tabPagePlotVisibility.Location = new Point(4, 24); 1008 | tabPagePlotVisibility.Name = "tabPagePlotVisibility"; 1009 | tabPagePlotVisibility.Padding = new Padding(3); 1010 | tabPagePlotVisibility.Size = new Size(353, 422); 1011 | tabPagePlotVisibility.TabIndex = 4; 1012 | tabPagePlotVisibility.Text = "plot visibility"; 1013 | tabPagePlotVisibility.UseVisualStyleBackColor = true; 1014 | // 1015 | // tabAirfoilBlending 1016 | // 1017 | tabAirfoilBlending.Location = new Point(4, 24); 1018 | tabAirfoilBlending.Name = "tabAirfoilBlending"; 1019 | tabAirfoilBlending.Padding = new Padding(3); 1020 | tabAirfoilBlending.Size = new Size(353, 422); 1021 | tabAirfoilBlending.TabIndex = 5; 1022 | tabAirfoilBlending.Text = "blending"; 1023 | tabAirfoilBlending.UseVisualStyleBackColor = true; 1024 | // 1025 | // formsPlot2 1026 | // 1027 | formsPlot2.Location = new Point(7, 6); 1028 | formsPlot2.Margin = new Padding(4, 3, 4, 3); 1029 | formsPlot2.Name = "formsPlot2"; 1030 | formsPlot2.Size = new Size(339, 339); 1031 | formsPlot2.TabIndex = 0; 1032 | // 1033 | // Form1 1034 | // 1035 | AutoScaleDimensions = new SizeF(7F, 15F); 1036 | AutoScaleMode = AutoScaleMode.Font; 1037 | ClientSize = new Size(1243, 664); 1038 | Controls.Add(btnAxisAuto); 1039 | Controls.Add(tabControl1); 1040 | Controls.Add(btnCheckForUpdates); 1041 | Controls.Add(cmbLanguage); 1042 | Controls.Add(progressBar1); 1043 | Controls.Add(lblAirfoilParam); 1044 | Controls.Add(txtAirfoilParam); 1045 | Controls.Add(formsPlot1); 1046 | Icon = (Icon)resources.GetObject("$this.Icon"); 1047 | Margin = new Padding(3, 2, 3, 2); 1048 | Name = "Form1"; 1049 | StartPosition = FormStartPosition.CenterScreen; 1050 | Text = "BezierAirfoilDesigner"; 1051 | FormClosing += Form1_FormClosing; 1052 | Load += Form1_Load; 1053 | MouseClick += Form1_MouseClick; 1054 | MouseMove += Form1_MouseMove; 1055 | Resize += Form1_Resize; 1056 | tabControl1.ResumeLayout(false); 1057 | tabPageGridView.ResumeLayout(false); 1058 | tabPageGridView.PerformLayout(); 1059 | ((System.ComponentModel.ISupportInitialize)dataGridViewTop).EndInit(); 1060 | panel2.ResumeLayout(false); 1061 | panel2.PerformLayout(); 1062 | ((System.ComponentModel.ISupportInitialize)dataGridViewBottom).EndInit(); 1063 | panel1.ResumeLayout(false); 1064 | panel1.PerformLayout(); 1065 | tabPageLoad.ResumeLayout(false); 1066 | tabPageLoad.PerformLayout(); 1067 | tabPageCurveFitting.ResumeLayout(false); 1068 | tabPageCurveFitting.PerformLayout(); 1069 | tabAirfoilBlending.ResumeLayout(false); 1070 | tabPageSave.ResumeLayout(false); 1071 | tabPageSave.PerformLayout(); 1072 | tabPagePlotVisibility.ResumeLayout(false); 1073 | tabPagePlotVisibility.PerformLayout(); 1074 | ResumeLayout(false); 1075 | PerformLayout(); 1076 | } 1077 | 1078 | #endregion 1079 | 1080 | private ScottPlot.FormsPlot formsPlot1; 1081 | private RichTextBox txtAirfoilParam; 1082 | private Label lblAirfoilParam; 1083 | private CheckBox chkShowControlTop; 1084 | private CheckBox chkShowThickness; 1085 | private CheckBox chkShowRadius; 1086 | private CheckBox chkShowCamber; 1087 | private Button btnAxisAuto; 1088 | private CheckBox chkShowReferenceTop; 1089 | private CheckBox chkShowReferenceBottom; 1090 | private CheckBox chkShowTop; 1091 | private CheckBox chkShowBottom; 1092 | private CheckBox chkShowControlBottom; 1093 | private TextBox txtCamberPosition; 1094 | private TextBox txtThicknessStepSize; 1095 | private TextBox txtCamberStepSize; 1096 | private Label lblThicknessStepSize; 1097 | private Label lblCamberStepSize; 1098 | private Label lblCamberPosition; 1099 | private ProgressBar progressBar1; 1100 | private ComboBox cmbLanguage; 1101 | private Button btnCheckForUpdates; 1102 | private TabControl tabControl1; 1103 | private TabPage tabPageGridView; 1104 | private Label lblTop; 1105 | private DataGridView dataGridViewTop; 1106 | private Panel panel2; 1107 | private Label lblOrderBottom; 1108 | private Button btnIncreaseOrderBottom; 1109 | private TextBox txtNumOfPointBottom; 1110 | private Label lblNumOfPointBottom; 1111 | private Button btnDecreaseOrderBottom; 1112 | private DataGridView dataGridViewBottom; 1113 | private Panel panel1; 1114 | private Label lblOrderTop; 1115 | private Button btnIncreaseOrderTop; 1116 | private TextBox txtNumOfPointsTop; 1117 | private Label lblNumOfPointTop; 1118 | private Button btnDecreaseOrderTop; 1119 | private Label lblBottom; 1120 | private TabPage tabPageLoad; 1121 | private Button btnLoadBez; 1122 | private Button btnLoadBezDat; 1123 | private Button btnLoadDat; 1124 | private Button btnDefault; 1125 | private CheckBox chkMatchTEGap; 1126 | private TabPage tabPageCurveFitting; 1127 | private Label lblNumberOfParticles; 1128 | private TextBox txtNumberOfParticles; 1129 | private Button btnStopSearch; 1130 | private Label lblErrorNumberOfSteps; 1131 | private Label lblElapsedTime; 1132 | private TextBox txtErrorNumberOfSteps; 1133 | private Button btnAutoSearch; 1134 | private Button btnStartPSOBottom; 1135 | private Button btnSearchBottom; 1136 | private Label lblErrorCalculationDistribution; 1137 | private Button btnSearchTop; 1138 | private ComboBox cmbErrorCalculationDistribution; 1139 | private Button btnStartPSOTop; 1140 | private CheckBox chkUpdateUI; 1141 | private TextBox txtErrorThresholdTop; 1142 | private Label lblErrorThresholdBottom; 1143 | private TextBox txtErrorThresholdBottom; 1144 | private Label lblErrorThreshold; 1145 | private TabPage tabPageSave; 1146 | private TabPage tabPagePlotVisibility; 1147 | private Label lblErrorThresholdTop; 1148 | private Button btnSaveDXF; 1149 | private Button btnSaveDat; 1150 | private Button btnSaveBezDat; 1151 | private Button btnSaveBez; 1152 | private Label label1; 1153 | private ComboBox cmbCoordinateStyle; 1154 | private Label lblChord; 1155 | private TextBox txtChord; 1156 | private TabPage tabAirfoilBlending; 1157 | private ScottPlot.FormsPlot formsPlot2; 1158 | } 1159 | } -------------------------------------------------------------------------------- /BezierAirfoilDesigner/GlobalSuppressions.cs: -------------------------------------------------------------------------------- 1 | // This file is used by Code Analysis to maintain SuppressMessage 2 | // attributes that are applied to this project. 3 | // Project-level suppressions either have no target or are given 4 | // a specific target and scoped to a namespace, type, member, etc. 5 | 6 | using System.Diagnostics.CodeAnalysis; 7 | 8 | [assembly: SuppressMessage("Style", "IDE1006:Benennungsstile", Justification = "", Scope = "member", Target = "~M:BezierAirfoilDesigner.Form1.txtThicknessStepSize_TextChanged(System.Object,System.EventArgs)")] 9 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/PointD.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace BezierAirfoilDesigner 8 | { 9 | public class PointD : IEquatable 10 | { 11 | public double X { get; set; } 12 | public double Y { get; set; } 13 | 14 | public PointD(double x, double y) 15 | { 16 | X = x; 17 | Y = y; 18 | } 19 | 20 | public PointD() 21 | { 22 | } 23 | 24 | public bool Equals(PointD other) 25 | { 26 | if (other == null) 27 | return false; 28 | 29 | return X == other.X && Y == other.Y; 30 | } 31 | 32 | public override bool Equals(object obj) 33 | { 34 | if (obj == null || GetType() != obj.GetType()) 35 | return false; 36 | 37 | return Equals((PointD)obj); 38 | } 39 | 40 | public override int GetHashCode() 41 | { 42 | return HashCode.Combine(X, Y); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Program.cs: -------------------------------------------------------------------------------- 1 | namespace BezierAirfoilDesigner 2 | { 3 | internal static class Program 4 | { 5 | /// 6 | /// The main entry point for the application. 7 | /// 8 | [STAThread] 9 | static void Main() 10 | { 11 | // To customize application configuration such as set high DPI settings or default font, 12 | // see https://aka.ms/applicationconfiguration. 13 | ApplicationConfiguration.Initialize(); 14 | 15 | // Set high DPI mode 16 | Application.SetHighDpiMode(HighDpiMode.PerMonitorV2); 17 | 18 | Application.Run(new Form1()); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Properties/ToolTips_de.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace BezierAirfoilDesigner.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class ToolTips_de { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal ToolTips_de() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BezierAirfoilDesigner.Properties.ToolTips_de", typeof(ToolTips_de).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Sucht eine lokalisierte Zeichenfolge, die Automatisch nach gut passenden Kontrollpunkten für beide Kurven suchen. 65 | ///Es werden rekursiv 3 andere Punkte pro Kontrollpunkt ausprobiert. 66 | ///Der Suchradius ist Error / 100 (nur vertikal). 67 | ///Wenn da nichts besseres dabei war, werden 4 andere Punkte pro Kontrollpunkt probiert. Und so weiter. 68 | ///Wenn die Verbesserung durch andere Positionen der Kontrollpunkte unter 10% liegt, wird der Grad der Kurve um 1 erhöht. 69 | ///Dann wieder suchen. 70 | ///So lange, bis der Error unter 0.075 liegt. 71 | ///Die Suche kann mit der Stopp-Taste un [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. 72 | /// 73 | internal static string btnAutoSearch { 74 | get { 75 | return ResourceManager.GetString("btnAutoSearch", resourceCulture); 76 | } 77 | } 78 | 79 | /// 80 | /// Sucht eine lokalisierte Zeichenfolge, die Passt den Zoom an die dargestellten Daten an. ähnelt. 81 | /// 82 | internal static string btnAxisAuto { 83 | get { 84 | return ResourceManager.GetString("btnAxisAuto", resourceCulture); 85 | } 86 | } 87 | 88 | /// 89 | /// Sucht eine lokalisierte Zeichenfolge, die Den Grad der unteren Bezierkurve verringern, während die Form beibehalten wird. ähnelt. 90 | /// 91 | internal static string btnDecreaseOrderBottom { 92 | get { 93 | return ResourceManager.GetString("btnDecreaseOrderBottom", resourceCulture); 94 | } 95 | } 96 | 97 | /// 98 | /// Sucht eine lokalisierte Zeichenfolge, die Den Grad der oberen Bezierkurve verringern, während die Form beibehalten wird. ähnelt. 99 | /// 100 | internal static string btnDecreaseOrderTop { 101 | get { 102 | return ResourceManager.GetString("btnDecreaseOrderTop", resourceCulture); 103 | } 104 | } 105 | 106 | /// 107 | /// Sucht eine lokalisierte Zeichenfolge, die Die Standard Kontrollpunkte laden. ähnelt. 108 | /// 109 | internal static string btnDefault { 110 | get { 111 | return ResourceManager.GetString("btnDefault", resourceCulture); 112 | } 113 | } 114 | 115 | /// 116 | /// Sucht eine lokalisierte Zeichenfolge, die Den Grad der unteren Bezierkurve erhöhen, während die Form beibehalten wird. ähnelt. 117 | /// 118 | internal static string btnIncreaseOrderBottom { 119 | get { 120 | return ResourceManager.GetString("btnIncreaseOrderBottom", resourceCulture); 121 | } 122 | } 123 | 124 | /// 125 | /// Sucht eine lokalisierte Zeichenfolge, die Den Grad der oberen Bezierkurve erhöhen, während die Form beibehalten wird. ähnelt. 126 | /// 127 | internal static string btnIncreaseOrderTop { 128 | get { 129 | return ResourceManager.GetString("btnIncreaseOrderTop", resourceCulture); 130 | } 131 | } 132 | 133 | /// 134 | /// Sucht eine lokalisierte Zeichenfolge, die Die Kontrollpunkte aus einer .bez Datei laden. ähnelt. 135 | /// 136 | internal static string btnLoadBez { 137 | get { 138 | return ResourceManager.GetString("btnLoadBez", resourceCulture); 139 | } 140 | } 141 | 142 | /// 143 | /// Sucht eine lokalisierte Zeichenfolge, die Die Kontrollpunkte aus einer .bez.dat Datei laden. ähnelt. 144 | /// 145 | internal static string btnLoadBezDat { 146 | get { 147 | return ResourceManager.GetString("btnLoadBezDat", resourceCulture); 148 | } 149 | } 150 | 151 | /// 152 | /// Sucht eine lokalisierte Zeichenfolge, die Ein Referenzprofil aus einer .dat Datei laden. Rechtsklick zum entfernen. ähnelt. 153 | /// 154 | internal static string btnLoadDat { 155 | get { 156 | return ResourceManager.GetString("btnLoadDat", resourceCulture); 157 | } 158 | } 159 | 160 | /// 161 | /// Sucht eine lokalisierte Zeichenfolge, die Speichern der aktuellen Kontrollpunkte als .bez-Datei. 162 | ///Das Format unterscheidet sich von normalen .dat-Dateien. 163 | ///Die Kontrollpunkte am Nasen- und Endleiste müssen für die oberen und unteren Kurven nicht identisch sein. 164 | ///Dies ermöglicht die Definition anderer Formen durch Bezierkurven, zum Beispiel den Flügelgrundriss. 165 | ///Derzeit nicht von anderer Software unterstützt, aber theoretisch ein besseres Dateiformat. 166 | ///Beispiel Dateiformat: 167 | /// 168 | ///Airfoil Name 169 | ///Top Start 170 | ///0.00000000 0.00000000 171 | ///0.00000000 0.15000000 172 | ///0. [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. 173 | /// 174 | internal static string btnSaveBez { 175 | get { 176 | return ResourceManager.GetString("btnSaveBez", resourceCulture); 177 | } 178 | } 179 | 180 | /// 181 | /// Sucht eine lokalisierte Zeichenfolge, die Speichern der aktuellen Kontrollpunkte als .bez.dat Datei. 182 | ///Das Format ist identisch mit normalen .dat Dateien. 183 | ///Erlaubt das einfache Importieren der Kontrollpunkte in die meisten anderen Programme. 184 | ///Beispiel Dateiformat: 185 | /// 186 | ///Airfoil Name 187 | ///1.00000000 0.00000000 188 | ///0.50000000 0.15000000 189 | ///0.00000000 0.15000000 190 | ///0.00000000 0.00000000 191 | ///0.00000000 -0.10000000 192 | ///0.50000000 -0.10000000 193 | ///1.00000000 0.00000000 ähnelt. 194 | /// 195 | internal static string btnSaveBezDat { 196 | get { 197 | return ResourceManager.GetString("btnSaveBezDat", resourceCulture); 198 | } 199 | } 200 | 201 | /// 202 | /// Sucht eine lokalisierte Zeichenfolge, die Die aktuellen Kurven als .dat Datei speichern. ähnelt. 203 | /// 204 | internal static string btnSaveDat { 205 | get { 206 | return ResourceManager.GetString("btnSaveDat", resourceCulture); 207 | } 208 | } 209 | 210 | /// 211 | /// Sucht eine lokalisierte Zeichenfolge, die Nach besseren Kontrollpunkten für die untere Kurve suchen. 212 | /// 213 | ///Rechtsklick, um eine einzelne Suche durchzuführen. ähnelt. 214 | /// 215 | internal static string btnSearchBottom { 216 | get { 217 | return ResourceManager.GetString("btnSearchBottom", resourceCulture); 218 | } 219 | } 220 | 221 | /// 222 | /// Sucht eine lokalisierte Zeichenfolge, die Nach besseren Kontrollpunkten für die obere Kurve suchen. 223 | /// 224 | ///Rechtsklick, um eine einzelne Suche durchzuführen. ähnelt. 225 | /// 226 | internal static string btnSearchTop { 227 | get { 228 | return ResourceManager.GetString("btnSearchTop", resourceCulture); 229 | } 230 | } 231 | 232 | /// 233 | /// Sucht eine lokalisierte Zeichenfolge, die Eine Partikel-Schwarm-Optimierung für die untere Kurve starten. ähnelt. 234 | /// 235 | internal static string btnStartPSOBottom { 236 | get { 237 | return ResourceManager.GetString("btnStartPSOBottom", resourceCulture); 238 | } 239 | } 240 | 241 | /// 242 | /// Sucht eine lokalisierte Zeichenfolge, die Eine Partikel-Schwarm-Optimierung für die obere Kurve starten. ähnelt. 243 | /// 244 | internal static string btnStartPSOTop { 245 | get { 246 | return ResourceManager.GetString("btnStartPSOTop", resourceCulture); 247 | } 248 | } 249 | 250 | /// 251 | /// Sucht eine lokalisierte Zeichenfolge, die Die aktuelle Suche abbrechen. ähnelt. 252 | /// 253 | internal static string btnStopSearch { 254 | get { 255 | return ResourceManager.GetString("btnStopSearch", resourceCulture); 256 | } 257 | } 258 | 259 | /// 260 | /// Sucht eine lokalisierte Zeichenfolge, die Die untere Kurve anzeigen oder ausblenden. ähnelt. 261 | /// 262 | internal static string chkShowBottom { 263 | get { 264 | return ResourceManager.GetString("chkShowBottom", resourceCulture); 265 | } 266 | } 267 | 268 | /// 269 | /// Sucht eine lokalisierte Zeichenfolge, die Die Wölbungslinie anzeigen oder ausblenden. ähnelt. 270 | /// 271 | internal static string chkShowCamber { 272 | get { 273 | return ResourceManager.GetString("chkShowCamber", resourceCulture); 274 | } 275 | } 276 | 277 | /// 278 | /// Sucht eine lokalisierte Zeichenfolge, die Die Kontrollpunkte für die untere Kurve anzeigen oder ausblenden. ähnelt. 279 | /// 280 | internal static string chkShowControlBottom { 281 | get { 282 | return ResourceManager.GetString("chkShowControlBottom", resourceCulture); 283 | } 284 | } 285 | 286 | /// 287 | /// Sucht eine lokalisierte Zeichenfolge, die Die Kontrollpunkte für die obere Kurve anzeigen oder ausblenden. ähnelt. 288 | /// 289 | internal static string chkShowControlTop { 290 | get { 291 | return ResourceManager.GetString("chkShowControlTop", resourceCulture); 292 | } 293 | } 294 | 295 | /// 296 | /// Sucht eine lokalisierte Zeichenfolge, die Den Radius an der Vorderkante anzeigen oder ausblenden. ähnelt. 297 | /// 298 | internal static string chkShowRadius { 299 | get { 300 | return ResourceManager.GetString("chkShowRadius", resourceCulture); 301 | } 302 | } 303 | 304 | /// 305 | /// Sucht eine lokalisierte Zeichenfolge, die Die Unterseite des Referenzprofils anzeigen oder ausblenden. ähnelt. 306 | /// 307 | internal static string chkShowReferenceBottom { 308 | get { 309 | return ResourceManager.GetString("chkShowReferenceBottom", resourceCulture); 310 | } 311 | } 312 | 313 | /// 314 | /// Sucht eine lokalisierte Zeichenfolge, die Die Oberseite des Referenzprofils anzeigen oder ausblenden. ähnelt. 315 | /// 316 | internal static string chkShowReferenceTop { 317 | get { 318 | return ResourceManager.GetString("chkShowReferenceTop", resourceCulture); 319 | } 320 | } 321 | 322 | /// 323 | /// Sucht eine lokalisierte Zeichenfolge, die Die Dickenverteilung anzeigen oder ausblenden. ähnelt. 324 | /// 325 | internal static string chkShowThickness { 326 | get { 327 | return ResourceManager.GetString("chkShowThickness", resourceCulture); 328 | } 329 | } 330 | 331 | /// 332 | /// Sucht eine lokalisierte Zeichenfolge, die Die obere Kurve anzeigen oder ausblenden. ähnelt. 333 | /// 334 | internal static string chkShowTop { 335 | get { 336 | return ResourceManager.GetString("chkShowTop", resourceCulture); 337 | } 338 | } 339 | 340 | /// 341 | /// Sucht eine lokalisierte Zeichenfolge, die Die Position festlegen, an der die Wölbungslinie berechnet wird. ähnelt. 342 | /// 343 | internal static string txtCamberPosition { 344 | get { 345 | return ResourceManager.GetString("txtCamberPosition", resourceCulture); 346 | } 347 | } 348 | 349 | /// 350 | /// Sucht eine lokalisierte Zeichenfolge, die Die Schrittweite festlegen, mit der die Wölbungslinie berechnet wird. ähnelt. 351 | /// 352 | internal static string txtCamberStepSize { 353 | get { 354 | return ResourceManager.GetString("txtCamberStepSize", resourceCulture); 355 | } 356 | } 357 | 358 | /// 359 | /// Sucht eine lokalisierte Zeichenfolge, die Legt die Profiltiefe fest, mit der die Koordinaten exportiert werden. ähnelt. 360 | /// 361 | internal static string txtChord { 362 | get { 363 | return ResourceManager.GetString("txtChord", resourceCulture); 364 | } 365 | } 366 | 367 | /// 368 | /// Sucht eine lokalisierte Zeichenfolge, die Die Anzahl der Punkte auf der unteren Bezierkurve festlegen. ähnelt. 369 | /// 370 | internal static string txtNumOfPointBottom { 371 | get { 372 | return ResourceManager.GetString("txtNumOfPointBottom", resourceCulture); 373 | } 374 | } 375 | 376 | /// 377 | /// Sucht eine lokalisierte Zeichenfolge, die Die Anzahl der Punkte auf der oberen Bezierkurve festlegen. ähnelt. 378 | /// 379 | internal static string txtNumOfPointsTop { 380 | get { 381 | return ResourceManager.GetString("txtNumOfPointsTop", resourceCulture); 382 | } 383 | } 384 | 385 | /// 386 | /// Sucht eine lokalisierte Zeichenfolge, die Den Schrittweite festlegen, mit der die Dickenlinie berechnet wird. ähnelt. 387 | /// 388 | internal static string txtThicknessStepSize { 389 | get { 390 | return ResourceManager.GetString("txtThicknessStepSize", resourceCulture); 391 | } 392 | } 393 | } 394 | } 395 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Properties/ToolTips_de.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Automatisch nach gut passenden Kontrollpunkten für beide Kurven suchen. 122 | Es werden rekursiv 3 andere Punkte pro Kontrollpunkt ausprobiert. 123 | Der Suchradius ist Error / 100 (nur vertikal). 124 | Wenn da nichts besseres dabei war, werden 4 andere Punkte pro Kontrollpunkt probiert. Und so weiter. 125 | Wenn die Verbesserung durch andere Positionen der Kontrollpunkte unter 10% liegt, wird der Grad der Kurve um 1 erhöht. 126 | Dann wieder suchen. 127 | So lange, bis der Error unter 0.075 liegt. 128 | Die Suche kann mit der Stopp-Taste unterbrochen werden. 129 | 130 | 131 | Passt den Zoom an die dargestellten Daten an. 132 | 133 | 134 | Den Grad der unteren Bezierkurve verringern, während die Form beibehalten wird. 135 | 136 | 137 | Den Grad der oberen Bezierkurve verringern, während die Form beibehalten wird. 138 | 139 | 140 | Die Standard Kontrollpunkte laden. 141 | 142 | 143 | Den Grad der unteren Bezierkurve erhöhen, während die Form beibehalten wird. 144 | 145 | 146 | Den Grad der oberen Bezierkurve erhöhen, während die Form beibehalten wird. 147 | 148 | 149 | Die Kontrollpunkte aus einer .bez Datei laden. 150 | 151 | 152 | Die Kontrollpunkte aus einer .bez.dat Datei laden. 153 | 154 | 155 | Ein Referenzprofil aus einer .dat Datei laden. Rechtsklick zum entfernen. 156 | 157 | 158 | Speichern der aktuellen Kontrollpunkte als .bez-Datei. 159 | Das Format unterscheidet sich von normalen .dat-Dateien. 160 | Die Kontrollpunkte am Nasen- und Endleiste müssen für die oberen und unteren Kurven nicht identisch sein. 161 | Dies ermöglicht die Definition anderer Formen durch Bezierkurven, zum Beispiel den Flügelgrundriss. 162 | Derzeit nicht von anderer Software unterstützt, aber theoretisch ein besseres Dateiformat. 163 | Beispiel Dateiformat: 164 | 165 | Airfoil Name 166 | Top Start 167 | 0.00000000 0.00000000 168 | 0.00000000 0.15000000 169 | 0.50000000 0.15000000 170 | 1.00000000 0.00000000 171 | Top End 172 | Bottom Start 173 | 0.00000000 0.00000000 174 | 0.00000000 -0.10000000 175 | 0.50000000 -0.10000000 176 | 1.00000000 0.00000000 177 | Bottom End 178 | 179 | 180 | Speichern der aktuellen Kontrollpunkte als .bez.dat Datei. 181 | Das Format ist identisch mit normalen .dat Dateien. 182 | Erlaubt das einfache Importieren der Kontrollpunkte in die meisten anderen Programme. 183 | Beispiel Dateiformat: 184 | 185 | Airfoil Name 186 | 1.00000000 0.00000000 187 | 0.50000000 0.15000000 188 | 0.00000000 0.15000000 189 | 0.00000000 0.00000000 190 | 0.00000000 -0.10000000 191 | 0.50000000 -0.10000000 192 | 1.00000000 0.00000000 193 | 194 | 195 | Die aktuellen Kurven als .dat Datei speichern. 196 | 197 | 198 | Nach besseren Kontrollpunkten für die untere Kurve suchen. 199 | 200 | Rechtsklick, um eine einzelne Suche durchzuführen. 201 | 202 | 203 | Nach besseren Kontrollpunkten für die obere Kurve suchen. 204 | 205 | Rechtsklick, um eine einzelne Suche durchzuführen. 206 | 207 | 208 | Eine Partikel-Schwarm-Optimierung für die untere Kurve starten. 209 | 210 | 211 | Eine Partikel-Schwarm-Optimierung für die obere Kurve starten. 212 | 213 | 214 | Die aktuelle Suche abbrechen. 215 | 216 | 217 | Die untere Kurve anzeigen oder ausblenden. 218 | 219 | 220 | Die Wölbungslinie anzeigen oder ausblenden. 221 | 222 | 223 | Die Kontrollpunkte für die untere Kurve anzeigen oder ausblenden. 224 | 225 | 226 | Die Kontrollpunkte für die obere Kurve anzeigen oder ausblenden. 227 | 228 | 229 | Den Radius an der Vorderkante anzeigen oder ausblenden. 230 | 231 | 232 | Die Unterseite des Referenzprofils anzeigen oder ausblenden. 233 | 234 | 235 | Die Oberseite des Referenzprofils anzeigen oder ausblenden. 236 | 237 | 238 | Die Dickenverteilung anzeigen oder ausblenden. 239 | 240 | 241 | Die obere Kurve anzeigen oder ausblenden. 242 | 243 | 244 | Die Position festlegen, an der die Wölbungslinie berechnet wird. 245 | 246 | 247 | Die Schrittweite festlegen, mit der die Wölbungslinie berechnet wird. 248 | 249 | 250 | Legt die Profiltiefe fest, mit der die Koordinaten exportiert werden. 251 | 252 | 253 | Die Anzahl der Punkte auf der unteren Bezierkurve festlegen. 254 | 255 | 256 | Die Anzahl der Punkte auf der oberen Bezierkurve festlegen. 257 | 258 | 259 | Den Schrittweite festlegen, mit der die Dickenlinie berechnet wird. 260 | 261 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Properties/ToolTips_en.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace BezierAirfoilDesigner.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class ToolTips_en { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal ToolTips_en() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BezierAirfoilDesigner.Properties.ToolTips_en", typeof(ToolTips_en).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Sucht eine lokalisierte Zeichenfolge, die Automatically search for well-fitting control points for both curves. 65 | ///Three other points per control point are recursively tried. 66 | ///The search distance is Error / 50 (vertical only). 67 | ///If no better points are found, four other points per control point are tried, and so on. 68 | ///If the improvement through different control point positions is less than 10%, 69 | ///the degree of the curve is increased by 1. 70 | ///Then search again. 71 | ///This continues until the error is less than 0.075. 72 | ///The search can be interrupted with the sto [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. 73 | /// 74 | internal static string btnAutoSearch { 75 | get { 76 | return ResourceManager.GetString("btnAutoSearch", resourceCulture); 77 | } 78 | } 79 | 80 | /// 81 | /// Sucht eine lokalisierte Zeichenfolge, die Resets the Zoom to fit Data. ähnelt. 82 | /// 83 | internal static string btnAxisAuto { 84 | get { 85 | return ResourceManager.GetString("btnAxisAuto", resourceCulture); 86 | } 87 | } 88 | 89 | /// 90 | /// Sucht eine lokalisierte Zeichenfolge, die Decrease the order of the bottom bezier curve while preserving the shape. ähnelt. 91 | /// 92 | internal static string btnDecreaseOrderBottom { 93 | get { 94 | return ResourceManager.GetString("btnDecreaseOrderBottom", resourceCulture); 95 | } 96 | } 97 | 98 | /// 99 | /// Sucht eine lokalisierte Zeichenfolge, die Decrease the order of the top bezier curve while preserving the shape. ähnelt. 100 | /// 101 | internal static string btnDecreaseOrderTop { 102 | get { 103 | return ResourceManager.GetString("btnDecreaseOrderTop", resourceCulture); 104 | } 105 | } 106 | 107 | /// 108 | /// Sucht eine lokalisierte Zeichenfolge, die Load the default control points. ähnelt. 109 | /// 110 | internal static string btnDefault { 111 | get { 112 | return ResourceManager.GetString("btnDefault", resourceCulture); 113 | } 114 | } 115 | 116 | /// 117 | /// Sucht eine lokalisierte Zeichenfolge, die Increase the order of the bottom bezier curve while preserving the shape. ähnelt. 118 | /// 119 | internal static string btnIncreaseOrderBottom { 120 | get { 121 | return ResourceManager.GetString("btnIncreaseOrderBottom", resourceCulture); 122 | } 123 | } 124 | 125 | /// 126 | /// Sucht eine lokalisierte Zeichenfolge, die Increase the order of the top bezier curve while preserving the shape. ähnelt. 127 | /// 128 | internal static string btnIncreaseOrderTop { 129 | get { 130 | return ResourceManager.GetString("btnIncreaseOrderTop", resourceCulture); 131 | } 132 | } 133 | 134 | /// 135 | /// Sucht eine lokalisierte Zeichenfolge, die Load control points from a .bez file. ähnelt. 136 | /// 137 | internal static string btnLoadBez { 138 | get { 139 | return ResourceManager.GetString("btnLoadBez", resourceCulture); 140 | } 141 | } 142 | 143 | /// 144 | /// Sucht eine lokalisierte Zeichenfolge, die Load control points from a .bez.dat file. ähnelt. 145 | /// 146 | internal static string btnLoadBezDat { 147 | get { 148 | return ResourceManager.GetString("btnLoadBezDat", resourceCulture); 149 | } 150 | } 151 | 152 | /// 153 | /// Sucht eine lokalisierte Zeichenfolge, die Load a reference airfoil from a .dat file. Right-click to remove the reference airfoil. ähnelt. 154 | /// 155 | internal static string btnLoadDat { 156 | get { 157 | return ResourceManager.GetString("btnLoadDat", resourceCulture); 158 | } 159 | } 160 | 161 | /// 162 | /// Sucht eine lokalisierte Zeichenfolge, die Save the current control points as a .bez file. 163 | ///The formatting differs from normal .dat files. 164 | ///The control points at the LE and TE don't have to be identical for the top and bottom curves. 165 | ///This allows the definition of other geometry as bezier curves, for example, the wing planform. 166 | ///Currently, this is not supported by other software, but theoretically it is a better file type. 167 | ///File format example: 168 | /// 169 | ///Airfoil Name 170 | ///Top Start 171 | ///0.00000000 0.00000000 172 | ///0.00000000 0.15000000 173 | ///0.50000000 0.15000000 174 | ///1.0000000 [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. 175 | /// 176 | internal static string btnSaveBez { 177 | get { 178 | return ResourceManager.GetString("btnSaveBez", resourceCulture); 179 | } 180 | } 181 | 182 | /// 183 | /// Sucht eine lokalisierte Zeichenfolge, die Save the current control points as a .bez.dat file. 184 | ///The formatting is identical to normal .dat files. 185 | ///This allows the control points to be easily loaded into most other programs. 186 | ///File format example: 187 | /// 188 | ///Airfoil Name 189 | ///1.00000000 0.00000000 190 | ///0.50000000 0.15000000 191 | ///0.00000000 0.15000000 192 | ///0.00000000 0.00000000 193 | ///0.00000000 -0.10000000 194 | ///0.50000000 -0.10000000 195 | ///1.00000000 0.00000000 ähnelt. 196 | /// 197 | internal static string btnSaveBezDat { 198 | get { 199 | return ResourceManager.GetString("btnSaveBezDat", resourceCulture); 200 | } 201 | } 202 | 203 | /// 204 | /// Sucht eine lokalisierte Zeichenfolge, die Save the current curves as a .dat file. ähnelt. 205 | /// 206 | internal static string btnSaveDat { 207 | get { 208 | return ResourceManager.GetString("btnSaveDat", resourceCulture); 209 | } 210 | } 211 | 212 | /// 213 | /// Sucht eine lokalisierte Zeichenfolge, die Search for better control points for the bottom curve. 214 | /// 215 | ///Right click to do a single search. ähnelt. 216 | /// 217 | internal static string btnSearchBottom { 218 | get { 219 | return ResourceManager.GetString("btnSearchBottom", resourceCulture); 220 | } 221 | } 222 | 223 | /// 224 | /// Sucht eine lokalisierte Zeichenfolge, die Search for better control points for the top curve. 225 | /// 226 | ///Right click to do a single search. ähnelt. 227 | /// 228 | internal static string btnSearchTop { 229 | get { 230 | return ResourceManager.GetString("btnSearchTop", resourceCulture); 231 | } 232 | } 233 | 234 | /// 235 | /// Sucht eine lokalisierte Zeichenfolge, die Start a Particle Swarm Optimization for the bottom curve. ähnelt. 236 | /// 237 | internal static string btnStartPSOBottom { 238 | get { 239 | return ResourceManager.GetString("btnStartPSOBottom", resourceCulture); 240 | } 241 | } 242 | 243 | /// 244 | /// Sucht eine lokalisierte Zeichenfolge, die Start a Particle Swarm Optimization for the top curve. ähnelt. 245 | /// 246 | internal static string btnStartPSOTop { 247 | get { 248 | return ResourceManager.GetString("btnStartPSOTop", resourceCulture); 249 | } 250 | } 251 | 252 | /// 253 | /// Sucht eine lokalisierte Zeichenfolge, die Stop the currently running search. ähnelt. 254 | /// 255 | internal static string btnStopSearch { 256 | get { 257 | return ResourceManager.GetString("btnStopSearch", resourceCulture); 258 | } 259 | } 260 | 261 | /// 262 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the bottom curve. ähnelt. 263 | /// 264 | internal static string chkShowBottom { 265 | get { 266 | return ResourceManager.GetString("chkShowBottom", resourceCulture); 267 | } 268 | } 269 | 270 | /// 271 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the camber line. ähnelt. 272 | /// 273 | internal static string chkShowCamber { 274 | get { 275 | return ResourceManager.GetString("chkShowCamber", resourceCulture); 276 | } 277 | } 278 | 279 | /// 280 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the control points for the bottom curve. ähnelt. 281 | /// 282 | internal static string chkShowControlBottom { 283 | get { 284 | return ResourceManager.GetString("chkShowControlBottom", resourceCulture); 285 | } 286 | } 287 | 288 | /// 289 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the control points for the top curve. ähnelt. 290 | /// 291 | internal static string chkShowControlTop { 292 | get { 293 | return ResourceManager.GetString("chkShowControlTop", resourceCulture); 294 | } 295 | } 296 | 297 | /// 298 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the leading edge radius. ähnelt. 299 | /// 300 | internal static string chkShowRadius { 301 | get { 302 | return ResourceManager.GetString("chkShowRadius", resourceCulture); 303 | } 304 | } 305 | 306 | /// 307 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the bottom of the reference airfoil. ähnelt. 308 | /// 309 | internal static string chkShowReferenceBottom { 310 | get { 311 | return ResourceManager.GetString("chkShowReferenceBottom", resourceCulture); 312 | } 313 | } 314 | 315 | /// 316 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the top of the reference airfoil. ähnelt. 317 | /// 318 | internal static string chkShowReferenceTop { 319 | get { 320 | return ResourceManager.GetString("chkShowReferenceTop", resourceCulture); 321 | } 322 | } 323 | 324 | /// 325 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the thickness distribution. ähnelt. 326 | /// 327 | internal static string chkShowThickness { 328 | get { 329 | return ResourceManager.GetString("chkShowThickness", resourceCulture); 330 | } 331 | } 332 | 333 | /// 334 | /// Sucht eine lokalisierte Zeichenfolge, die Show or hide the top curve. ähnelt. 335 | /// 336 | internal static string chkShowTop { 337 | get { 338 | return ResourceManager.GetString("chkShowTop", resourceCulture); 339 | } 340 | } 341 | 342 | /// 343 | /// Sucht eine lokalisierte Zeichenfolge, die Set the position at which the camber line is calculated. ähnelt. 344 | /// 345 | internal static string txtCamberPosition { 346 | get { 347 | return ResourceManager.GetString("txtCamberPosition", resourceCulture); 348 | } 349 | } 350 | 351 | /// 352 | /// Sucht eine lokalisierte Zeichenfolge, die Set the step size at which the camber line is calculated. ähnelt. 353 | /// 354 | internal static string txtCamberStepSize { 355 | get { 356 | return ResourceManager.GetString("txtCamberStepSize", resourceCulture); 357 | } 358 | } 359 | 360 | /// 361 | /// Sucht eine lokalisierte Zeichenfolge, die Sets the chord used during export. ähnelt. 362 | /// 363 | internal static string txtChord { 364 | get { 365 | return ResourceManager.GetString("txtChord", resourceCulture); 366 | } 367 | } 368 | 369 | /// 370 | /// Sucht eine lokalisierte Zeichenfolge, die Set the number of points on the bottom bezier curve. ähnelt. 371 | /// 372 | internal static string txtNumOfPointBottom { 373 | get { 374 | return ResourceManager.GetString("txtNumOfPointBottom", resourceCulture); 375 | } 376 | } 377 | 378 | /// 379 | /// Sucht eine lokalisierte Zeichenfolge, die Set the number of points on the top bezier curve. ähnelt. 380 | /// 381 | internal static string txtNumOfPointsTop { 382 | get { 383 | return ResourceManager.GetString("txtNumOfPointsTop", resourceCulture); 384 | } 385 | } 386 | 387 | /// 388 | /// Sucht eine lokalisierte Zeichenfolge, die Set the step size at which the thickness line is calculated. ähnelt. 389 | /// 390 | internal static string txtThicknessStepSize { 391 | get { 392 | return ResourceManager.GetString("txtThicknessStepSize", resourceCulture); 393 | } 394 | } 395 | } 396 | } 397 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/Properties/ToolTips_en.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Automatically search for well-fitting control points for both curves. 122 | Three other points per control point are recursively tried. 123 | The search distance is Error / 50 (vertical only). 124 | If no better points are found, four other points per control point are tried, and so on. 125 | If the improvement through different control point positions is less than 10%, 126 | the degree of the curve is increased by 1. 127 | Then search again. 128 | This continues until the error is less than 0.075. 129 | The search can be interrupted with the stop button. 130 | 131 | 132 | Resets the Zoom to fit Data. 133 | 134 | 135 | Decrease the order of the bottom bezier curve while preserving the shape. 136 | 137 | 138 | Decrease the order of the top bezier curve while preserving the shape. 139 | 140 | 141 | Load the default control points. 142 | 143 | 144 | Increase the order of the bottom bezier curve while preserving the shape. 145 | 146 | 147 | Increase the order of the top bezier curve while preserving the shape. 148 | 149 | 150 | Load control points from a .bez file. 151 | 152 | 153 | Load control points from a .bez.dat file. 154 | 155 | 156 | Load a reference airfoil from a .dat file. Right-click to remove the reference airfoil. 157 | 158 | 159 | Save the current control points as a .bez file. 160 | The formatting differs from normal .dat files. 161 | The control points at the LE and TE don't have to be identical for the top and bottom curves. 162 | This allows the definition of other geometry as bezier curves, for example, the wing planform. 163 | Currently, this is not supported by other software, but theoretically it is a better file type. 164 | File format example: 165 | 166 | Airfoil Name 167 | Top Start 168 | 0.00000000 0.00000000 169 | 0.00000000 0.15000000 170 | 0.50000000 0.15000000 171 | 1.00000000 0.00000000 172 | Top End 173 | Bottom Start 174 | 0.00000000 0.00000000 175 | 0.00000000 -0.10000000 176 | 0.50000000 -0.10000000 177 | 1.00000000 0.00000000 178 | Bottom End 179 | 180 | 181 | Save the current control points as a .bez.dat file. 182 | The formatting is identical to normal .dat files. 183 | This allows the control points to be easily loaded into most other programs. 184 | File format example: 185 | 186 | Airfoil Name 187 | 1.00000000 0.00000000 188 | 0.50000000 0.15000000 189 | 0.00000000 0.15000000 190 | 0.00000000 0.00000000 191 | 0.00000000 -0.10000000 192 | 0.50000000 -0.10000000 193 | 1.00000000 0.00000000 194 | 195 | 196 | Save the current curves as a .dat file. 197 | 198 | 199 | Search for better control points for the bottom curve. 200 | 201 | Right click to do a single search. 202 | 203 | 204 | Search for better control points for the top curve. 205 | 206 | Right click to do a single search. 207 | 208 | 209 | Start a Particle Swarm Optimization for the bottom curve. 210 | 211 | 212 | Start a Particle Swarm Optimization for the top curve. 213 | 214 | 215 | Stop the currently running search. 216 | 217 | 218 | Show or hide the bottom curve. 219 | 220 | 221 | Show or hide the camber line. 222 | 223 | 224 | Show or hide the control points for the bottom curve. 225 | 226 | 227 | Show or hide the control points for the top curve. 228 | 229 | 230 | Show or hide the leading edge radius. 231 | 232 | 233 | Show or hide the bottom of the reference airfoil. 234 | 235 | 236 | Show or hide the top of the reference airfoil. 237 | 238 | 239 | Show or hide the thickness distribution. 240 | 241 | 242 | Show or hide the top curve. 243 | 244 | 245 | Set the position at which the camber line is calculated. 246 | 247 | 248 | Set the step size at which the camber line is calculated. 249 | 250 | 251 | Sets the chord used during export. 252 | 253 | 254 | Set the number of points on the bottom bezier curve. 255 | 256 | 257 | Set the number of points on the top bezier curve. 258 | 259 | 260 | Set the step size at which the thickness line is calculated. 261 | 262 | -------------------------------------------------------------------------------- /BezierAirfoilDesigner/bezier icon v2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marc-frank/BezierAirfoilDesigner/8be8e1ca5d58a66f3803ece053ecbe1073e8cb9a/BezierAirfoilDesigner/bezier icon v2.ico -------------------------------------------------------------------------------- /BezierAirfoilDesigner/bezier icon v3.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marc-frank/BezierAirfoilDesigner/8be8e1ca5d58a66f3803ece053ecbe1073e8cb9a/BezierAirfoilDesigner/bezier icon v3.ico -------------------------------------------------------------------------------- /BezierAirfoilDesigner/bezier icon v4.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marc-frank/BezierAirfoilDesigner/8be8e1ca5d58a66f3803ece053ecbe1073e8cb9a/BezierAirfoilDesigner/bezier icon v4.ico -------------------------------------------------------------------------------- /BezierAirfoilDesigner/bezier icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marc-frank/BezierAirfoilDesigner/8be8e1ca5d58a66f3803ece053ecbe1073e8cb9a/BezierAirfoilDesigner/bezier icon.ico -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | modified BSD 4-Clause License 2 | 3 | Copyright (c) 2023, Marc Frank 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | 3. Modifications to the source code must retain the above copyright notice, 16 | this list of conditions, and the following disclaimer, and may not include 17 | further conditions or licensing which go against the spirit of this license 18 | 19 | 4. This software may not be used to cause deliberate harm to any individual, 20 | either directly or indirectly, in any form. 21 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 23 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 25 | SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. YOU ACKNOWLEDGE THAT 31 | THIS SOFTWARE IS NOT DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION, 32 | OPERATION OR MAINTENANCE OF ANY MILITARY FACILITY, EQUIPMENT OR OPERATION. 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BezierAirfoilDesigner 2 | 3 | An Open-Source-App for converting airfoil coordinates into Bézier curves. 4 | 5 | ## Which problem is the app supposed to solve? 6 | 7 | Anyone who has tried to model a plane in CAD knows the problem of importing airfoils. 8 | First, you have to find a way to input the coordinates into the software. Once you have solved that, you need to convert the points into a curve, usually a spline is used to connect all the points. 9 | If you want to model the upper and lower surfaces of the wing separately, you have to split the curve into upper and lower parts. This often creates a small discontinuity at the leading edge, the more coordinates you have, the smaller this tip becomes. 10 | You also need to consider how many coordinates the profile should have. Too few, and the deviation from the original becomes too large; too many, and the profile becomes overdefined, causing issues in further design steps. 11 | Even if you have found a good process, the spline curve is never completely smooth, and there are always small waves. These waves are then transferred to the final surfaces as well. 12 | 13 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/54279ddb-6641-4c81-8012-d313f4129cc8) 14 | 15 | If you also want to set a specific trailing edge thickness, you have to adjust all the coordinates or rotate them around the leading edge. Overall, the process is not very straightforward, and in my opinion, the results could be improved. 16 | 17 | ## What does the BezierAirfoilDesigner do? 18 | 19 | The BezierAirfoilDesigner allows you to import regular .dat airfoil coordinates into the program. 20 | Then, you can either manually, automatically, or through a combination of both, 21 | fit two Bézier curves to the loaded airfoil – one for the upper and one for the lower surface. 22 | 23 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/a2a8b32e-8a54-45f0-8179-91be5475b3d1) 24 | 25 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/6a6813b4-0fb8-4e57-b56b-1c57cc8071ff) 26 | 27 | To do this, you can move the control points either using the mouse or enter coordinates directly into the corresponding table. Under the "search" function, a recursive algorithm can be used to try out different positions for the control points to reduce the error (difference from the reference airfoil). The "Search Top" and "Search Bottom" functions continue searching for new points until the improvement is under 5%. 28 | 29 | Initially, three other positions per control point are tested. If there is no better position found, the number of tested points within the same "search radius" (only vertical) is increased by 1. 30 | 31 | With "auto search," the degree of the curves is increased by 1 (adding a control point) after each search process for the upper and lower curves, without altering the shape of the curve. This process is repeated until the error is under 0.075. 32 | 33 | Depending on the quality and complexity of the reference airfoil, the automatic adjustment can take between 10 minutes and 3 hours. For very poor-quality profiles, the termination condition might never be reached, in which case there is a stop button to abort the current search. 34 | 35 | ## When the search is completed... 36 | 37 | ...you can export the control points as .bez.dat files. 38 | These files have the same structure as normal .dat files, and thanks to the same file extension, you can import them into CAD software just like normal .dat files. The curves can then be drawn using a "control point spline" (in Fusion 360 or similar curve types in other software). 39 | 40 | Currently, there is a limit of 6 control points when implementing Bézier curves using the "control point spline" in Fusion 360 (there is a workaround to use up to 10 control points). With more control points, the curves no longer match. I'm not sure if this is a bug in Fusion 360 or related to the curve type they are using. I have already addressed this issue, so there might be changes in the future. 41 | 42 | Solidworks and Onshape have no problem drawing the correct curves. 43 | Rhino7 can do up to degree 11. 44 | 45 | ## Results in CAD: 46 | 47 | The airfoils drawn from the control points are already divided into upper and lower surfaces by default, so you don't need to do this separately. The curvature distribution no longer shows waves on the surface. 48 | 49 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/f76aee4a-2157-4c97-9675-85973ead7c36) 50 | 51 | You can easily set the trailing edge thickness by adding another dimension. 52 | 53 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/1a463613-a831-4649-a029-9e1d8bee4414) 54 | 55 | ## Another use case 56 | 57 | The program can be used not only to simplify and improve processes in CAD but also to smooth existing profiles, potentially improving the performance of the airfoil. 58 | The resulting coordinates are naturally spaced based on the curvature. Using a continous bezier curve creates a very smooth curve, without waves or bumps, such as a simple spline interpolation would do. 59 | This also leads to very nice velocity distributions. 60 | 61 | Before: 62 | 63 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/bbd6585d-2b28-46d2-ab88-058bba7e1105) 64 | 65 | After: 66 | 67 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/1d0855e4-29d8-4c3b-8c64-3e96af7519f1) 68 | 69 | Polars are similar, maybe a tiny bit better. 70 | 71 | ![image](https://github.com/marc-frank/BezierAirfoilDesigner/assets/74321912/775eb0f2-9e71-4135-891d-b04f918047e3) 72 | 73 | ## Miscellaneous 74 | 75 | In addition to the .bez.dat format, you can also save the control points as .bez files. This allows the representation of shapes where the beginning and end of the curves are not identical and do not lie between 0 and 1. This might be useful for creating wing outlines. 76 | 77 | Furthermore, you can export the coordinates of the Bézier curves as .dat files. However, it is essential to consider the program in which you want to use the profiles further. The Profile Editor by Frank Ranis accepts a maximum of 450 points, and xflr5 has a limit of 300 points. 78 | 79 | If it's crucial that all points on both curves have the same X-coordinates, you should ensure that all control points have the same X-coordinates as well. 80 | 81 | ## Installation 82 | 83 | For Windows, simply download the appropriate .exe file from GitHub under Releases. 84 | 85 | Before version v0.9, I selected "Framework-dependent" in the release settings. If you want to try earlier versions, you'll need to download .NET 7 as well. 86 | 87 | The app was created in Visual Studio as a Winforms project using C#. 88 | I'm not sure if it runs under Linux with Wine as it hasn't worked in previous tests. 89 | However, it runs in a VM under MacOS. 90 | 91 | --- 92 | 93 | I would appreciate feedback and suggestions for further functionality. 94 | Bugs in the program and minor feature requests can be reported under Issues. 95 | If you want to fix them yourself, you can create a Pull request. 96 | 97 | Best regards, 98 | Marc 99 | -------------------------------------------------------------------------------- /RG15.bez.dat: -------------------------------------------------------------------------------- 1 | Airfoil Name 2 | 1.00000000 0.00000000 3 | 0.91216433 0.01742983 4 | 0.74049950 0.03965667 5 | 0.56497115 0.06006932 6 | 0.41084602 0.06858771 7 | 0.28199670 0.06980780 8 | 0.17581800 0.06323140 9 | 0.09645966 0.05274464 10 | 0.03043746 0.03486833 11 | 0.00015472 0.01127525 12 | 0.00000000 0.00000000 13 | 0.00002558 -0.00864550 14 | 0.02668305 -0.01984352 15 | 0.08598740 -0.03170931 16 | 0.17026263 -0.03668490 17 | 0.28335330 -0.03422296 18 | 0.42383450 -0.02894386 19 | 0.58595282 -0.01985243 20 | 0.75457108 -0.00643320 21 | 0.90442252 0.00418461 22 | 1.00000000 0.00000000 23 | -------------------------------------------------------------------------------- /RG15_BezierMod.dat: -------------------------------------------------------------------------------- 1 | Airfoil Name 2 | 1.00000000 0.00000000 3 | 0.99075258 0.00178179 4 | 0.98079306 0.00360263 5 | 0.97017670 0.00545741 6 | 0.95895588 0.00734094 7 | 0.94718057 0.00924800 8 | 0.93489814 0.01117336 9 | 0.92215365 0.01311184 10 | 0.90899026 0.01505833 11 | 0.89544833 0.01700779 12 | 0.88156617 0.01895534 13 | 0.86738062 0.02089621 14 | 0.85292590 0.02282579 15 | 0.83823490 0.02473962 16 | 0.82333839 0.02663345 17 | 0.80826563 0.02850319 18 | 0.79304385 0.03034497 19 | 0.77769935 0.03215511 20 | 0.76225632 0.03393012 21 | 0.74673778 0.03566672 22 | 0.73116577 0.03736185 23 | 0.71556014 0.03901263 24 | 0.69994020 0.04061640 25 | 0.68432379 0.04217072 26 | 0.66872764 0.04367329 27 | 0.65316755 0.04512203 28 | 0.63765800 0.04651507 29 | 0.62221289 0.04785066 30 | 0.60684490 0.04912730 31 | 0.59156585 0.05034360 32 | 0.57638675 0.05149834 33 | 0.56131798 0.05259047 34 | 0.54636902 0.05361907 35 | 0.53154862 0.05458337 36 | 0.51686507 0.05548272 37 | 0.50232553 0.05631659 38 | 0.48793739 0.05708459 39 | 0.47370660 0.05778641 40 | 0.45963937 0.05842185 41 | 0.44574070 0.05899082 42 | 0.43201554 0.05949328 43 | 0.41846848 0.05992931 44 | 0.40510350 0.06029905 45 | 0.39192420 0.06060270 46 | 0.37893406 0.06084049 47 | 0.36613587 0.06101280 48 | 0.35353237 0.06111994 49 | 0.34112597 0.06116235 50 | 0.32891887 0.06114048 51 | 0.31691295 0.06105480 52 | 0.30511004 0.06090588 53 | 0.29351133 0.06069420 54 | 0.28211844 0.06042037 55 | 0.27093247 0.06008500 56 | 0.25995445 0.05968866 57 | 0.24918550 0.05923208 58 | 0.23862603 0.05871578 59 | 0.22827727 0.05814055 60 | 0.21813966 0.05750704 61 | 0.20821388 0.05681596 62 | 0.19850063 0.05606806 63 | 0.18900026 0.05526404 64 | 0.17971383 0.05440480 65 | 0.17064151 0.05349103 66 | 0.16178420 0.05252366 67 | 0.15314254 0.05150355 68 | 0.14471732 0.05043163 69 | 0.13650946 0.04930895 70 | 0.12851968 0.04813644 71 | 0.12074924 0.04691532 72 | 0.11319914 0.04564674 73 | 0.10587072 0.04433199 74 | 0.09876543 0.04297249 75 | 0.09188469 0.04156966 76 | 0.08523038 0.04012520 77 | 0.07880423 0.03864083 78 | 0.07260834 0.03711848 79 | 0.06664489 0.03556025 80 | 0.06091621 0.03396839 81 | 0.05542489 0.03234543 82 | 0.05017354 0.03069404 83 | 0.04516505 0.02901722 84 | 0.04040236 0.02731818 85 | 0.03588859 0.02560046 86 | 0.03162693 0.02386790 87 | 0.02762065 0.02212465 88 | 0.02387312 0.02037532 89 | 0.02038767 0.01862483 90 | 0.01716761 0.01687855 91 | 0.01421622 0.01514231 92 | 0.01153659 0.01342241 93 | 0.00913166 0.01172568 94 | 0.00700407 0.01005948 95 | 0.00515615 0.00843177 96 | 0.00358973 0.00685109 97 | 0.00230614 0.00532666 98 | 0.00130601 0.00386835 99 | 0.00058920 0.00248677 100 | 0.00015459 0.00119327 101 | 0.00000000 0.00000000 102 | 0.00012558 -0.00088476 103 | 0.00049977 -0.00179139 104 | 0.00112606 -0.00271811 105 | 0.00200736 -0.00366288 106 | 0.00314607 -0.00462352 107 | 0.00454414 -0.00559765 108 | 0.00620313 -0.00658278 109 | 0.00812425 -0.00757635 110 | 0.01030842 -0.00857569 111 | 0.01275628 -0.00957812 112 | 0.01546824 -0.01058090 113 | 0.01844453 -0.01158131 114 | 0.02168520 -0.01257663 115 | 0.02519015 -0.01356419 116 | 0.02895921 -0.01454136 117 | 0.03299201 -0.01550556 118 | 0.03728815 -0.01645428 119 | 0.04184717 -0.01738512 120 | 0.04666851 -0.01829573 121 | 0.05175159 -0.01918391 122 | 0.05709570 -0.02004749 123 | 0.06270021 -0.02088452 124 | 0.06856431 -0.02169305 125 | 0.07468728 -0.02247133 126 | 0.08106827 -0.02321770 127 | 0.08770639 -0.02393060 128 | 0.09460083 -0.02460865 129 | 0.10175048 -0.02525052 130 | 0.10915446 -0.02585506 131 | 0.11681168 -0.02642122 132 | 0.12472090 -0.02694805 133 | 0.13288116 -0.02743475 134 | 0.14129090 -0.02788057 135 | 0.14994892 -0.02828496 136 | 0.15885377 -0.02864739 137 | 0.16800384 -0.02896746 138 | 0.17739749 -0.02924490 139 | 0.18703274 -0.02947944 140 | 0.19690804 -0.02967104 141 | 0.20702088 -0.02981959 142 | 0.21736932 -0.02992518 143 | 0.22795090 -0.02998790 144 | 0.23876294 -0.03000795 145 | 0.24980301 -0.02998561 146 | 0.26106769 -0.02992114 147 | 0.27255422 -0.02981499 148 | 0.28425911 -0.02966755 149 | 0.29617873 -0.02947934 150 | 0.30830932 -0.02925091 151 | 0.32064652 -0.02898282 152 | 0.33318642 -0.02867575 153 | 0.34592417 -0.02833040 154 | 0.35885495 -0.02794749 155 | 0.37197345 -0.02752784 156 | 0.38527438 -0.02707226 157 | 0.39875180 -0.02658165 158 | 0.41239971 -0.02605696 159 | 0.42621160 -0.02549918 160 | 0.44018075 -0.02490934 161 | 0.45430011 -0.02428855 162 | 0.46856210 -0.02363799 163 | 0.48295873 -0.02295888 164 | 0.49748209 -0.02225253 165 | 0.51212358 -0.02152030 166 | 0.52687407 -0.02076367 167 | 0.54172415 -0.01998416 168 | 0.55666411 -0.01918343 169 | 0.57168376 -0.01836321 170 | 0.58677244 -0.01752533 171 | 0.60191929 -0.01667176 172 | 0.61711264 -0.01580458 173 | 0.63234055 -0.01492600 174 | 0.64759076 -0.01403837 175 | 0.66285032 -0.01314419 176 | 0.67810613 -0.01224610 177 | 0.69334424 -0.01134693 178 | 0.70855075 -0.01044967 179 | 0.72371066 -0.00955750 180 | 0.73880875 -0.00867379 181 | 0.75382966 -0.00780210 182 | 0.76875705 -0.00694620 183 | 0.78357446 -0.00611011 184 | 0.79826421 -0.00529803 185 | 0.81280929 -0.00451444 186 | 0.82719105 -0.00376403 187 | 0.84139109 -0.00305175 188 | 0.85539013 -0.00238279 189 | 0.86916840 -0.00176265 190 | 0.88270587 -0.00119703 191 | 0.89598155 -0.00069196 192 | 0.90897411 -0.00025372 193 | 0.92166215 0.00011113 194 | 0.93402296 0.00039576 195 | 0.94603378 0.00059303 196 | 0.95767111 0.00069553 197 | 0.96891111 0.00069559 198 | 0.97972929 0.00058522 199 | 0.99010098 0.00035620 200 | 1.00000000 0.00000000 201 | -------------------------------------------------------------------------------- /RG15mod.dat: -------------------------------------------------------------------------------- 1 | Demo Profil ! 2 | 1.000000 -0.000000 3 | 0.999549 0.000079 4 | 0.998199 0.000322 5 | 0.995950 0.000732 6 | 0.992808 0.001305 7 | 0.988778 0.002040 8 | 0.983866 0.002939 9 | 0.978083 0.003987 10 | 0.971439 0.005165 11 | 0.963945 0.006459 12 | 0.955614 0.007857 13 | 0.946463 0.009351 14 | 0.936507 0.010924 15 | 0.925765 0.012572 16 | 0.914255 0.014287 17 | 0.901999 0.016065 18 | 0.889018 0.017900 19 | 0.875336 0.019788 20 | 0.860978 0.021721 21 | 0.845969 0.023695 22 | 0.830337 0.025702 23 | 0.814110 0.027732 24 | 0.797317 0.029779 25 | 0.779987 0.031833 26 | 0.762154 0.033887 27 | 0.743847 0.035932 28 | 0.725102 0.037960 29 | 0.705951 0.039965 30 | 0.686428 0.041934 31 | 0.666570 0.043858 32 | 0.646411 0.045726 33 | 0.625989 0.047531 34 | 0.605340 0.049262 35 | 0.584500 0.050911 36 | 0.563509 0.052467 37 | 0.542403 0.053924 38 | 0.521221 0.055271 39 | 0.500000 0.056497 40 | 0.478779 0.057593 41 | 0.457597 0.058557 42 | 0.436491 0.059382 43 | 0.415500 0.060061 44 | 0.394660 0.060586 45 | 0.374011 0.060954 46 | 0.353589 0.061158 47 | 0.333430 0.061191 48 | 0.313572 0.061047 49 | 0.294049 0.060724 50 | 0.274898 0.060219 51 | 0.256153 0.059533 52 | 0.237846 0.058664 53 | 0.220013 0.057611 54 | 0.202683 0.056374 55 | 0.185890 0.054958 56 | 0.169663 0.053366 57 | 0.154031 0.051598 58 | 0.139022 0.049661 59 | 0.124664 0.047558 60 | 0.110982 0.045294 61 | 0.098001 0.042872 62 | 0.085745 0.040301 63 | 0.074235 0.037605 64 | 0.063493 0.034797 65 | 0.053537 0.031888 66 | 0.044386 0.028902 67 | 0.036055 0.025865 68 | 0.028561 0.022777 69 | 0.021917 0.019628 70 | 0.016134 0.016439 71 | 0.011222 0.013275 72 | 0.007192 0.010228 73 | 0.004050 0.007408 74 | 0.001801 0.005208 75 | 0.000451 0.001974 76 | 0.000000 0.000000 77 | 0.000451 -0.001424 78 | 0.001801 -0.003756 79 | 0.004050 -0.005281 80 | 0.007192 -0.007098 81 | 0.011222 -0.008941 82 | 0.016134 -0.010802 83 | 0.021917 -0.012624 84 | 0.028561 -0.014401 85 | 0.036055 -0.016136 86 | 0.044386 -0.017822 87 | 0.053537 -0.019453 88 | 0.063493 -0.020993 89 | 0.074235 -0.022434 90 | 0.085745 -0.023771 91 | 0.098001 -0.024994 92 | 0.110982 -0.026094 93 | 0.124664 -0.027057 94 | 0.139022 -0.027875 95 | 0.154031 -0.028551 96 | 0.169663 -0.029091 97 | 0.185890 -0.029497 98 | 0.202683 -0.029777 99 | 0.220013 -0.029935 100 | 0.237846 -0.029979 101 | 0.256153 -0.029915 102 | 0.274898 -0.029744 103 | 0.294049 -0.029467 104 | 0.313572 -0.029093 105 | 0.333430 -0.028625 106 | 0.353589 -0.028066 107 | 0.374011 -0.027422 108 | 0.394660 -0.026701 109 | 0.415500 -0.025902 110 | 0.436491 -0.025036 111 | 0.457597 -0.024109 112 | 0.478779 -0.023130 113 | 0.500000 -0.022108 114 | 0.521221 -0.021048 115 | 0.542403 -0.019955 116 | 0.563509 -0.018835 117 | 0.584500 -0.017692 118 | 0.605340 -0.016530 119 | 0.625989 -0.015356 120 | 0.646411 -0.014170 121 | 0.666570 -0.012983 122 | 0.686428 -0.011801 123 | 0.705951 -0.010631 124 | 0.725102 -0.009485 125 | 0.743847 -0.008369 126 | 0.762154 -0.007295 127 | 0.779987 -0.006269 128 | 0.797317 -0.005299 129 | 0.814110 -0.004391 130 | 0.830337 -0.003552 131 | 0.845969 -0.002785 132 | 0.860978 -0.002093 133 | 0.875336 -0.001479 134 | 0.889018 -0.000942 135 | 0.901999 -0.000487 136 | 0.914255 -0.000109 137 | 0.925765 0.000191 138 | 0.936507 0.000416 139 | 0.946463 0.000569 140 | 0.955614 0.000656 141 | 0.963945 0.000685 142 | 0.971439 0.000665 143 | 0.978083 0.000604 144 | 0.983866 0.000512 145 | 0.988778 0.000400 146 | 0.992808 0.000280 147 | 0.995950 0.000170 148 | 0.998199 0.000071 149 | 0.999549 0.000013 150 | 1.000000 -0.000003 151 | --------------------------------------------------------------------------------