# A question of math?

Discussion in 'iOS Programming' started by beardedpig, Dec 20, 2008.

1. ### beardedpig macrumors member

Joined:
Dec 17, 2008
#1
Picture a circle, it is 2" in diameter and has a circumference of 6.284.

I want to track a arc gesture in either direction clockwise/anti clockwise.

So I know D=2", R=1", C=6.284" and PI=3.142 but I do not know what theta is or arc.

apparently I should be able to work out arc, theta or C by knowing any of the two.

But as I do not know what arc or theta is.....I stumped. Also I am learning this stuff today!!

In my head I image a pie section of the circle with the one radius line going from 12 o'clock to circle centre and another radius line going from circle centre to 3 o'clock.

Now if the user traced a gesture along the circumference from 12 to 3 there would be a value for arc, true?

Now if the use traced the same path but inside the circle say half an inch in then the arc distance would be smaller but the angle (if that is the right term) would be the same as the first, true??

Problem: How would I begin it extrapolate the arc gesture in any direction within the circle? Are we taking quantum physics or is there a formular the uneducated such as I could learn as is the case for always working out the circumference of a circle?

thanks in hope

2. ### CommanderData macrumors regular

Joined:
Dec 1, 2007
#2
You can get the angle of the touchpoint in reference to the center of your circle by calculating the slope of the line and using arctan(slope). By determining the start and end angle of your touch you will have the arc they traced through.

Hope that gets you moving the right direction...

3. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#3
Mmm heavy math for the numpty who hated math and er never understood logarithms etc!!

So after some searching...

Tan(x) = y is the same as arctan(y) = x

I think I grasp a tad what you say but not completely.

If I am completely off beam please give me a gentle kick ;-)

If the user drags a straight path from A to B that would not have an angle would it?

But then as I type I start to ask aloud if I used the function angleBetweenLines this would return an angle even a very large one if there was any curve from start to end of drag....would it?

And if it did then it is this that I would pass to arctan to determine that the user performed a legal curve (arc) drag rather than a straight line?

Joined:
Dec 17, 2008
#4
5. ### CommanderData macrumors regular

Joined:
Dec 1, 2007
#5
Sometimes precision isn't as important as "good enough", don't bother with all the advanced calculus garbage...

Let's assume you're simulating the click-wheel on older iPods, and this click wheel is centered on your screen horizontally and vertically...

The center point of your wheel would be 160, 240. We'll call these cx and cy
Let's assume the "wheel" is a sensitive area from your outer radius and continuing 40 pixels inward toward the center.
We will assume the 0 degrees is straight up (12 oclock).

The first thing you want to determine is whether the users touch falls within the "wheel". Do this by calculating distance...

distance = sqrt(((touchx-cx)*(touchx-cx))+((touchy-cy)*(touchy-cy)))
if the distance is >= 120 pixels and <= 160 pixels from the centerpoint we know the finger is on the wheel, and continue on.

Now we want to determine our angle, we'll start by figuring the slope. But first... there are a few special cases of slope that will not work- when the users touch is in the wheel at 0 or 180 degrees the slope calculation would divide by zero!

if cx-touchx = 0, and if cy-touchy >0 then we're at 0 degrees
if cx-touchx = 0, and if cy-touchy <0 then we're at 180 degrees

if neither of these is true it's OK to try to calculate slope

slope = (cy-touchy)/(cx-touchx)

Then arctan(slope) returns something we can work with from 90 to -90 degrees. Now we need to correct this based on the quadrant the user's touch was in...

if touchx>cx and touchy<=cy then we're in the upper right quadrant and our true degree position is = 90 - arctan(slope)

if touchx>cx and touchy>cy then we're in the lower right quadrant and our true degree position is ALSO = 90 - arctan(slope). Simply because arctan(slope) will be negative and a double negative is the same as addition.

I'll leave it as an exercise to you to figure out the next two quadrants.

What I would do with all of this is take a starting reading in touchesBegan on your UIView, then take new readings at touchesMoved events. The larger the delta for previous to current angle, the faster the user is moving their finger in that direction... OR if you're simply interested in distance travelled you can take a reading in touchesBegan and another in touchesEnded and measure the difference between angles. Of course you'll need to account for travelling around more than one full revolution without removing the finger. That's why the delta readings may be easier to deal with.

Does this make any sense?

6. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#6
Oh thank God for that! I will glady take that approach!!

