A question of math?

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

  1. beardedpig macrumors member

    Dec 17, 2008
    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

    Dec 1, 2007
    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

    Dec 17, 2008
    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?
  4. beardedpig thread starter macrumors member

    Dec 17, 2008
  5. CommanderData macrumors regular

    Dec 1, 2007
    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
    The radius is 160 pixels.
    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? :D
  6. beardedpig thread starter macrumors member

    Dec 17, 2008
    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

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

    the .h file

    #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

    -(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


    Sep 26, 2006
    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

    Dec 17, 2008
    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 :)


  10. CommanderData macrumors regular

    Dec 1, 2007
    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

    Dec 17, 2008
    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)))


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

    centrex = 160, centrey = 240


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


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


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

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


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


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


    distance = 155.24


    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

    Dec 17, 2008
    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

    Dec 17, 2008
    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


    Nov 7, 2008
    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

    Dec 17, 2008
    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

    Dec 17, 2008
    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 :)
  17. dejo Moderator


    Staff Member

    Sep 2, 2004
    The Centennial State
    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

    Dec 17, 2008
    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

    Dec 1, 2007
    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! :D
  20. beardedpig thread starter macrumors member

    Dec 17, 2008
    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!

  21. Pikemann Urge macrumors 6502

    Jan 3, 2007
  22. beardedpig thread starter macrumors member

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


    and am happily working out the problems I had and am solving each one in turn :)

Share This Page