00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "eggNurbsCurve.h"
00016
00017 #include "indent.h"
00018
00019 TypeHandle EggNurbsCurve::_type_handle;
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 void EggNurbsCurve::
00032 setup(int order, int num_knots) {
00033 _order = order;
00034 _knots.clear();
00035
00036 int i;
00037 _knots.reserve(num_knots);
00038 for (i = 0; i < num_knots; i++) {
00039 _knots.push_back((double)i);
00040 }
00041 }
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 void EggNurbsCurve::
00055 set_num_knots(int num) {
00056 if ((int)_knots.size() >= num) {
00057
00058 _knots.erase(_knots.begin() + num, _knots.end());
00059 } else {
00060
00061 _knots.reserve(num);
00062 for (int i = _knots.size(); i < num; i++) {
00063 _knots.push_back(0.0);
00064 }
00065 }
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 bool EggNurbsCurve::
00077 is_valid() const {
00078 if (_order < 1 || _order > 4) {
00079
00080 return false;
00081 }
00082
00083 if (get_num_cvs() != (int)size()) {
00084
00085 return false;
00086 }
00087
00088
00089 int i;
00090 for (i = 1; i < get_num_knots(); i++) {
00091 if (get_knot(i) < get_knot(i - 1)) {
00092 return false;
00093 }
00094 }
00095
00096
00097 return true;
00098 }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 bool EggNurbsCurve::
00109 is_closed() const {
00110
00111
00112
00113
00114
00115
00116 int i;
00117 for (i = 1; i < get_order(); i++) {
00118 if (get_knot(i) != get_knot(i-1)) {
00119 return true;
00120 }
00121 }
00122 return false;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131 void EggNurbsCurve::
00132 write(ostream &out, int indent_level) const {
00133 write_header(out, indent_level, "<NurbsCurve>");
00134
00135 if (get_curve_type() != CT_none) {
00136 indent(out, indent_level + 2)
00137 << "<Char*> type { " << get_curve_type() << " }\n";
00138 }
00139 if (get_subdiv() != 0) {
00140 indent(out, indent_level + 2)
00141 << "<Scalar> subdiv { " << get_subdiv() << " }\n";
00142 }
00143 indent(out, indent_level + 2)
00144 << "<Order> { " << get_order() << " }\n";
00145 indent(out, indent_level + 2)
00146 << "<Knots> {\n";
00147 write_long_list(out, indent_level+4, _knots.begin(), _knots.end(), "",
00148 "", 72);
00149 indent(out, indent_level + 2)
00150 << "}\n";
00151
00152 write_body(out, indent_level+2);
00153 indent(out, indent_level) << "}\n";
00154 }