Hello! How can i draw a line at an angle of 90 degrees from another line, having a starting point different than (0,0)?

10 views (last 30 days)
Andreea Stanescu on 19 Dec 2019
Commented: Andreea Stanescu on 28 Dec 2019
Hello! I have a problem with drawing a square, only knowing the starting point and another random one. How can i draw another line at an angle of 90 degrees from the one made by the known point and the random one? this is what i have so far:
Thank you!
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]
% 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);
hold on

Chien-Han Su on 28 Dec 2019
Hope I understand your question correctly.
If you want to add a line segment (denoted as newL) which is perpendicular to a randomly generated line segment (denoted as oldL hereafter) according to your data, you can record the slope of oldL, then calulate the slope of newL. With this new slope, you can add line segment to the end points of oldL to get what you want. That is, add the code below after yours,
% 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 = 4;
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)];
% draw these two newL
plot([xPerKnown(1), xPerKnown(2)], [yPerKnown(1), yPerKnown(2)], 'o-', ...
'Color', darkGreen, 'MarkerSize', 24, 'LineWidth', 3);
plot([xPerUnknown(1), xPerUnknown(2)], [yPerUnknown(1), yPerUnknown(2)], '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
and you can get
3 CommentsShow 1 older commentHide 1 older comment
Chien-Han Su on 28 Dec 2019
Replace
% set the lenght of line segment you want to add to the figure
lineLength = 4;
halfLineLength = lineLength/2;
with
% calculate the length of oldL and assign it to halfLineLength
oldLineLength = sqrt((xKnown - xUnknown)^2 + (yKnown - yUnknown)^2);
halfLineLength = oldLineLength;
Andreea Stanescu on 28 Dec 2019
Yes, thank you! i tried to do it after i posted the question and succeeded, since the deleted question. Thank you so much! I appreciate it!