Path: news.mathworks.com!not-for-mail From: <HIDDEN> Newsgroups: comp.soft-sys.matlab Subject: Re: matlab (given three points , how to find a circular arc. ) Date: Tue, 23 Nov 2010 18:34:05 +0000 (UTC) Organization: The MathWorks, Inc. Lines: 42 Message-ID: <ich1et$cab$1@fred.mathworks.com> References: <ice9to$5uu$1@fred.mathworks.com> <icebi3$n6i$1@fred.mathworks.com> <icec6o$6rf$1@fred.mathworks.com> <icedpc$krt$1@fred.mathworks.com> <icfopm$8p7$1@fred.mathworks.com> <icgi7c$iva$1@fred.mathworks.com> <ich0oc$pn8$1@fred.mathworks.com> Reply-To: <HIDDEN> NNTP-Posting-Host: webapp-03-blr.mathworks.com Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: fred.mathworks.com 1290537245 12619 172.30.248.38 (23 Nov 2010 18:34:05 GMT) X-Complaints-To: news@mathworks.com NNTP-Posting-Date: Tue, 23 Nov 2010 18:34:05 +0000 (UTC) X-Newsreader: MATLAB Central Newsreader 2625313 Xref: news.mathworks.com comp.soft-sys.matlab:689404 "Roger Stafford" <ellieandrogerxyzzy@mindspring.com.invalid> wrote in message <ich0oc$pn8$1@fred.mathworks.com>... > "Sam park" <ts10004ok@hanmail.net> wrote in message <icgi7c$iva$1@fred.mathworks.com>... > > ........ > > excuse Roger Stafford. i have failed this problem TT in matlab. > > , for example, in this case (x1=x2) i type case1(3,4,3,6,6,5) In matlab<<< > > . i cant obtain graph in matlab. that is error. > > thanks for your effort > - - - - - - - - - - - > I'm sorry you still have trouble plotting the circular arc. Based on the code you show I am guessing you are attempting to draw the arc starting with P1 = (x1,y1), passing through P2 = (x2,y2), and ending up at P3 = (x3,y3) no matter how they may be oriented. Here are some observations about your code. > > First you should be using atan2 rather than atan, because atan2 gives a result that ranges from -pi to +pi which is what you need here rather than atan's more limited range of -pi/2 to +pi/2. It's very messy having to correct for all the eventualities that occur with atan. > > Second, the quantity d in my code is equal four times the signed area of the triangle with P1, P2, and P3 as vertices. You can use the sign of d as an indication of which direction your desired arc should take from P1 to P3 so as to pass through P2. If d > 0, it should be counterclockwise, and otherwise clockwise. > > I include code here using atan2 which would trace the arc according to the above guess. The (sign(d)-sign(a3-a1))*pi correction on a3 is designed to add or subtract 2*pi to or from a3 if needed to make the arc tracing go in the proper direction. For example if both d and a3-a1 are positive, no correction is needed. If d is negative and a3-a1 is positive this subtracts 2*pi from a3, which is what would be needed to force a backward (clockwise) direction. When a3-a1 is negative, 2*pi is added to force a counterclockwise direction if d is positive. With both negative, again no correction is needed. > > If my guess is wrong, perhaps some of this code would still give you some good ideas? > > Here is the code: > > % Previous code > x21 = x2-x1; y21 = y2-y1; > x31 = x3-x1; y31 = y3-y1; > h21 = x21^2+y21^2; h31 = x31^2+y31^2; > d = 2*(x21*y31-x31*y21); > a = x1+(h21*y31-h31*y21)/d; > b = y1-(h21*x31-h31*x21)/d; > r = sqrt(h21*h31*((x3-x2)^2+(y3-y2)^2))/abs(d); > > % Preparations for plotting > a1 = atan2(y1-b,x1-a); % Angle counterclockwise from x-axis to P1 > a3 = atan2(y3-b,x3-a); % Angle counterclockwise from x-axis to P3 > a3 = a3+(sign(d)-sign(a3-a1))*pi; % Make needed correction on a3 > t = linspace(a1,a3,1000); % Make plot go from P1 to P3 through P2 > x = a+r*cos(t); % Use x and y for your plot > y = b+r*sin(t); > > Now do the plot with x and y. Use "axis equal" to get a true circular plot. > > Roger Stafford Thanks for your effort. God bless you.^^ I will challage this problem again^^