I am guessing you want to work out the centroid of your 3 or more points. If so, just take the average of each x, y, z for all the points. For example:
CentroidX = (Pt1.x + Pt2.x + pt3.x) / 3.0;
Obviously you should generalise this by using a suitable container / variables.
Edit: Not sure about more than 3 points. 3 points are always co-planar, where as more than that might not be. Not sure if that is different or not.
When I learnt vectors at Uni, we didn't use an XYZ convention, because a coord system might not coincide with the World XYZ system - it could have a different origin & rotation. So we numbered our subscripts 1,2,3 instead of x,y,z. Boost does that too, except it is 0,1,2.
With your code:
I have never managed to figure out why people call the process of calculating a unit vector "Normalising" - What do you call your normal (to a plane, circle etc) vectors?
Why do you want Y up? Z up is the normal convention.
Cross product doesn't make sense for 2d. It returns a vector that is normal to the plane that it's two argument vectors are in.
Your Scalar, Dot & Cross products, Unit Vector, Magnitude should be in functions, or better as overloaded operators for the products and adding etc.
The Cross product for 3d is a much longer formula that what you have for 2d. You can find it on wiki, but that Page is overly complicated IMO.
Values like 180.0 / PI are constant - You should make them so, preferably with C++11 constexpr and auto(otherwise const and double) make sure you include the decimal point in the 180.0 so the compiler knows it's a double - I always do that with any double literal anyway:
constexprauto RadiansToDegree 180.0 / PI;
The Boost 3rd party library has a bunch of math constants in there somewhere.
Hope all goes well, and Happy New Year :+)
PS I am travelling today, so it may be awhile before I can reply.