Hello! How can i make a condition run many times?

조회 수: 1(최근 30일)
Stany Stone 2019년 12월 30일
댓글: Guillaume 2020년 3월 2일
Hello! I have a problem. I have an if with a condition that must be fulfilled. But in case it is not, in the else section, i have it run the same code it had before the if. Iunderstand that i may add another else or an if, but it does not seem ok. I actually want something that can make it run until it fulfills the condition. Can you help me?
댓글 수: 2표시 이전 댓글 수: 1숨기기 이전 댓글 수: 1
Stany Stone 2019년 12월 30일
Sure! Here is my code:
My condition if for the [in, on] to be equal to 0, so that i can, for the moment, have 3 points out of 4 on the loop. If [in,on] is not equal to 0, i want to have the code run again( not the whole code, just from %get a known index) and stop when all it find itself fulfilled. Later i will add another condition so that the forth one can also be on the loop. Can you, please, help me?
format long g;
format compact;
fontSize = 15;
x = [5.5, 6, 4.5, 3.5, 5, 5, 3, 2, 2.5, 3, 2, 2.5, 4, 5, 4.5]
y = [3, 2, 2.5, 1.5, 1.5, 1, 0.5, 1, 2, 3, 4, 4.5, 5, 4, 3.5]
% Append first point to last to close the curve
x = [x, x(1)];
y = [y, y(1)];
plot(x, y, 'r*');
grid on;
knots = [x; y];
areaOfPolygon = polyarea(x,y);
numberOfPoints = length(x);
% Interpolate with a spline curve and finer spacing.
originalSpacing = 1 : numberOfPoints;
% Make 9 points in between our original points that the user clicked on.
finerSpacing = 1 : 0.1 : numberOfPoints;
% Do the spline interpolation.
splineXY = spline(originalSpacing, knots, finerSpacing);
% Plot the interpolated curve.
hold off;
plot(knots(1, :), knots(2, :), 'ro', 'LineWidth', 2, 'MarkerSize', 16);
hold on;
plot(splineXY(1, :), splineXY(2, :), 'b+-', 'LineWidth', 2, 'MarkerSize', 8);
title('Blue Spline Between Red Knots', 'FontSize', fontSize);
legend('Knots', 'Spline');
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
grid on;
hold on;
% Get a known index. "known" because it's one of the training points.
knownIndex = randperm(length(x), 1)
% Get a unknown index. "unknown" because it's one of the interpolated points.
unknownIndex = randperm(length(finerSpacing), 1)
% Get the x,y coordinates for these indexes.
xKnown = knots(1, knownIndex)
yKnown = knots(2, knownIndex)
xUnknown = splineXY(1, unknownIndex)
yUnknown = splineXY(2, unknownIndex)
A=[xKnown, yKnown]
B=[xUnknown, yUnknown]
AB=sqrt((xKnown-splineXY(1, unknownIndex))^2+(yKnown-splineXY(2, unknownIndex))^2)
% Now draw a line between them in dark green.
darkGreen = [0, 0.5, 0];
plot([xKnown, xUnknown], [yKnown, yUnknown], 'o-', ...
'Color', darkGreen, 'MarkerSize', 24, 'LineWidth', 3);
legend('Knots', 'Spline', 'Line between random knot and random point')unkownIndex1= randperm(length(finerSpacing), 1)
hold on
% slope of oldL
slope = (yKnown - yUnknown)./(xKnown - xUnknown);
% slope and tilt angle of newL
perSlope = -1/slope;
perTheta = atan(perSlope);
% set the lenght of line segment you want to add to the figure
lineLength = 2*AB;
halfLineLength = lineLength/2;
% calculate the end points of a newL based on the Known points of oldL
xPerKnown = [xKnown + halfLineLength*cos(perTheta), ...
xKnown - halfLineLength*cos(perTheta)];
yPerKnown = [yKnown + halfLineLength*sin(perTheta), ...
yKnown - halfLineLength*sin(perTheta)];
% calculate the ends points of another newL based on the Unknown points of oldL
xPerUnknown = [xUnknown + halfLineLength*cos(perTheta), ...
xUnknown - halfLineLength*cos(perTheta)];
yPerUnknown = [yUnknown + halfLineLength*sin(perTheta), ...
yUnknown - halfLineLength*sin(perTheta)];
xPerKnown(1) = [xKnown + halfLineLength*cos(perTheta)]
xPerKnown(2)=[xKnown - halfLineLength*cos(perTheta)];
yPerKnown(1)= [yKnown + halfLineLength*sin(perTheta)]
yPerKnown(2)=[yKnown - halfLineLength*sin(perTheta)];
% calculate the ends points of another newL based on the Unknown points of oldL
xPerUnknown(1) = [xUnknown + halfLineLength*cos(perTheta)]
xPerUnkown(2)=[xUnknown - halfLineLength*cos(perTheta)];
yPerUnknown(1) = [yUnknown + halfLineLength*sin(perTheta)]
yPerUnknown(2)=[yUnknown - halfLineLength*sin(perTheta)];
% draw these two newL
plot([xPerKnown(1), xKnown], [yPerKnown(1), yKnown], 'o-', ...
'Color', darkGreen, 'MarkerSize', 24, 'LineWidth', 3);
plot([xPerUnknown(1), xUnknown], [yPerUnknown(1), yUnknown], 'o-', ...
'Color', darkGreen, 'MarkerSize', 24, 'LineWidth', 3);
% set the unit length of two axis to be equal, to get a clear visualization of 90 degree
axis equal
plot([xPerKnown(1),xUnknown + halfLineLength*cos(perTheta)],[yPerKnown(1),yUnknown + halfLineLength*sin(perTheta)],'o-','Color', darkGreen, 'MarkerSize', 24, 'LineWidth', 3)
C=[xPerKnown(1),yPerKnown(1)]
D=[xPerUnknown(1),yPerUnknown(1)]
E=[xPerUnkown(2),yPerUnknown(2)]
F=[xPerKnown(2),yPerKnown(2)]
in = inpolygon(x,y,xPerKnown(1),yPerKnown(1))
[in,on] = inpolygon(x,y,xPerKnown(1),yPerKnown(1))

댓글을 달려면 로그인하십시오.

답변(1개)

Luna 2019년 12월 30일
편집: Luna 2019년 12월 30일
Basically, it can be done as follows with a while block:
some_condition_to_be_fullfilled = 0;
while some_condition_to_be_fullfilled == 0
if something_happened
% do some mathematical stuff
some_condition_to_be_fullfilled = 1;
% or you can use break
break
else
% do some mathematical stuff
some_condition_to_be_fullfilled = 0;
end
end
댓글 수: 3표시 이전 댓글 수: 2숨기기 이전 댓글 수: 2
Guillaume 2020년 3월 2일
Actually,
if [in, on] == 0
is equivalent to (assuming both in and on are scalar):
if in == 0 && on == 0
but it's likely the OP wouldn't be able to explain why, so Luna's syntax is strongly recommended. Another option would be:
if all([in, on] == 0)

댓글을 달려면 로그인하십시오.

범주

Find more on Spline Postprocessing in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by