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

1 Ansicht (letzte 30 Tage)
Stany Stone
Stany Stone am 30 Dez. 2019
Kommentiert: Guillaume am 2 Mär. 2020
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 Kommentare
Luna
Luna am 30 Dez. 2019
Can you be more specific about your condition and what kind of coding you have done so far?
Stany Stone
Stany Stone am 30 Dez. 2019
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))

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Luna
Luna am 30 Dez. 2019
Bearbeitet: Luna am 30 Dez. 2019
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 Kommentare
Luna
Luna am 2 Mär. 2020
Bearbeitet: Luna am 2 Mär. 2020
You have problem here:
if [in,on] =0
You can't define an if equality condition like above. You should be doing
if something == 0
Also, you are comparing a 2x1 array with zero, do you want both will be equal to zero? Then you should do this:
if (in == 0) && (on == 0)
Guillaume
Guillaume am 2 Mär. 2020
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)

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Interpolation finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by