其实求齐次坐标系中三点共线,可以等价于求欧几里得坐标系中三个向量共面.
第一种方法是利用公式:a⋅(b×c)=0\mathbf{a} \cdot(\mathbf{b} \times \mathbf{c})=0 a⋅(b×c)=0

三个向量的混合积等于0,就证明它们共面.
因为两个向量b,c的叉积得到第三个向量d,这个向量b,c所组成的平面垂直,
如果a与d垂直,也就是a与d的点积等于0,那么a与b,c所组成的平面是平行的,由于向量在空间中可以自由平移,所以a与b,c共面.
需要用到Opencv,代码如下:

bool noThreeCollinear(const std::vector<cv::Vec3f> &points){int n = points.size();int result = 1;for (int i = 0; i<n-2;i++){for (int j = i+1; j<n-1;j++){for (int k = j+1; k<n;k++){result *= points[i].dot(points[j].cross(points[k]));}}}if (result == 0){return false;}else{return true;}
}

第二种方法是判断这三个向量(齐次坐标系中的点)的行列式是不是为0.
det⁡[xyz]=0\operatorname{det}\left[\begin{array}{lll} {\mathbf{x}} & {\mathbf{y}} & {\mathbf{z}} \end{array}\right]=0 det[x​y​z​]=0
det⁡[xyz]=∣x1y1z1x2y2z2x3y3z3∣\operatorname{det}\left[\begin{array}{lll} {\mathbf{x}} & {\mathbf{y}} & {\mathbf{z}} \end{array}\right]=\left|\begin{array}{lll} {x_{1}} & {y_{1}} & {z_{1}} \\ {x_{2}} & {y_{2}} & {z_{2}} \\ {x_{3}} & {y_{3}} & {z_{3}} \end{array}\right| det[x​y​z​]=∣∣∣∣∣∣​x1​x2​x3​​y1​y2​y3​​z1​z2​z3​​∣∣∣∣∣∣​
而前面的混合积展开后是这个样子的:
a⋅(b×c)=∣a1a2a3b1b2b3c1c2c3∣\mathbf{a} \cdot(\mathbf{b} \times \mathbf{c})=\left|\begin{array}{lll} {a_{1}} & {a_{2}} & {a_{3}} \\ {b_{1}} & {b_{2}} & {b_{3}} \\ {c_{1}} & {c_{2}} & {c_{3}} \end{array}\right| a⋅(b×c)=∣∣∣∣∣∣​a1​b1​c1​​a2​b2​c2​​a3​b3​c3​​∣∣∣∣∣∣​
混合积展开就是行列式的转置.
由于:det⁡(A)=det⁡(AT)\operatorname{det}(\mathbf{A})=\operatorname{det}\left(\mathbf{A}^{T}\right) det(A)=det(AT)
所以这两种方法本质上是一样的.
代码如下:

bool noThreeCollinear(const std::vector<cv::Vec3f> &points){int n = points.size();int result = 1;cv::Matx33f M;for (int i = 0; i<n-2;i++){for (int j = i+1; j<n-1;j++){for (int k = j+1; k<n;k++){M(0,0)= points[i](0);M(1,0)= points[i](1);M(2,0)= points[i](2);M(0,1)= points[j](0);M(1,1)= points[j](1);M(2,1)= points[j](2);M(0,2)= points[k](0);M(1,2)= points[k](1);M(2,2)= points[k](2);result *= cv::determinant(M);}}}if (result == 0){return false;}else{return true;}
}

这个矩阵赋值我觉得应该有更简单的方法,但是我不会,谁知道可以告诉我一下嘛

测试函数:


void test_noThreeCollinear()
{std::vector<cv::Vec3f> p1 = {{1.0f, 0.0f, 1.0f},{2.0f, 0.0f, 1.0f},{3.0f, 639.0f, 1.0f},{4.0f, 639.0f, 1.0f},};bool b = noThreeCollinear(p1);if (!b){cout << "There seems to be a problem with noThreeCollinear(..)!" << endl;cout << "Press enter to continue..." << endl;cin.get();exit(-1);}
}

