本文整理汇总了C++中ON_Curve::SpanCount方法的典型用法代码示例。如果您正苦于以下问题:C++ ON_Curve::SpanCount方法的具体用法?C++ ON_Curve::SpanCount怎么用?C++ ON_Curve::SpanCount使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ON_Curve
的用法示例。
在下文中一共展示了ON_Curve::SpanCount方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SplitKinkyEdge
bool ON_Brep::SplitKinkyEdge(
int edge_index,
double kink_tol_radians
)
{
// Default kink_tol_radians MUST BE ON_PI/180.0.
//
// The default kink tol must be kept in sync with the default for
// TL_Brep::SplitKinkyFace() and ON_Brep::SplitKinkyFace().
// See comments in TL_Brep::SplitKinkyFace() for more details.
bool rc = true;
if (kink_tol_radians < ON_ZERO_TOLERANCE)
kink_tol_radians = ON_ZERO_TOLERANCE;
else if (kink_tol_radians > ON_PI - ON_ZERO_TOLERANCE)
kink_tol_radians = ON_PI - ON_ZERO_TOLERANCE;
double atol = cos(kink_tol_radians);
if (edge_index < 0 || edge_index >= m_E.Count())
return false;
ON_BrepEdge& E = m_E[edge_index];
if (E.m_c3i < 0)
return false;
ON_SimpleArray<double> split_t(4);
double t0 = E.Domain()[0];
int hint = 0;
ON_Curve* curve = m_C3[E.m_c3i];
if (!curve) return false;
int scount = curve->SpanCount();
while (split_t.Count() < scount){
double t;
if (!E.GetNextDiscontinuity(ON::G1_continuous, t0, E.Domain()[1],
&t, &hint, NULL, atol)) break;
split_t.Append(t);
t0 = t;
}
if (split_t.Count() >= scount)
return false;
if (split_t.Count() == 0)
return true;//no kinks
split_t.Reverse();
for (int i=0; i<split_t.Count(); i++){
//if split parameter is near start or end, just adjust domain.
double t0, t1;
m_E[edge_index].GetDomain(&t0, &t1);
if (t1 - t0 < 10.0*ON_ZERO_TOLERANCE) continue;
//6 Dec 2002 Dale Lear:
// I added the relative edge_split_s and trm_split_s tests to detect
// attempts to trim a nano-gnats-wisker of the end of a trim.
// set to true if edge should be trimmed instead of split.
bool bTrimEdgeEnd = false;
double edge_split_s = ON_Interval(t0,t1).NormalizedParameterAt(split_t[i]);
double trim_split_s = 0.5;
if (split_t[i] - t0 <= ON_ZERO_TOLERANCE || edge_split_s <= ON_SQRT_EPSILON )
{
continue;
}
if (t1 - split_t[i] <= ON_ZERO_TOLERANCE || edge_split_s >= 1.0-ON_SQRT_EPSILON)
{
continue;
}
// trim_t[] = corresponding trim parameters
ON_SimpleArray<double> trim_t(m_E[edge_index].m_ti.Count());
if ( !bTrimEdgeEnd )
{
for (int j=0; j<m_E[edge_index].m_ti.Count(); j++)
{
double t;
if (!GetTrimParameter(m_E[edge_index].m_ti[j], split_t[i], &t)){
rc = false;
continue;
}
trim_t.Append(t);
const ON_BrepTrim& trim = m_T[m_E[edge_index].m_ti[j]];
ON_Interval trim_domain = trim.Domain();
trim_split_s = trim_domain.NormalizedParameterAt(t);
if ( trim_split_s <= ON_SQRT_EPSILON || t - trim_domain[0] <= ON_ZERO_TOLERANCE )
{
bTrimEdgeEnd = true;
break;
}
if ( trim_split_s >= 1.0-ON_SQRT_EPSILON || trim_domain[1] - t <= ON_ZERO_TOLERANCE )
{
bTrimEdgeEnd = true;
break;
}
}
}
if ( bTrimEdgeEnd )
{
// if we get here, a split parameter we got was too close to
//.........这里部分代码省略.........