I am not familiar with the wheel you describe as I do not own an iPod but understand your description

Yep, I'm with you and this is all straight forward

I understand the concept that we need to determine if the user is in this "wheel" .... nice approach ;-)

What I do not understand is sqrt(((touchx-cx)*(touchx-cx))+((touchy-cy)*(touchy-cy)))

1. I would never had figured to use sqrt or why it is required
2. why mst we multiply touchx - cx by the same thing touchx - cx
3. You see I have a limited knowledge about math like this but when explained in a certain way I will understand an learn and grow from it!

I understand this but again will need to draw this on paper to visualise and better understand

Yes I agree as to be shown the complete answer does no encourage the grey matter to expand beyond its limited container....lol ;-))

I need to make an action take place within a certain degree of movement so will be using both touches began and touches moved. Had not thought of the more than one revolution but will deal with that once I have the main part working.

Yes it makes sense although there are parts I do not understand I do grasp the concept which I am grateful you took the time to help me and from which I hope the brain will allow me to grow with

I will spend today plotting this into my app to see how I get on

7. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#7
Cool!! here is my code so far that determines the user clicking in the "wheel"

the .h file

Code:
```#define kCircleCentreX		160
#define kCircleCentreY		240
#define kInnerTouchBound	80
#define kOuterTouchBound	158
```
You see I have made the touch width slightly wider purely for personal taste of course and I have also set the outer bound to just inside the circle.

the .m file

Code:
```-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
UITouch *touch = [touches anyObject];

CGPoint currentPosition = [touch locationInView: self.view];

NSUInteger numTaps = [[touches anyObject] tapCount];

int distanceFromCentre;

distanceFromCentre = sqrt(((kCircleCentreX - currentPosition.x) * (kCircleCentreX - currentPosition.x)) + ((kCircleCentreY - currentPosition.y) * (kCircleCentreY - currentPosition.y)));

// just test using taps for now, slide will come in a mo...he hopes!

if ( numTaps == 1 && numTouches == 1 )
{

if ( distanceFromCentre >= kInnerTouchBound && distanceFromCentre <= kOuterTouchBound )
{
NSLog(@"wheel area tapped");
}
}
}
```
For me this has beent he best learning exercise I have had so far with the SDK....you are a star thank you

8. ### sammich macrumors 601

Joined:
Sep 26, 2006
Location:
Sarcasmville.
#8
What are you simulating exactly? Something like a rotary dial on an old telephone? Well, you've taken your first step, albeit small, it's good to see that you are grasping some of the concepts. But you must be warned...since you needed this level of guidance on this concept, I'm afraid you better take up a liking for maths, because maths is no small part of finding the optimal solution to a problem.

The easiest way to grab a pen and paper and figure it out that way, especially for the solution below, simple trigonometry was all that was needed.

9. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#9
I could not agree more and fully understand the importance of math, but alas if you dont use it you loose it, correct?

I have learnt some stuff in the past but not using it all the time I forget it.

Like for example my pondering the sqrt issue given.

It is the 3, 4, 5 equation which is coming back to me and now I remember using this when creating a set square years ago to lay slabs!

However as the saying goes...teach a man to fish etc etc.

It is a pleasure to find people here willing to teach thus help other rather than flame them for not knowing something they have not learned yet

I am now plotting on paper etc and looking for basc trig website to teach this lump of tissue in my head I have been told is a brain....lol

aha!

http://www.waybuilder.net/free-ed/Math/Trigonometry/trig02_SPK.asp

10. ### CommanderData macrumors regular

Joined:
Dec 1, 2007
#10
BeardedPig, glad I could nudge you in the correct direction and that you appreciate the effort I put into my response. A lot of times people are ungrateful and just looking for you to write their program for them... it is refreshing to see someone trying hard to learn some math and understand new concepts

Keep it up and let us know how your work progresses!

11. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#11
you are welcome

I am currently learning how to calculate square roots without a calculator.

This was so I could come back here and write down how I have understood your example.

So I now know from the 3,4 5 rule what you were doing in:

distance = sqrt(((touchx-cx)*(touchx-cx))+((touchy-cy)*(touchy-cy)))

example:

touchx = 310, touchy = 200 (so we know this is inside the wheel)

centrex = 160, centrey = 240

so...

(touchx-centrex)*(touchx-centrex) is the same as (310 - 160)*(310 - 160) is the same as 3 * 3 in the 3, 4 5 rule.

