// Generate a surface by translating a profile curve along a rail curve // // **params** // + profile NurbsCurveData // + rail NurbsCurveData // // **returns** // + NurbsSurfaceData object func SweptSurface(profile, rail *verb.NurbsCurve) *verb.NurbsSurface { railKnots := rail.Knots() startu := railKnots[0] endu := railKnots[len(railKnots)-1] pt0 := rail.Point(startu) numSamples := 2 * len(rail.ControlPoints()) span := (endu - startu) / (float64(numSamples) - 1) crvs := make([]*verb.NurbsCurve, numSamples) for i := range crvs { pt := rail.Point(startu + float64(i)*span) pt.Sub(&pt0) mat := mat4.Ident mat.SetTranslation(&pt) crvs[i] = profile.Transform(&mat) } return loftedSurface(crvs, nil) }