00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "nurbsBasisVector.h"
00016
00017
00018
00019
00020
00021
00022 void NurbsBasisVector::
00023 clear(int order) {
00024 _order = order;
00025 _segments.clear();
00026 }
00027
00028
00029
00030
00031
00032
00033
00034 void NurbsBasisVector::
00035 append_segment(int vertex_index, const PN_stdfloat knots[]) {
00036 int i;
00037
00038
00039 PN_stdfloat scaled_knots[8];
00040 PN_stdfloat min_k = knots[_order - 1];
00041 PN_stdfloat max_k = knots[_order];
00042
00043 nassertv(min_k != max_k);
00044 for (i = 0; i < _order + _order; i++) {
00045 scaled_knots[i] = (knots[i] - min_k) / (max_k - min_k);
00046 }
00047
00048 Segment segment;
00049 segment._vertex_index = vertex_index;
00050 segment._from = min_k;
00051 segment._to = max_k;
00052
00053 for (i = 0; i < _order; i++) {
00054 LVecBase4 b = nurbs_blending_function(_order, i, _order, scaled_knots);
00055 segment._basis.set_col(i, b);
00056 }
00057
00058 for (i = _order; i < 4; i++) {
00059 segment._basis.set_col(i, LVecBase4::zero());
00060 }
00061
00062 _segments.push_back(segment);
00063 }
00064
00065
00066
00067
00068
00069
00070 void NurbsBasisVector::
00071 transpose() {
00072 Segments::iterator si;
00073 for (si = _segments.begin(); si != _segments.end(); ++si) {
00074 (*si)._basis.transpose_in_place();
00075 }
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 LVecBase4 NurbsBasisVector::
00085 nurbs_blending_function(int order, int i, int j, const PN_stdfloat knots[]) {
00086
00087 LVecBase4 r;
00088
00089 if (j == 1) {
00090 if (i == order - 1 && knots[i] < knots[i + 1]) {
00091 r.set(0.0f, 0.0f, 0.0f, 1.0f);
00092 } else {
00093 r.set(0.0f, 0.0f, 0.0f, 0.0f);
00094 }
00095
00096 } else {
00097 LVecBase4 bi0 = nurbs_blending_function(order, i, j - 1, knots);
00098 LVecBase4 bi1 = nurbs_blending_function(order, i + 1, j - 1, knots);
00099
00100 PN_stdfloat d0 = knots[i + j - 1] - knots[i];
00101 PN_stdfloat d1 = knots[i + j] - knots[i + 1];
00102
00103
00104 if (d0 != 0.0f) {
00105 if (d1 != 0.0f) {
00106 r = bi0 / d0 - bi1 / d1;
00107 } else {
00108 r = bi0 / d0;
00109 }
00110
00111 } else if (d1 != 0.0f) {
00112 r = - bi1 / d1;
00113
00114 } else {
00115 r.set(0.0f, 0.0f, 0.0f, 0.0f);
00116 }
00117
00118
00119 r[0] = r[1];
00120 r[1] = r[2];
00121 r[2] = r[3];
00122 r[3] = 0.0f;
00123
00124
00125 if (d0 != 0.0f) {
00126 if (d1 != 0.0f) {
00127 r += bi0 * (- knots[i] / d0) + bi1 * (knots[i + j] / d1);
00128 } else {
00129 r += bi0 * (- knots[i] / d0);
00130 }
00131
00132 } else if (d1 != 0.0f) {
00133 r += bi1 * (knots[i + j] / d1);
00134 }
00135 }
00136
00137 return r;
00138 }