上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
3D数学:求点到直线的投影
作者:未知 申领版权
2010年10月25日 共有 2538 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

     

    
  1.  
    1.  //点到矢量vec2的投影,ori_vec2表示vec2起点(投影参照点)
    2.   inline CVector3 Project2Vector(CVector3& vec2, CVector3 ori_vec2){
    3.       CVector3 dir = (*this) - ori_vec2;
    4.       double t = dir.DotProd(vec2) / vec2.DotProd(vec2);
    5.  
    6.       return ori_vec2   vec2 * t;
    7.   };
    8.  
    9.  
    10. //例子
    11. {
    12. CVector3 pt = CVector3(.....);//待投影的点
    13. CVector3 ori_pt = CVector3(.....);//投影参考点,也就是上文的P1
    14. CVector3 vector = CVector3(.....);//待投影于其上的某向量
    15.  
    16. CVector3 point;
    17. point = pt .Project2Vector(vector, ori_pt );
    18. }
    1. CVector3 ClosestPointOnSegment(CVector3 p, CVector3 p1, CVector3 p2)
    2. {
    3.     CVector3 diff = p-p1;
    4.     CVector3 dir = p2-p1;
    5.     float dot1 = dot(diff,dir);
    6.     if (dot1 <= 0.0f) {
    7.         return p1;
    8.     }    
    9.     float dot2 = dot(dir,dir);
    10.     if (dot2 <= dot1) {
    11.         return p2;
    12.     }
    13.     float t=dot1/dot2;
    14.     return p1   t * dir;
    15. }
  2. 今天思考一个问题的时候,考虑到把空间中一个点投影到一个向量上,也就是project-point-to-vector,发现原来自己想不出来,惟有求助google,算法理解。
        事情是这样的,在OPENGL中,点的坐标定义于其模型坐标系XYZ,现在我经过某个转换生成了另一个3维坐标系X'Y'Z',反映于原坐标系,就是三个满足正交的方向向量,干脆叫做X'和Y'和Z'。现在我有一个定义于模型坐标系XYZ的点阵,我需要把这些点分别投影到X'和Y'和Z'上,求投影点坐标。
        问题有点虚,所以考虑把这三个正交向量看作三条直线,问题就变成了:求点到直线的投影。考虑一个点和一条直线,描述这条直线需要两个点P1和P(顺带一提,P-P1就是相应的那向量),待投影的点叫P3。不妨设P3投影到该直线后所得的点是P3'注意P3'与P1、P共线,因此必然有一个比例因子t,令
        t * (P2  - P1) =   P3' - P1
        因此问题变为:已知P1、P2 、P, P1和P共线,求比例因子t 。令vec1 = P3 - P1  , vec2 = P2  - P1,显然dis = vec1 * vec2(点乘)就是vec1在vec2上的投影,既然vec1与vec2共享一个起点P1,那么dis就是P1到投影点P3'的距离了。于是
        t = dis / length(P 1P2) = vec1 * vec2 / length(P 1P2)
        
        = (P
    3 - P1) * (P2  - P1)  / abs (P2  - P1)
        
        = (P
    3 - P1) * (P2  - P1)  / (P2  - P1) *(P2  - P1)
        abs (P2  - P1)表示求模(也就是线段P 1P2的长度),abs (P2  - P1) = (P2  - P1) *(P2  - P1) 。由上两式子就能求出P3' 了。这么简单..........看来脑袋锈豆不浅。算法写进我的CVector3类里了。直线还原成向量的样子,相当于把直线用一个向量和一个参考点描述。
         另:点到线段P 1P2的投影:
          
        

 

相关新闻

战略:绩效管理的中心
债务大转嫁
新股破发不是病 利益链条才要命
中美研究型大学科技管理体制与运行机制比较研究与启示
1.3 Intel 系列CPU简介
Direct3D 实现鼠标拾取
理解OpenGL拾取模式(OpenGL Picking)
Picking Tutorial
全屏反锯齿 - 多重采样Ⅱ

您可能对这些感兴趣  

《VB程序设计基础》选择题
设计模式之Iterator
设计模式之Visitor
设计模式之Interpreter(解释器)
设计模式之Mediator(中介者)
设计模式之Strategy(策略)
设计模式之State
设计模式之Command
设计模式之Chain of Responsibility(职责链)
设计模式之Observer

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》