Might as well... what follows is a routine that isn't as general as the routine Sjoerd gave, but gives simpler results in some cases. This is based on work by Piegl and Tiller (see their nice book on NURBS as well).
arc[center_?VectorQ, {start_?VectorQ, end_?VectorQ}] := Module[{ang, co, r},
ang = VectorAngle[start - center, end - center];
co = Cos[ang/2]; r = EuclideanDistance[center, start];
BSplineCurve[{start, center + r/co Normalize[(start + end)/2 - center], end},
SplineDegree -> 2, SplineKnots -> {0, 0, 0, 1, 1, 1},
SplineWeights -> {1, co, 1}]]
For example:
{Graphics[arc[{0, 0}, {{1, 1}, {-1, 1}}]],
Graphics3D[arc[{0, 0, 0}, {{1, 1, 1}, {-1, 1, 1}}]]} // GraphicsRow
This routine works as long as the angle determined by the arc lies in the open interval $(0,\pi)$ (an inherent limitation of the simple method), and that EuclideanDistance[center, start] == EuclideanDistance[center, end]
(otherwise, it draws an elliptical arc). For reflex angles (that is, angles in the interval $(\pi,2\pi)$), you will have to stitch together two of these arc[]
s properly.
(A little note: though Piegl and Tiller show in their work that one can use negative weights to generate an arc corresponding to a reflex angle, BSplineCurve[]
handles negative weights poorly by default:
Graphics[BSplineCurve[{{-1/Sqrt[2], 1/Sqrt[2]}, {0, Sqrt[2]}, {1/Sqrt[2], 1/Sqrt[2]}},
SplineDegree -> 2, SplineKnots -> {0, 0, 0, 1, 1, 1},
SplineWeights -> {1, -1/Sqrt[2], 1}],
PlotRange -> {{-1, 1}, {-1, 1}}]
but one can use an undocumented option setting to improve the rendering:
Graphics[BSplineCurve[{{-1/Sqrt[2], 1/Sqrt[2]}, {0, Sqrt[2]}, {1/Sqrt[2], 1/Sqrt[2]}},
SplineDegree -> 2, SplineKnots -> {0, 0, 0, 1, 1, 1},
SplineWeights -> {1, -1/Sqrt[2], 1}],
BaseStyle -> {BSplineCurveBoxOptions -> {Method -> {"SplinePoints" -> 30}}},
PlotRange -> {{-1, 1}, {-1, 1}}]
(with thanks to Mr. Wizard))
Or using BSplineFuntion[]
and ParametricPlot[]
directly
f = BSplineFunction[{{-1/Sqrt[2], 1/Sqrt[2]}, {0, Sqrt[2]}, {1/Sqrt[2], 1/Sqrt[2]}},
SplineDegree -> 2,
SplineKnots -> {0, 0, 0, 1, 1, 1},
SplineWeights -> {1, -1/Sqrt[2], 1}]
ParametricPlot[f[x], {x, 0, 1}]
Finally, here's how to render a unit semicircle with BSplineCurve[]
(the generalization to the three-dimensional case is left to the reader):
Graphics[BSplineCurve[{{1, 0}, {1, 1}, {-1, 1}, {-1, 0}},
SplineDegree -> 2, SplineKnots -> {0, 0, 0, 1/2, 1, 1, 1},
SplineWeights -> {1, 1/2, 1/2, 1}]]
Again, see Piegl and Tiller's work if you want to learn more about these things.