TruerWords Logo
Google
 
Web www.truerwords.net

Search TruerWords

Welcome
Sign Up  Log On

Topic: Swift Spirals

Messages: (3) 1


Author: Seth Dillingham

Date:4/11/2015

Permalink Icon

# 6419

Swift Spirals

Yesterday on Quora a particular Math question caught my attention and fired up my imagination. I've already linked to it, but here's how the question was worded:

Four persons K, L, M, and N are initially at the four corners of a square of side 'd'. Each person now moves with a uniform speed of 'v' in such a way that K always moves directly towards L, L directly towards M, M directly towards N and N directly towards K. At what time will the four persons meet?

(Why say they are people and then not give them real names? I thought that was funny.)

Let me rephrase the question. Four people (or uh... dots) are at the corners of a very large square. They're all going to move at the same time, and keep moving until they touch. Each person moves toward the person at the next corner of the square in the clockwise direction. (So the person at the top left moves toward the person at the top right.)

I didn't care about the actual question there at the end, "at what time will the four person's meet?" I was just interested in the path they would each travel, the shape it would form.

Now keep in mind that each person is always moving towards the next person, not towards the corner where that person started.

It was obviously going to be a spiral in toward the center. Could I write a program that would simulate this travel?

Yes, I could! Here's an Xcode Playground file (written in Swift) that demonstrates the whole thing. It's not fancy, but it does show the spiral being drawn and I've kept the math self-contained in a couple of functions.

Update

Here's the same thing in some javascript, running in the browser.


  var graphSide = 500.0
  
  function sqrx ) {
      return ( x * x );
  }
  
  var Point = functionxy ) {
      this.x = x;
      this.y = y;
  };
  
  // thanks to my buddy Pythagoras
  Point.prototype.distFromPoint = functionpointB ) {
      return Math.sqrt(sqr(pointB.x - this.x) + sqr(pointB.y - this.y));
  };
  
  var actorA = new Point00 );
  var actorB = new PointgraphSide0 );
  var actorC = new PointgraphSidegraphSide );
  var actorD = new Point0graphSide );
  
  var distToMove = 2;
  var lineWidth = 2.0;
  
  var canvasctx;
  
  function initSpirals() {
      canvas = document.getElementById"spiralCanvas" );
      canvas.width = graphSide;
      canvas.height = graphSide;
      ctx = canvas.getContext("2d");
      
      document.getElementById("runButton").addEventListener("click"runButtonClickedfalse);
      document.getElementById("resetButton").addEventListener("click"resetButtonClickedfalse);
  }
  initScripts.push(initSpirals);
  
  function reset() {
      actorA = new Point00 );
      actorB = new PointgraphSide0 );
      actorC = new PointgraphSidegraphSide );
      actorD = new Point0graphSide );
      
      var canvas = document.getElementById"spiralCanvas" );
      var context = canvas.getContext("2d");
      
      context.clearRect(00canvas.widthcanvas.height);
  }
  
  function runButtonClickede ) {
      reset();
      window.setTimeoutincrementWalkers0 );
  }
  
  function resetButtonClickede ) {
      reset();
  }
  
  // find a new point on the line between a and b
  function moveFromAToBpointApointBdist ) {
      var dist_total = pointA.distFromPointpointB );
      var newX = pointA.x + ( ( dist * (pointB.x - pointA.x) ) / dist_total )
      var newY = pointA.y + ( ( dist * (pointB.y - pointA.y) ) / dist_total )
      
      return new PointnewXnewY );
  }
  
  function moveAndDrawFromAToBpointApointBdist ) {
      var dest = moveFromAToBpointApointBdist );
      
      ctx.moveTopointA.xpointA.y );
      ctx.lineWidth = lineWidth;
      ctx.lineTodest.xdest.y );
      ctx.stroke();
      
      return dest;
  }
  
  // incrementWalkers is its own function so that we can see the 
  // image updating in an animated fashion. If it was just done in 
  // a loop, then all we'd see is the finished product.
  function incrementWalkers() {
      if ( actorA.distFromPointactorB ) < distToMove * 1.001 )
      {
          return;
      }
      
      // draw lines from old to new locations
      var destA = moveAndDrawFromAToB(actorAactorBdistToMove);
      var destB = moveAndDrawFromAToB(actorBactorCdistToMove);
      var destC = moveAndDrawFromAToB(actorCactorDdistToMove);
      var destD = moveAndDrawFromAToB(actorDactorAdistToMove);
      
      // update actors with new locations
      actorA = destA;
      actorB = destB;
      actorC = destC;
      actorD = destD;
      
      lineWidth = lineWidth * 0.99;
      
      window.setTimeoutincrementWalkers0 );
  }
  

[Top]


Author: Seth Dillingham

Date:4/11/2015

Permalink Icon

# 6420

RE: Swift Spirals

For anyone still reading in email (so many years since this was an active site...), I've updated that Sprials thing with a Javascript demo that does exactly the same thing, but you can actually run it in your browser.

[Top]


Author: Mike

Date:4/11/2015

Permalink Icon

# 6421

Re: Swift Spirals

Obviously, they meet at 3:31 PM. Oh, wait, they didn't give any speeds or a start time or dimensions of the square. 
 
 
 
 
-------Original Message-------
 
Date: 4/11/2015 11:02:37 AM
Subject: [tw] Swift Spirals [Msg#6419]
 
--------------------------------
 
Yesterday on Quora <http://www.quora.com/> a particular Math question
caught my attention and fired up my imagination. I've already linked to it,
but here's how the question was worded:
 
   Four persons K, L, M, and N are initially at the four corners of a
   square of side 'd'. Each person now moves with a uniform speed of 'v'
   in such a way that K always moves directly towards L, L directly
   towards M, M directly towards N and N directly towards K. At what time
   will the four persons meet?
 
(Why call them people and then not give them real names? I thought that was
funny.)
 
Let me rephrase the question. Four people (or uh... dots) are at the corners
of a very large square. They're all going to move at the same time, and keep
moving until they touch. Each person moves toward the next person in the
clockwise direction. (So the person at the top left moves toward the person at
the top right.)
 
I didn't care about the actual question there at the end, "at what time will
the four person's meet?" I was just interested in the path they would each
travel, the shape it would form.
 
Now keep in mind that each person is always moving towards the next person,
not towards the corner where that person started.
 
It was obviously going to be a spiral in toward the center. Could I write a
program that would simulate this travel?
 
Here's an Xcode Playground file
(written in Swift) that demonstrates the whole thing. It's not fancy, but it
does show the spiral being drawn and I've kept the math self-contained in a
couple of functions.
 
--------------------------------
Unsubscribe Instructions:
 

[Top]



<- Previous Thread:
More Tragedy, Status Update

Next Thread: ->
Creating Great Mobile Apps! (snark)

Until August 31
My Amazon sales
benefit the PMC

Homepage Links

Apr 1 - Aug 31
Ad revenue
benefits the PMC


TruerWords
is Seth Dillingham's
personal web site.
More than the sum of my parts.