clc; clear; close all;
%% === Step 1: Define Original Control Points ===
upper_cp = [
9.4866e-05 -0.0011563
0.005862 0.01116
0.0112 0.014493
0.017074 0.015589
0.028034 0.01735
0.12181 0.023797
0.23774 0.021358
0.42076 0.023313
0.45841 0.028926
0.46235 0.029719
];
lower_cp = [
9.4866e-05 -0.0011563
0.0035485 -0.0091313
0.007586 -0.013067
0.016653 -0.017347
0.036891 -0.025853
0.063068 -0.032909
0.087344 -0.036016
0.1696 -0.031535
0.37688 0.0027707
0.46235 0.027561
];
%% === Step 2: Flap Coordinates (unchanged) ===
flap1 = [
0.78138031 0.158624699
0.785287007 0.160151642
0.778551984 0.157524172
0.771809828 0.154914274
0.765066912 0.152309091
0.758330201 0.149686354
0.751608171 0.147026235
0.744904129 0.1443211
0.738212662 0.14158498
0.731519428 0.138853193
0.724805705 0.136172246
0.718054042 0.133588481
0.711253313 0.131136901
0.70440042 0.128835217
0.697497865 0.126687017
0.690550796 0.124687433
0.68356467 0.122828782
0.676544414 0.121103458
0.669494948 0.119501685
0.662421804 0.118007825
0.655331515 0.116597108
0.64823139 0.115236938
0.641127913 0.113894278
0.634025802 0.112544428
0.626926796 0.111178334
0.619829666 0.109801549
0.612732644 0.108426139
0.605633412 0.107061247
0.598532193 0.1057067
0.591430471 0.104354795
0.584329825 0.102997248
0.577230598 0.101632294
0.570131289 0.100267774
0.56302974 0.098914971
0.555924978 0.097579138
0.548818809 0.096250809
0.54171556 0.094906972
0.534619326 0.093526588
0.527530364 0.09210933
0.5204418 0.090690047
0.513342729 0.0893245
0.506227052 0.088048371
0.499100518 0.086833981
0.49198206 0.085573653
0.484891919 0.084163149
0.477823472 0.082646901
0.47072004 0.081306826
0.463624482 0.079925326
0.456548819 0.078466603
0.450934226 0.074170154
0.449018294 0.067328104
0.451595264 0.060682919
0.457628832 0.056976079
0.464825795 0.056534222
0.472055544 0.056588119
0.479283691 0.056693547
0.486498957 0.057129304
0.49368506 0.05790959
0.500844325 0.058914934
0.50798385 0.060049501
0.515104939 0.061295283
0.52220015 0.062676572
0.529263775 0.064217733
0.536291905 0.065910609
0.543290448 0.067720913
0.550269595 0.069610669
0.557230293 0.07155926
0.564171667 0.073579541
0.571081386 0.075704098
0.577946843 0.077968044
0.584757992 0.080389027
0.591516764 0.082955414
0.598232908 0.085630276
0.604923956 0.088367379
0.611605951 0.091124054
0.618292552 0.093874564
0.624985573 0.09660688
0.631686265 0.099318512
0.638398316 0.102007956
0.645121094 0.104663772
0.651864561 0.10727125
0.658630757 0.109813548
0.665423814 0.112284913
0.672239818 0.114695255
0.679068259 0.117071303
0.685895646 0.119448591
0.692709756 0.121861837
0.699502515 0.124335229
0.706270674 0.126877082
0.713014728 0.129482594
0.719738187 0.132139049
0.726446623 0.134830958
0.733147367 0.13754411
0.73984506 0.140264951
0.746544342 0.142981877
0.753248865 0.145685025
0.75996309 0.148367125
0.766687722 0.151021631
0.773424124 0.153644361
0.780173392 0.156232971
0.784920726 0.158029794
];
flap2 = [
0.996279887 0.287802774
0.999990588 0.289758316
0.99535485 0.287316494
0.990714744 0.284882984
0.986073631 0.282451392
0.981436941 0.280011383
0.976809717 0.277553475
0.972194554 0.275074587
0.967585692 0.272580825
0.962975707 0.270090725
0.95835188 0.26762645
0.953703091 0.265209637
0.949022249 0.262855537
0.944307139 0.260570841
0.939558891 0.258355857
0.934780145 0.256207385
0.929973802 0.254121368
0.925142446 0.252093946
0.92028882 0.250120408
0.915416424 0.248193686
0.91052993 0.246303049
0.905635049 0.244434677
0.900736812 0.242574394
0.895839649 0.240711591
0.890945095 0.238841791
0.886052464 0.236966864
0.881159902 0.235091754
0.876265826 0.233220824
0.871369982 0.231354742
0.866473398 0.229490629
0.861577378 0.227624726
0.856682473 0.225755321
0.851787897 0.223884795
0.846892052 0.222017993
0.841993941 0.2201585
0.837094261 0.218304751
0.832194127 0.216447798
0.827299497 0.21457828
0.822411612 0.212691248
0.817527357 0.210794707
0.812638505 0.208910146
0.807736894 0.207059018
0.802821374 0.20524514
0.797902771 0.203439631
0.79300032 0.201590811
0.788124363 0.199673201
0.783251078 0.197748822
0.778342926 0.195915212
0.773453183 0.19403124
0.768680606 0.191900663
0.765749211 0.187730177
0.768505277 0.183696348
0.773643876 0.183120393
0.778761368 0.184226353
0.783838478 0.185520811
0.788910368 0.186835065
0.793944315 0.188287473
0.798933381 0.189888867
0.803888039 0.191591583
0.808822572 0.193352879
0.813740144 0.195161279
0.818636755 0.197025512
0.823507004 0.198957554
0.828349586 0.200957945
0.833168699 0.203014267
0.837970971 0.205109581
0.842761246 0.207232341
0.847538551 0.209384044
0.852296737 0.211577649
0.857027445 0.213829879
0.861723801 0.216152864
0.866384581 0.218546445
0.87101557 0.22099723
0.875627163 0.223484307
0.880230756 0.225986221
0.884834663 0.228487542
0.889442735 0.230981181
0.894055986 0.233465221
0.898674857 0.235938801
0.903301249 0.23839828
0.907938908 0.24083643
0.912591686 0.243245615
0.91726146 0.245621656
0.921946485 0.247967519
0.926640975 0.250294387
0.931336901 0.252618357
0.936026058 0.254955944
0.940702097 0.257319658
0.945362033 0.259714957
0.950006087 0.262140906
0.954636738 0.264592337
0.959257642 0.267062128
0.963872552 0.269543088
0.968484946 0.272028703
0.973097932 0.274513271
0.977714087 0.276991944
0.982335474 0.279460843
0.986963614 0.281917038
0.991599537 0.284358489
0.996243837 0.286783993
0.999968527 0.288714167
];
%% === Step 3: Bézier Evaluation Function ===
function pts = bezier_eval(ctrl, t)
n = size(ctrl,1)-1;
pts = zeros(length(t),2);
for i=0:n
coeff = nchoosek(n,i)*(1-t).^(n-i).*t.^i;
coeff = coeff(:);
pts(:,1) = pts(:,1) + coeff*ctrl(i+1,1);
pts(:,2) = pts(:,2) + coeff*ctrl(i+1,2);
end
end
%% === Step 4: Rotation Function ===
function rotated = rotate_about_point(points, origin, theta_deg)
theta = deg2rad(theta_deg);
R = [cos(theta) -sin(theta); sin(theta) cos(theta)];
translated = points - origin;
rotated = (R * translated')' + origin;
end
%% === Step 5: Plot and Save Function ===
function plot_save_bezier(upper_bez, lower_bez, flap1, flap2, title_str, filename)
figure('Visible','off'); hold on; axis equal; grid on;
plot(upper_bez(:,1), upper_bez(:,2),'r','LineWidth',2);
plot(lower_bez(:,1), lower_bez(:,2),'b','LineWidth',2);
plot(flap1(:,1), flap1(:,2),'k','LineWidth',1.2);
plot(flap2(:,1), flap2(:,2),'k','LineWidth',1.2);
title(title_str); xlabel('x/c'); ylabel('y/c');
saveas(gcf,[filename,'.png']); close;
end
%% === Step 6: Common Parameters ===
factors = [0.5, 0.75, 1.25, 1.5];
upper_mod_idx = [5,6,7];
lower_mod_idx = [6,8,9];
t = linspace(0,1,50);
origin = [9.4866e-05 -0.0011563];
%% === Step 7: Rotate Original CPs by +3° ===
upper_rot = rotate_about_point(upper_cp, origin, 3);
lower_rot = rotate_about_point(lower_cp, origin, 3);
% Evaluate and save rotated-only geometry
upper_bez = bezier_eval(upper_rot, t);
lower_bez = bezier_eval(lower_rot, t);
data_to_save = [upper_bez; lower_bez; flap1; flap2];
writematrix(data_to_save, 'Set1_RotatedOnly.txt', 'Delimiter','tab');
plot_save_bezier(upper_bez, lower_bez, flap1, flap2, 'Rotated +3° only',
'Set1_RotatedOnly');
disp('=== Rotated Main Element Control Points ===');
disp('Upper Surface:'); disp(upper_rot);
disp('Lower Surface:'); disp(lower_rot);
%% === Step 8: CASE 1: Upper CP modification (after rotation) ===
for f = factors
tmp_upper = upper_rot;
tmp_upper(upper_mod_idx,2) = tmp_upper(upper_mod_idx,2) * f;
upper_bez = bezier_eval(tmp_upper, t);
lower_bez = bezier_eval(lower_rot, t);
data_to_save = [upper_bez; lower_bez; flap1; flap2];
filename_txt = ['Set1_Rotated_UpperFactor_',num2str(f)];
writematrix(data_to_save, [filename_txt,'.txt'],'Delimiter','tab');
plot_save_bezier(upper_bez, lower_bez, flap1, flap2, ...
['Rotated + Upper CP modified by factor ',num2str(f)], filename_txt);
disp(['=== Upper modified (factor ',num2str(f),') ===']);
disp(tmp_upper);
end
%% === CASE 2: Lower CP modification (after rotation) ===
for f = factors
tmp_lower = lower_rot;
tmp_lower(lower_mod_idx,2) = tmp_lower(lower_mod_idx,2) * f;
upper_bez = bezier_eval(upper_rot, t);
lower_bez = bezier_eval(tmp_lower, t);
data_to_save = [upper_bez; lower_bez; flap1; flap2];
filename_txt = ['Set1_Rotated_LowerFactor_',num2str(f)];
writematrix(data_to_save, [filename_txt,'.txt'],'Delimiter','tab');
plot_save_bezier(upper_bez, lower_bez, flap1, flap2, ...
['Rotated + Lower CP modified by factor ',num2str(f)], filename_txt);
disp(['=== Lower modified (factor ',num2str(f),') ===']);
disp(tmp_lower);
end
%% === CASE 3: Upper + Lower CP modification (after rotation) ===
for f = factors
tmp_upper = upper_rot;
tmp_lower = lower_rot;
tmp_upper(upper_mod_idx,2) = tmp_upper(upper_mod_idx,2) * f;
tmp_lower(lower_mod_idx,2) = tmp_lower(lower_mod_idx,2) * f;
upper_bez = bezier_eval(tmp_upper, t);
lower_bez = bezier_eval(tmp_lower, t);
data_to_save = [upper_bez; lower_bez; flap1; flap2];
filename_txt = ['Set1_Rotated_UpperLowerFactor_',num2str(f)];
writematrix(data_to_save, [filename_txt,'.txt'],'Delimiter','tab');
plot_save_bezier(upper_bez, lower_bez, flap1, flap2, ...
['Rotated + Upper & Lower CP modified by factor ',num2str(f)],
filename_txt);
disp(['=== Upper + Lower modified (factor ',num2str(f),') ===']);
disp('Upper Surface:'); disp(tmp_upper);
disp('Lower Surface:'); disp(tmp_lower);
end