How to calculate a trapezoid with 4x2 input array...

Input is a 4x2 array with the x coordinates in the 1st column and y coordinates in the second column. It has to calculate the area and perimeter of a trapezoid. I keep getting a wrong output from the test cases.
>> [A P] = myTrapezoid([[0 0]; [4 0]; [3 2]; [1 2]])
A =
6
P =
10.4721
>> [A P] = myTrapezoid([[2 0]; [4 4]; [1 3]; [0 1]])
A =
7.5000
P =
12.1065
Here is my code.
function [A, P] = myTrapezoid(Coord)
x1=Coord(1,1);
x2=Coord(2,1);
x3=Coord(3,1);
x4=Coord(4,1); % Defines x and y coordinates of input array.
y1=Coord(1,2);
y2=Coord(2,2);
y3=Coord(3,2);
y4=Coord(4,2);
A = ( ( ( abs(x2-x1) ) + ( abs(x3-x4) ) ) /2 ) * ( abs(y4-y1) );
%Calculates area of the trapezoid based on input coordinates.
P = ( abs(x2-x1) ) + ( abs(x3-x4) ) + ( abs(y3-y2) ) + ( abs(y4-y1) );
% Calculates perimeter of the trapezoid based on input coordinates.
end

답변 (2개)

Roger Stafford
Roger Stafford 2014년 2월 3일

0 개 추천

In your formulas for A and P you have made overly simplistic assumptions about the trapezoid that is input. In computing A you assumed that the segment connecting points #1 and #2 and that connecting #3 and #4 were the parallel sides of the trapezoid, and moreover, that these were both parallel to the x-axis. As illustrated by your second example, it ain't necessarily so: in that case it is true that those two sides are also parallel to each other but they are not parallel to either the x-axis or the y-axis. Also it could happen that it is the other pair of sides that are the ones that are parallel. A thoughtful version of 'myTrapezoid' would warn the user if a non-trapezoid were entered - that is, one in which neither pair was parallel.
The formula you have for the perimeter is decidedly flaky. It could only be true if you were dealing with a rectangle whose sides were parallel to the x and y axes.
A valid method would first determine which pair of opposing line segments (if any) were parallel. Then it would determine the average of their two lengths. It would also then calculate the perpendicular distance between the two segments. The product of this distance and that average would give the trapezoid's area.
As for the perimeter, just find the sum of the lengths of the four segments. What could be easier? (But don't forget to invoke the Pythagoras Theorem?)

댓글 수: 3

Peter
Peter 2014년 2월 3일
Oh my, I feel so stupid. I was so caught up in the coding I wasn't paying close enough attention to the actual geometry of the question. I'll give it a shot and report back. Thanks for the help!!
Are you aware of the polyarea() function? I mean, why do it yourself when there's a function already made for that ?
@IA: I have a feeling Peter's instructor would object to that (if I have guessed right, and this is a specific assignment for dealing with trapezoids.) In any case it is good practice handling such problems, and in my opinion time and effort well spent.

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

Andrei Bobrov
Andrei Bobrov 2014년 2월 4일
편집: Andrei Bobrov 2014년 2월 4일
function [A, P] = otherTrapezoid(c)
[~,i0] = sort(angle(bsxfun(@minus,c(2:end,:),c(1,:))*[1;1i]));
cx = diff(c([1;i0(:)+1;1],:)*[1;1i]);
a = angle(cx);
t = tan(a);
t1 = abs(bsxfun(@minus,t,t')) < 100*eps;
t1(eye(size(t1)) > 0) = false;
t1 = find(any(t1,2));
d = abs(cx);
A = sin(diff(a(t1(1)+[0;1])))*d(t1(1)+1)*mean(d(t1));
P = sum(d);
end
using
>>c0 = [[2 0]; [4 4]; [1 3]; [0 1]];
>>c = c0(randperm(4),:); % eg
>>
>> [A, P] = otherTrapezoid(c)
A = 7.5000
P = 12.107

카테고리

도움말 센터File Exchange에서 Function Creation에 대해 자세히 알아보기

제품

질문:

2014년 2월 3일

편집:

2014년 2월 4일

Community Treasure Hunt

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

Start Hunting!

Translated by