本文整理汇总了C++中Wvec::set方法的典型用法代码示例。如果您正苦于以下问题:C++ Wvec::set方法的具体用法?C++ Wvec::set怎么用?C++ Wvec::set使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Wvec
的用法示例。
在下文中一共展示了Wvec::set方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: snap
NDCpt
Bface::nearest_pt_ndc(CNDCpt& p, Wvec &bc, int &is_on_tri) const
{
// Bsimplex virtual method
// same as above, but operates in NDC space
// get barycentric coords:
NDCpt a = _v1->ndc();
NDCpt b = _v2->ndc();
NDCpt c = _v3->ndc();
double A = signed_area_ndc(a, b, c);
double u = signed_area_ndc(p, b, c) / A;
double v = signed_area_ndc(a, p, c) / A;
bc.set(u, v, 1 - u - v);
// to account for numerical errors, snap
// near-zero values to 0 and renormalize
snap(bc);
if (bc[0] < 0 || bc[1] < 0 || bc[2] < 0) {
// p is outside the triangle.
// find closest point to an edge:
is_on_tri = 0;
double t1, t2, t3;
NDCpt p1 = pt_near_seg_ndc(a,b,p,t1);
NDCpt p2 = pt_near_seg_ndc(b,c,p,t2);
NDCpt p3 = pt_near_seg_ndc(c,a,p,t3);
double d1 = p.dist_sqrd(p1);
double d2 = p.dist_sqrd(p2);
double d3 = p.dist_sqrd(p3);
if (d1 < d2) {
if (d1 < d3) {
bc.set(1-t1,t1,0);
return p1;
}
bc.set(t3,0,1-t3);
return p3;
}
if (d2 < d3) {
bc.set(0,1-t2,t2);
return p2;
}
bc.set(t3,0,1-t3);
return p3;
}
is_on_tri = 1;
return (a*bc[0]) + (b*bc[1]) + (c*bc[2]);
}
示例2: if
Wpt
Bedge::nearest_pt(CWpt& p, Wvec &bc, bool &is_on_simplex) const
{
Wvec ab = _v2->loc() - _v1->loc();
Wvec ac = p - _v1->loc();
double dot = (ab * ac) / ab.length_sqrd();
bc.set(1-dot, dot, 0);
if (dot < gEpsZeroMath) {
bc.set(1, 0, 0);
is_on_simplex = (dot >= 0);
} else if (1-dot < gEpsZeroMath) {
bc.set(0, 1, 0);
is_on_simplex = (dot <= 1);
}
return (bc[0] * _v1->loc()) + (bc[1] * _v2->loc());
}
示例3: clamp_barycentric
static void clamp_barycentric(Wvec &bc) {
bc.set(max(bc[0],0.0), max(bc[1],0.0), max(bc[2],0.0));
bc /= (bc[0] + bc[1] + bc[2]);
}
示例4: vec
void
Bedge::project_barycentric(CWpt &p, Wvec &bc) const
{
double t = ((p - _v1->loc()) * vec()) / sqr(length());
bc.set(1.0 - t, t, 0);
}