计算机图形学:基础小问题

1、点沿一个方向平移一段距离
代码:

{
    pos;//待移动的点
    dir;//方向
    len;//位移量
    result=pos+dir.normalize()*len;
}

2、给定点,与法向画半径为r的圆

代码:

//给定圆心法向半径
//指定输出点集的大小(num)
std::vector<Vec3> test(Vec3 center, Vec3 norm, int num, float radius)
{
  float ref_num;
  Vec3 dir;
  if (!(abs(norm.X() - 0.f) < 0.00001f))
  {
    ref_num = norm.X();
    auto temp= -(norm.Y()+ norm.Z());
    dir = { temp / ref_num,1.0f,1.0f };
  }
  else if (!(abs(norm.Y() - 0.f) < 0.00001f))
  {
    ref_num = norm.Y();
    auto temp = -(norm.X() + norm.Z());
    dir = { 1.0f,temp / ref_num,1.0f };
  }
  else if (!(abs(norm.Z() - 0.f) < 0.00001f))
  {
    ref_num = norm.Z();
    auto temp = -(norm.X() + norm.Y());
    dir = { 1.0f,1.0f,temp / ref_num };
  }
  auto rot_rad = 0.0f;//已经旋转的角度
  auto off_rad = 2 * (M_PI / num);//单次偏移角度
  auto rot_dir = dir;//旋转后的方向
  Vec3Vector result_vec;
  while ((rot_rad < 2 * M_PI))
  {

    Vec3 inter_pos;
    //  得到旋转矩阵;
    core::Matrix44f spin_mat;
    spin_mat.SetRotateRad(rot_rad, norm);
    rot_rad += off_rad;
    rot_dir = spin_mat * dir;
    inter_pos = center + rot_dir.Normalize() * radius;
    result_vec.push_back(inter_pos);
  }
  return result_vec;
}

3、流形网格

{
    //三角网格曲面中,大多的算法基于流形网格manifold mesh,其定义如下:
    //1)Each edge is incident to only one or two faces;
    // 一条网格边为一个或两个网格三角面片共享;
    //2)the faces incident to a vertex form a closed or an open fan。
    //一个网格顶点的一环邻域三角片构成一个 闭合或者开放的扇面。
}

4、贝塞尔曲线数学公式

贝塞尔曲线是t的多项式,t的值被限制在0和1之间,并且含有ab等参数。它采用了二次项的形式,听起来很神奇但实际上就是混合不同值的简单描述:

我明白你在想什么:这看起来并不简单,但如果我们拿掉t并让系数乘以1,事情就会立马简单很多,看看这些二次项:

需要注意的是,2与1+1相同,3相当于2+1或1+2,6相当于3+3...如你所见,每次我们增加一个维度,只要简单地将头尾置为1,中间的操作都是“将上面的两个数字相加”。现在就能很容易地记住了。

还有一个简单的办法可以弄清参数项怎么工作的:如果我们将(1-t)重命名为a,将t重命名为b,暂时把权重删掉,可以得到这个:

基本上它就是“每个ab结合项”的和,在每个加号后面逐步的将a换成b。因此这也很简单。现在你已经知道了二次多项式,为了叙述的完整性,我将给出一般方程:

 这就是贝塞尔曲线完整的描述。在这个函数中的Σ表示了这是一系列的加法(用Σ下面的变量,从...=<值>开始,直到Σ上面的数字结束)。

5、求一个方向上的最高点和最低点

Matrix44f newMatrix;
MathUtils::matrixFromNormal(ref_dir, Vec3(), newMatrix);

float max_z = -FLT_MAX;
Vec3 max_point;
for (int i = 0; i < border_points.size(); i++)
{
	auto new_z = (Inverse(newMatrix) * border_points[i]).Z();
	if (new_z > max_z)
	{
		max_z = new_z;
		max_point = border_points[i];
	}
}
//最低点同理求最小值的点即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值