查看: 1837|回复: 3

关于过特殊三点的抛物线的一种情况

[复制链接]

该用户从未签到

发表于 2009-5-25 10:53:33 | 显示全部楼层 |阅读模式
下面是对过三点的抛物线的一种情况的推导,欢迎讨论

如果给出的三点满足条件:
  关于抛物线对称轴对称的两点p0,p2,和抛物线的顶点坐标p1。  (*)

则抛物线的方程式可精确求得:  
设p(u)=c0 + c1*u + c2*u^2是抛物线的方程,参数u∈[0.0, 1.0]; c0,c1,c2为常数;

抛物线过p0点,此时u=0,  得 p0 = c0;
抛物线过p1点,此时u=1/2,得 p1 = c0 + c1/2 + c2/4;
抛物线过p2点,此时u=1,  得 p2 = c0 + c1 + c2;


                   | 1  0   0 |
写成矩阵的形式:P =  | 1 1/2 1/4|* C;
                   | 1  1   1 |
                    
其中P为(p0,p1,p2)',C为(c0,c1,c2)' (注意向量(p0,p1,p2)和(c0,c1,c2)右上角的“'”,向量的转置)

     | 1  0   0 |
记M =| 1 1/2 1/4| ,则记M的逆矩阵为N; (M为非奇异阵,则M的逆存在),容易求得M的逆矩阵N:
     | 1  1   1 |

    | 1  0  0 |
N = | -3 4 -1 |, 则 C = N*P;
    | 2 -4  2 |

记 U为(1,u,u^2),(抛物线的基),则p(u) = U*C;  (向量可看作某一维度为1的一个矩阵),而C = N*P,则有:

p(u) = U*N*P; 由矩阵的结合律:p(u) = (U*N)*P; 写开即为:

p(u)=(1-3*u+2*u^2, 4*u-4u^2, 2*u^2-u)*P
    =(1-3*u+2*u^2)*p0 + (4*u-4u^2)*p1 + (2*u^2-u)*p2;   (p0,p1,p2,即为刚才的三个插值点,u∈[0.0, 1.0])

随着参数u在区间[0,1]上的变化,p(u)为该抛物线上的一系列的点。


一个不精确的情况为:如果三点不符合条件(*),则也可以得到一条抛物线或者近似抛物线,貌似不可控制。

该用户从未签到

 楼主| 发表于 2009-5-25 10:57:57 | 显示全部楼层
下面是过p0(0,0,0), p1(0.5f,0.5f,1.f), p2(1.f,1.f,0.f)三点的抛物线


#include <osg/Geode>
#include <osg/Geometry>
#include <osgViewer/Viewer>
#include <osg/Array>
#include <osg/Group>

int _tmain(int argc, _TCHAR* argv[])
{

osg::Group* root = new osg::Group();

osg::Geode* geode = new osg::Geode();


osg::Vec3Array* vertex = new osg::Vec3Array();

(*vertex).push_back(osg::Vec3d());

(*vertex).push_back(osg::Vec3d(0.5f,0.5f,1.f));

(*vertex).push_back(osg::Vec3d(1.f,1.f,0.f));


osg::Vec3Array* vert = new osg::Vec3Array();

osg::Vec3d buf;


for(double u=0.f; u<1.f; u+=0.01f)

{

  buf = (*vertex)[0]*(1-3*u+2*u*u)+(*vertex)[1]*(4*u-4*u*u)+(*vertex)[2]*(2*u*u-u);

  (*vert).push_back(buf);

}

osg::Geometry* geom = new osg::Geometry();

geom->setVertexArray(vert);

geom->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INE_STRIP,0,(*vert).size()));

geode->addDrawable(geom);

root->addChild(geode);


osgViewer::Viewer  viewer;

viewer.setSceneData(root);

return viewer.run();

}

该用户从未签到

发表于 2009-5-26 09:06:21 | 显示全部楼层
呵呵,没有细看推导过程,毕竟在论坛贴子上书写和阅读数学公式是一件很麻烦的事情。

如果楼主有兴趣的话,欢迎把您自己设计的各种空间曲线曲面造型工具提交给我主持开发的osgModeling工程。具体的代码书写方法可以参考osgModeling::Helix类的写法,这个类的作用是生成空间螺旋线

该用户从未签到

 楼主| 发表于 2009-5-26 14:54:59 | 显示全部楼层
嗯,我想明白了一般情况了再发上来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表