- Hi Chris,

>I'm tackling an XP command involving arcs, and I'm wondering

When I wrote the ATTC command I had to find out the exact same information.

>if anyone can answer the following questions:

>- Is there an easy way to get a point along a specified

> arc, i.e. is there a function that takes an GARC2

> structure and a parameter T between 0 and 1, and

> returns the point corresponding to the given T on the

> given arc?

Here is the code from ATTC to find a point on an arc.

(or circle or line or smooth poly. The onlything that it does not work on

is the non-smooth poly. If you need to know about the non-smooth poly at a

later time, I have that code as well)

GPOINT2 Pt;

PENTREC pEntRec;

Pt.x=i*(1/(float)Length)*100;

EAttach(pEntRec, AT_PCT, &Pt, &Pt);

ENearT2(pEntRec, Pt.x, Pt.y, ENEARF_ON, &T);

>- How would one utilize the toolkit to go about deriving

The main properties of an arc are:

> an arc that fits three given points? I'm trying to

> do something similar to what the ARCB command does in

> CC2, and I'm assuming that there is a toolkit function

> that fits an arc to three given points, but I can't

> find it.

GCIR2 Circle;

float SAng;

float AngW;

and GCIR2's main properties are;

GPOINT2 Center;

float Radius;

So first you find the Point 'A' and Point 'B'

The midpoint of these two points = Center

The distance from either 'A' or 'B' to Center = Radius

So, all you need now is SAng and AngW.

Go two CC2 and draw an arc.

Point 'A' = 0,0

Point 'B' = 100,0

Point 'C' = 50,50

Now call up the Info on the arc. It says that the starting angle is 360

degrees. If you remember your trig, all angles start at 3 o'clock and sweep

counter clockwise. 3 o'clock can be considered a horizontal line going to

the right from the center point.

CC2 seems to want the starting angle to be as near 3 o'clock as possible.

It starts with point 'A' at the 9 o'clock point and then sweeps

counter-clockwise to find point 'B'. Point 'B' is at 3 o'clock which is 0

degrees or 360 degrees since 0 degrees = 360 degrees. You will get the same

arc with both but CC2 uses 360 degrees.

If point 'B' is entered first, then point 'A' then the Sang is 0 degrees.

I'm thinking that this helps CC2 determine direction the arc is drawn, but

I'm not sure.

To find SAng use the Angle command:

#define Angle _Angle

float _stdcall Angle(float x1,float y1,float x2, float y2);

So, you could call Angle thus:

X = Angle(Center.x, Center.y, PointA.x, PointA.y)

Now all you need is AngW, and that is just the angle of the line from the

center to point 'A' minus the angle of the line from the center to point 'B'

180 degrees - 0 degrees = 180 degrees.

So, the settings to draw a pEntRec of type ARC2 (type #7) are:

pEntRec->ARC2.Center.x = 50;

pEntRec->ARC2.Center.y = 0;

pEntRec->ARC2.Radius = 50;

pEntRec->ARC2.SAng = 360.0; // Or 0.0

pEntRec->ARC2.AngW = 108.0;

Is this just not the funnest thing to do on a Sunday Night? (Actually,

algorithmns like this are what keep me in the biz!)

Hope this answers your questions,

Lee

________________________________________________________________________

Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com - (lots of snippage below)

L. Lee Saunders wrote:

> When I wrote the ATTC command I had to find out the exact same information.

Thanks, this helps quite a bit! I haven't used EAttach() before,

> Here is the code from ATTC to find a point on an arc.

and now I see how useful it can be.

> So first you find the Point 'A' and Point 'B'

Hmmm, I think I see a problem with this logic. We are starting

> The midpoint of these two points = Center

> The distance from either 'A' or 'B' to Center = Radius

>

> So, all you need now is SAng and AngW.

with the (user-chosen) three points -- the starting point of

the arc (A), the ending point of the arc (B), and another

arbitrary point along the arc's sweep (C). The problem is that

the logic above assumes that points A and B are 180 degrees

apart from each other. But what if the user has chosen A, B,

and C so that A and B are 45 degrees apart? Then finding the

halfway point between A and B will yield an incorrect center of

the arc, because the center in this case is not directly be-

tween points A and B, but is instead offset to one side or the

other of a straight line drawn between the points. Thus, I do

not think that taking the midpoint between A and B will work.

However, you've gotten me thinking: In essence, what we need

is a way to find the point that is equidistant from all three

points provided by the user. We can easily derive an equation

describing the the infinite line of points that is equidistant

from A and B. We can do the same for A and C (or B and C,

doesn't matter). Now we have two line equations, and all we

need to do is find the point where they intersect. I think

that this'll provide us with our centerpoint.

The rest of the algorithm you provided looks just right, thanks

again Lee!

Take care,

Chris G.

golden@... - Hi Chris,

>(lots of snippage below)

No Problem. I had to go to the source and as FastCAD's creator for the

>

>L. Lee Saunders wrote:

>

> > When I wrote the ATTC command I had to find out the exact same

>information.

> > Here is the code from ATTC to find a point on an arc.

>

>Thanks, this helps quite a bit! I haven't used EAttach() before,

>and now I see how useful it can be.

solution when I was first writing ATTC.

> > So first you find the Point 'A' and Point 'B'

You are correct that my assumtion was wrong. The correct answer to finding

> > The midpoint of these two points = Center

> > The distance from either 'A' or 'B' to Center = Radius

> >

> > So, all you need now is SAng and AngW.

>

>Hmmm, I think I see a problem with this logic. We are starting

>with the (user-chosen) three points -- the starting point of

>the arc (A), the ending point of the arc (B), and another

>arbitrary point along the arc's sweep (C). The problem is that

>the logic above assumes that points A and B are 180 degrees

>apart from each other. But what if the user has chosen A, B,

>and C so that A and B are 45 degrees apart? Then finding the

>halfway point between A and B will yield an incorrect center of

>the arc, because the center in this case is not directly be-

>tween points A and B, but is instead offset to one side or the

>other of a straight line drawn between the points. Thus, I do

>not think that taking the midpoint between A and B will work.

>

>However, you've gotten me thinking: In essence, what we need

>is a way to find the point that is equidistant from all three

>points provided by the user. We can easily derive an equation

>describing the the infinite line of points that is equidistant

>from A and B. We can do the same for A and C (or B and C,

>doesn't matter). Now we have two line equations, and all we

>need to do is find the point where they intersect. I think

>that this'll provide us with our centerpoint.

the center of a circle drawn through three points is to draw two lines

between either AB, AC, or BC. Then draw two more lines that are at right

angles (90 degrees) to the first two lines. Where they intersect is the

center of the circle.

This is easily done with temporary elements that are not added to the

database. That way you do not have to do any real hairy calculations. Give

it a try by doing it by hand. It works!

>The rest of the algorithm you provided looks just right, thanks

No problem. It just tells me what I already know - late at night

>again Lee!

programming (i.e. problem solving) just does not work well for me! :�

Lee

________________________________________________________________________

Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com - Hi Chris,

> You are correct that my assumtion was wrong. The correct answer to

finding

> the center of a circle drawn through three points is to draw two lines

ADD HERE: "... from the center of the line ..."

> between either AB, AC, or BC. Then draw two more lines

> that are at right angles (90 degrees) to the first two lines. Where they

intersect

> is the center of the circle.

I seem to be batting 1000 for screw-ups this week. :-/ Oh well.

Lee