How to get intermediate swipe positions?

Hello guys,
I’m working on a android swipe game where in I need to add a force based on the swipe direction. I have managed to get this working, but I’m stuck at a point where in I would like to get more touch positions other than the start position and the touch end position, say, I would like to get an intermediate position. how would I do that?

Below is the script which adds force to a sphere based on the swipe direction

using UnityEngine;
using System.Collections;

public class SwipeControl : MonoBehaviour
{
	//First establish some variables
	private Vector3 fp; //First finger position
	private Vector3 lp; //Last finger position
	private float dragDistance;  //Distance needed for a swipe to register
	public float power;
	private Vector3 footballPos;
	private bool canShoot = true;
	private float factor = 40f;
	void Start(){

		dragDistance = Screen.height*20/100;
		Physics.gravity = new Vector3(0, -20, 0);
		footballPos = transform.position;
	}

	// Update is called once per frame
	void Update()
	{
		//Examine the touch inputs
		foreach (Touch touch in Input.touches)
		{
			if (touch.phase == TouchPhase.Began)
			{
				fp = touch.position;
				lp = touch.position;

			}
			if (touch.phase == TouchPhase.Moved)
			{
				lp = touch.position;
				Debug.Log(fp-lp);
			}
			if (touch.phase == TouchPhase.Ended)
			{
				//First check if it's actually a drag
				if (Mathf.Abs(lp.x - fp.x) > dragDistance || Mathf.Abs(lp.y - fp.y) > dragDistance)
				{   //It's a drag
					//Now check what direction the drag was
					//First check which axis
					if (Mathf.Abs(lp.x - fp.x) > Mathf.Abs(lp.y - fp.y))
					{   //If the horizontal movement is greater than the vertical movement...
						if ((lp.x>fp.x) && canShoot)  //If the movement was to the right)
						{   //Right move
							float x = (lp.x - fp.x) / Screen.height * factor;
							rigidbody.AddForce((new Vector3(x,10,16))*power);
							Debug.Log("right "+(lp.x-fp.x));//MOVE RIGHT CODE HERE
							canShoot = false;
							//rigidbody.AddForce((new Vector3((lp.x-fp.x)/30,10,16))*power);
							StartCoroutine(ReturnBall());

						}
						else
						{   //Left move
							float x = (lp.x - fp.x) / Screen.height * factor;
							rigidbody.AddForce((new Vector3(x,10,16))*power);
							Debug.Log("left "+(lp.x-fp.x));//MOVE LEFT CODE HERE
							canShoot = false;
							//rigidbody.AddForce(new Vector3((lp.x-fp.x)/30,10,16)*power);
							StartCoroutine(ReturnBall());
						}
					}
					else
					{   //the vertical movement is greater than the horizontal movement
						if (lp.y>fp.y)  //If the movement was up
						{   //Up move
							float y = (lp.y-fp.y)/Screen.height*factor;
							float x = (lp.x - fp.x) / Screen.height * factor;
							rigidbody.AddForce((new Vector3(x,y,16))*power);
							Debug.Log("up "+(lp.x-fp.x));//MOVE UP CODE HERE
							canShoot = false;
							//rigidbody.AddForce(new Vector3((lp.x-fp.x)/30,10,16)*power);
							StartCoroutine(ReturnBall());
						}
						else
						{   //Down move
							Debug.Log("down "+lp+" "+fp);//MOVE DOWN CODE HERE
						}
					}
				}
				else
				{   //It's a tap
					Debug.Log("none");//TAP CODE HERE
				}	
			}
		}
	}

	IEnumerator ReturnBall() {
		
		yield return new WaitForSeconds(5.0f);
		rigidbody.velocity = Vector3.zero;
		rigidbody.angularVelocity = Vector3.zero;
		transform.position = footballPos;
		canShoot =true;
	}

}

You can make a list property and add each touch position in TouchPhase.Moved to that list:

using System.Collections.Generic;

private List<Vector3> m_TouchPositions = new List<Vector3>();

// During TouchPhase.Moved
m_TouchPositions.Add(touch.position);

You can also simplify your code by using this list to get your first and last touch positions.