so...

(touchy-centrey)*(touchy-centrey) is the same as (200 - 240)*(200 - 240) is the same as 4 * 4 in the 3, 4 5 rule.

so...

(310 - 160)*(310 - 160) = (150 * 150 ) = 22500

(200 - 240)*(200 - 240) = (-40 * -40) = 1600

so...

distance = sqrt(((touchx-centrex)*(touchx-centrex))+((touchy-centrey)*(touchy-centrey)))

=

distance = sqrt(22500 + 1600) = sqrt(24100)

so...

distance = 155.24

so...

155 is greater than 80 (the inner touch boundary) and is less than 158 (the outer touch boundary)

ergo the user is in the wheel!

I hope I have expanded this out correctly as it makes sense to me! lol

Ah tis good to exercise the brain

touchx =

12. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#12
So the exercise is coming along nicely apart from the confusion I have with the values I am getting back when trying to obtain the real degrees

from 12 o'clock to 3 o'clock I get small decimal variations in values from 91 to 90

from 3 o'clock to 6 o'clock I get small decimal variations in values from 89 to 88

from 6 o'clock to 9 o'clock I get small decimal variations in values from 91 to 90

from 9 o'clock to 12 o'clock I get small decimal variations in values from 89 to 88

all my atan(slope) values range from -0, -1, 0 and 1?

13. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#13
still a rummagin...

finds that atan is not the same as arctan in as much it takes radians rather than a slope?

Still trying to find how to use arctan in Xcode.....where is that dastardly function??? grrrr

14. ### YMark macrumors 6502a

Joined:
Nov 7, 2008
Location:
Arizona
#14
Interesting read. Reminds me of my days in college. I'd help out but I'm afraid I've lost that knowledge years ago.

15. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#15
lol yeah....if only I paid attention! hee hee

But I have now found the following

slope = -1.066444

atan(slope) = -0.817541

arctan(slope) = -46.84164

as per the useful website : http://www.analyzemath.com/Calculators_2/arctan_calculator.html

trying to find maybe Math.toDegrees(atan(slope)) but this errors...

16. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#16
the continued journey of BeardedPig to comprehend something he should have learned many many .... many years ago!

But a documented journey nonetheless that may one day save another soul such as I the same journey by providing the solution here....LOL

So perhaps he thinks oh if I know the radian vale of the slope I could find out how many radians to a degree or vice versa.

But no wait a moment, he finds this page which makes him ponder maybe it is better to work in radians rather than degrees?

Tune in next time folks for the next exciting installment in this epic.....thread lol

### Staff Member

Joined:
Sep 2, 2004
Location:
The Centennial State
#17
Normally it is better to work in radians rather than degrees, since many of the trigonometric functions take radians as the input.

18. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#18
Yes this is what I am finding from my readings!

However to you my audience yes the bleeding obvious has finally kicked me up the a'hole!

If I simply divide the result from atan(slope) I get the degress!

Holy crap that is my problem with this sort of guff! I go all around the bleediin houses just to get to a simple equation!!!!!

Hey ho all in the learning, now back to determining the quadrants

19. ### CommanderData macrumors regular

Joined:
Dec 1, 2007
#19
I'm sorry to see you're hitting a wall, but it is good that you're sharing with everyone for future reference!

As you've seen, the atan function is returning radians. You can always convert to degrees for your own sanity if it's too alien to think in radians. Just multiply your sample value by 180/pi

atan(slope) = -0.817541

-0.817541 * (180/pi) = -46.84

a shortcut would be just to pre-calculate the 180/pi

myAngle = atan(slope) * 57.295779513

That should be plenty accurate enough for you!

20. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#20
more elegant than my method

For me this has been a great exercise and has opened up many doors that were otherwise shut to me, even though I have had to shoulder the buggers open!

And the good thing is I fully understand the problem and subsequent solution. It will be cool if my insane ramblings help others in the future who come across a similar problem.

Also as a firs dive into this forum my welcome has been fantastic. Thanks to all who commented especially CommanderData for the pointer to the solution and to all others who chose not to flame me which happens on most forums!

Joined:
Jan 3, 2007
Location:
melbourne.au
#21
22. ### beardedpig thread starter macrumors member

Joined:
Dec 17, 2008
#22
well I have come on leaps and bounds! I invested in three downloadable videos from here: