Plot a quadrilateral having 8 points (each side passes through two points)

15 vues (au cours des 30 derniers jours)
I have 8 points and need to plot a quadrilateral using those. Each side of it passes through two of these points, which are defined. How can I plot such a shape?
  4 commentaires
Mohammad Javad Asgari Pirbalouti
Modifié(e) : Mohammad Javad Asgari Pirbalouti le 18 Avr 2023
@DGM Thanks for the comment, these are not random points. These ment to show the deviation of a known square, so the order of connceting the dots is defined in a way that maches the refernce square. I was looking for an easier solution rather than solving 4 equations for 8 squares to plot it with matlab:-/.
John D'Errico
John D'Errico le 19 Avr 2023
I will guess (from the vague things you have said) that you have 8 points, so pairs of two points define one side of the quadrilateral. But the points are no on a vertex. So you are hoping to find where the lines INTERSECT, and that defines the quadrilaterl? This is just a complete guess from what you have said. But you did mention having to solve equations, and that is the only thing that makes sense.

Connectez-vous pour commenter.

Réponse acceptée

Mohammad Javad Asgari Pirbalouti
x = [10.0001 10 30 70 90 90.1 30 70];
y = [-45 -65 -25 -25.1 -45 -65 -105 -105.1];
[cornerX, cornerY] = cornerFinder(x,y);
plot(cornerX,cornerY,'r', 'LineWidth',2)
function [cornerX, cornerY] = cornerFinder(x,y)
% Pre-allocate memory for a and b arrays
a = zeros(1,4);
b = zeros(1,4);
% Compute slopes and y-intercepts using array indexing
for i = 1:2:8
j = (i+1)/2;
a(j) = (y(i+1)-y(i))/(x(i+1)-x(i));
b(j) = y(i)-a(j)*x(i);
end
% Pre-allocate memory for cornerX and cornerY arrays
cornerX = zeros(1,4);
cornerY = zeros(1,4);
syms xx yy
% Compute corner points using array indexing
for i = 1:4
if i == 4
j = 1;
else
j = i+1;
end
sol = solve(a(i)*xx + b(i) - yy, a(j)*xx + b(j) - yy);
cornerX(i) = double(sol.xx);
cornerY(i) = double(sol.yy);
end
% Append the first corner point to the end of arrays
cornerX = [cornerX, cornerX(1)];
cornerY = [cornerY, cornerY(1)];
end

Plus de réponses (1)

Torsten
Torsten le 18 Avr 2023
Modifié(e) : Torsten le 19 Avr 2023
P1 = [0 0 0];
P2 = [1 0 0];
P3 = [0 1 0];
P4 = [0 0 1];
P5 = [1 1 0];
P6 = [0 1 1];
P7 = [1 0 1];
P8 = [1 1 1];
hold on
plot3([P1(1),P2(1)],[P1(2),P2(2)],[P1(3),P2(3)],'b')
plot3([P1(1),P3(1)],[P1(2),P3(2)],[P1(3),P3(3)],'b')
plot3([P1(1),P4(1)],[P1(2),P4(2)],[P1(3),P4(3)],'b')
plot3([P2(1),P5(1)],[P2(2),P5(2)],[P2(3),P5(3)],'b')
plot3([P2(1),P7(1)],[P2(2),P7(2)],[P2(3),P7(3)],'b')
plot3([P3(1),P5(1)],[P3(2),P5(2)],[P3(3),P5(3)],'b')
plot3([P3(1),P6(1)],[P3(2),P6(2)],[P3(3),P6(3)],'b')
plot3([P4(1),P6(1)],[P4(2),P6(2)],[P4(3),P6(3)],'b')
plot3([P4(1),P7(1)],[P4(2),P7(2)],[P4(3),P7(3)],'b')
plot3([P5(1),P8(1)],[P5(2),P8(2)],[P5(3),P8(3)],'b')
plot3([P6(1),P8(1)],[P6(2),P8(2)],[P6(3),P8(3)],'b')
plot3([P7(1),P8(1)],[P7(2),P8(2)],[P7(3),P8(3)],'b')
hold off
view([45 45])
If your quadrilateral is 2d, use "plot" instead of "plot3" in a similar way.

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by