如果觉得有帮助,欢迎点赞~
有问题的话欢迎评论里指出错误!我感觉自己都在乱写.
谢谢~

[C++]判断齐次坐标系中三点是否共线(三个向量是否共面)相关推荐

  1. jquery判断方法是否存在_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  2. aop判断方法是否执行成功_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  3. 判断字符串中是否为数字的三种方法

    //1用JAVA自带的函数 public static boolean isNumeric(String str){for (int i = str.length();--i>=0;){ if ...

  4. 你一个包含n个整数nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?

    /* 给你一个包含n个整数nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?请你找出所有和为0且不重复的三元组.注意:答案中不可以包含重复的三元组.*/ //1.给数组排序(从小 ...

  5. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组(GO,PHP)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  6. 【排序】 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。(java)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  7. js之删除对象属性的三种方法 判断对象中是否有某一属性的四种方法

    js之删除对象属性的三种方法 & 判断对象中是否有某一属性的四种方法 示例 1.基础版 var a = { id: 18, age: 20, name: "zhangsan" ...

  8. 【Java】环形链表 ( 给定一个链表,判断链表中是否有环)

    题目描述 :给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 po ...

  9. js两个等号和三个等号_js中两个等号(==)和三个等号(===)的区别

    js中两个等号(==)和三个等号(===)的区别: 1. "=="表示:equality -> 等同 的意思,"=="使用两个等号时,如果两边值的类型不同 ...

  10. 不共线三点确定特征平面并求解平面系数

    1.基本原理 已知三点p1,p2,p3,求其平面方程,p1=[x1,y1,z1];p2=[x2,y2,z2];p3=[x3,y3,z3];那么求解下面矩阵q行列式就是了:q=[ones(4,1),[x ...

最新文章

  1. [NTU-Machine-learning-note]1 Introduction(2)
  2. 创建新的SAP CRM product search scenario - 如何在SAP CRM里实现自定义的产品搜索场景
  3. Ajax传递json数据
  4. c语言中二维数组的结构体,怎么才能把结构体里面的二维数组打印出来?
  5. 模型算法_生产建模型 算法控效率
  6. CXF处理Date类型的俩种方式
  7. anaconda conda 切换为清华源
  8. 如何添加天锐绿盾屏幕水印
  9. CodeBlocks下载+界面优化+创建文件+常用快捷键
  10. js 图表处理之Echar
  11. java小数的数据类型_Java的基本数据类型
  12. vue-router—12全局钩子函数
  13. vue中使用vue-quill-editor富文本编辑器
  14. Windows Live Writer插件开发经验
  15. 谷歌身份验证器在手机间转移教程
  16. Oracle安装时先决条件检测失败
  17. 《东周列国志》第五十一回 责赵盾董狐直笔 诛斗椒绝缨大会
  18. python画抛物线_在python中利用最小二乘拟合二次抛物线函数的方法
  19. 如何注册Line账号?-Line账号/Line广告/Line好友
  20. 高德地图API 添加标点 自定义标点

热门文章

  1. 积分商城游戏化运营?积分游戏应该如何正确设置
  2. 产品日记(二)一些愚见, 记录在此
  3. Photo Shop教程(adobe的官方入门视频)
  4. python中创建requirement.txt
  5. 《假如给我三天光明》读后感及其摘录(1)
  6. 环信php修改头像,环信客服 如何正确设置用户的头像和昵称?
  7. 《炬丰科技-半导体工艺》集成微加工平台各向异性腐蚀
  8. 华为日历怎么显示一月_华为手机日历怎么设置
  9. Warning: To load an ES module, set “type“: “module“ in the package.json or use the .mjs extension.
  10. cli命令行配置路由器_Cisco路由CLI基础命令