Your position assignment can be made easier to read by using Vector3.Lerp since it does the same thing as your weight multiplication:
transform.position = Vector3.Lerp(targetB, TargetA, weight);
//for your consine stuff, flip source and destination since cos starts at 1
For going between multiple waypoints, you just need to consider what when your waypoints change and set up a nice transition between them. Something like:
var waypoints : GameObject[]; //waypoints go in the array
//(you could use transforms in stead of GameObjects)
var speed : float = 0.1; //Waypoints per second?
private var index = 0; //Which waypoints we're between
private var previous : GameObject; //previous waypoint
private var next : GameObject; //next waypoint
private var adjustment : float = 0; //waypointsPassed / speed
private var weight : float = 0; //weight
function FixedUpdate () {
if(waypoints.length < 2) return; //Don't bother when there's nowhere to go
previous = waypoints[index]; //Where we last were
if(index != waypoints.length - 1) next = waypoints[index+1]; //Where we're going
else next = waypoints[0]; //go back to the start
//that cosine stuff is kind of nonsense so I recommend just using smoothstep
//but if you must, you could swap source and destination or do angle addition etc.
weight = (time - adjustment) * 0.1;
if(weight > 1) { //We've just passed a waypoint
weight -= 1; //cut back the weight
adjustment += 1 / speed; //adjust the time
if(index < waypoints.length - 1) index++; //we're at the next point
else index = 0; //we're back to the start
}
transform.position = Vector3.Lerp(previous, next, Mathf.SmoothStep(0, 1, weight));
}