首页 > 其他分享 >判断多边形的顶点内外角点

判断多边形的顶点内外角点

时间:2024-08-31 09:52:48浏览次数:3  
标签:多边形 polygon Point int 角点 叉积 顶点 size

c++ opencv 如何判断approxPolyDP近似折线形成的闭合区域的坐标点是内角点还是外角点;  

 

 

 

 code
#include <opencv2/opencv.hpp>  
#include <vector>  
  
using namespace cv;  
using namespace std;  
  
// 计算向量叉积  
int crossProduct(Point a, Point b, Point c) {  
    Point v1 = {b.x - a.x, b.y - a.y};  
    Point v2 = {c.x - b.x, c.y - b.y};  
    return v1.x * v2.y - v1.y * v2.x;  
}  
  
// 判断角点类型  
void detectCornerType(const vector<Point>& points) {  
    int n = points.size();  
    for (int i = 0; i < n; i++) {  
        int prev = (i > 0) ? i - 1 : n - 1;  
        int next = (i < n - 1) ? i + 1 : 0;  
          
        int cp = crossProduct(points[prev], points[i], points[next]);  
        if (cp > 0) {  
            cout << "内角点 at: " << points[i] << endl;  
        } else if (cp < 0) {  
            cout << "外角点 at: " << points[i] << endl;  
        } else {  
            cout << "直线点或平角点 at: " << points[i] << endl;  
        }  
    }  
}  
  
int main() {  
    // 加载图像  
    Mat img = imread("path_to_image");      
    // 转换为灰度图  
    Mat gray;  
    cvtColor(img, gray, COLOR_BGR2GRAY);        
    // 二值化  
    Mat binary;  
    threshold(gray, binary, 100, 255, THRESH_BINARY);        
    // 查找轮廓  
    vector<vector<Point>> contours;  
    findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);        
    // 近似多边形  
    vector<Point> approx;  
    approxPolyDP(contours[0], approx, arcLength(contours[0], true) * 0.02, true);        
    // 判断角点类型  
    detectCornerType(approx);       
    return 0;  
}
View Code

 

 

 在OpenCV中,可以通过检查顶点相对于其相邻点的方向来判断多边形的顶点是内角点还是外角点。

如果相邻顶点顺时针排列,则该顶点是外角点;如果逆时针排列,则该顶点是内角点。

code

#include <opencv2/opencv.hpp>
#include <vector>
 
// 检查顶点vertex相对于它的邻居neighbor的方向
bool isInternalAngle(const cv::Point& vertex, const cv::Point& neighbor, const cv::Point& nextNeighbor) {
    cv::Point vec1 = neighbor - vertex;
    cv::Point vec2 = nextNeighbor - vertex;
    // 叉乘判断方向
    double crossProduct = vec1.x * vec2.y - vec1.y * vec2.x;
    // 如果叉乘结果为负,则neighbor在vertex的顺时针方向
    // 如果为正,则neighbor在vertex的逆时针方向
    return crossProduct < 0;
}
 
int main() {
    std::vector<cv::Point> polygon = /* 多边形的顶点,例如:{{0,0}, {1,0}, {1,1}, {0,1}} */;
 
    for (size_t i = 0; i < polygon.size(); ++i) {
        size_t neighborIndex = (i + 1) % polygon.size();
        size_t nextNeighborIndex = (i + 2) % polygon.size();
        bool isInternal = isInternalAngle(polygon[i], polygon[neighborIndex], polygon[nextNeighborIndex]);
        std::cout << "顶点 " << i << " 是" << (isInternal ? "内角" : "外角") << " 点。" << std::endl;
    }
 
    return 0;
}
View Code

 

  

判断内角点或外角点
遍历每个点:对于多边形上的每个点,考虑它的前一个点、当前点和后一个点。
计算向量:计算从当前点到前一个点的向量,以及从当前点到后一个点的向量。
计算叉积:计算这两个向量的叉积。叉积的符号(正或负)将告诉你角点的类型:
如果叉积为正,表示该角点是逆时针方向的转折,即外角点。
如果叉积为负,表示该角点是顺时针方向的转折,即内角点。
向量叉积的数值大小的意义
叉积的数值大小实际上表示了这两个向量构成的平行四边形的面积。在判断角点类型的上下文中,我们主要关心叉积的符号,而不是其绝对值。绝对值的大小提供了两个向量构成的平行四边形面积的大小,但在区分内角点和外角点时不重要。

 


 

 

 

标签:多边形,polygon,Point,int,角点,叉积,顶点,size
From: https://www.cnblogs.com/happyamyhope/p/18363184

相关文章

  • opencv 判断某个坐标点是否在多边形内cv::pointPolygonTest
        cv::pointPolygonTestpointPolygonTest 函数在OpenCV中用于判断点是否在一个多边形的内部、外部或在边界上。该函数不需要考虑多边形的凹凸性,即它可以处理凸多边形和凹多边形。  判断坐标点是否在坐标围起来的区域内判断点是否在点组成的封闭区域......
  • 绘制ply模型顶点的法线(通过两点)
    importtrimeshimportmatplotlib.pyplotasplt#读取点云文件mesh=trimesh.load_mesh('test.ply')#计算法线mesh.vertex_normals#创建一个新的图形窗口fig=plt.figure()ax=fig.add_subplot(111,projection='3d')#绘制顶点ax.scatter(mesh.vertices[:,......
  • 顶点染色算法的matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################算法用途给出简单图的染色数尽可能少的顶点染色方案算法思想从顶点度数最小的顶点开始染色,找到不与其相邻的顶点并选择其中一个顶点进行染色,再找与这两个顶点都不相邻的顶点集合,并对其中......
  • Qt5.14.2 多边形与多边形求交集
    利用Qt5.14.2中自带的QPolygonF类的intersected()函数求两个多边形的交集多边形。inlineQList<QPolygonF>getPolygonIntersectedWithPolygon(QPolygonFpolygon1,QPolygonFpolygon2){QList<QPolygonF>outval;//此处求出的intersection可能包含多个子......
  • 信息学奥赛初赛天天练-72-NOIP2016普及组-基础题3-无向图、简单无向图、自环、平行边
    NOIP2016普及组基础题35以下不是存储设备的是()A光盘B磁盘C固态硬盘D鼠标6如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照CapsLock、字母键A、字母键S、字母键D、字母键F的顺序循环按键,即CapsLock、A、S、D、F、CapsLock、A、S、D、F......
  • QT+OpenGL从顶点着色器传递颜色数据给片元着色器
    一、概述目的:1.定义顶点数据和颜色数据,并将颜色数据通过顶点着色器传递给片元着色器2.对定义的三角形动态进行:平移、颠倒、镜像二、示例代码1.定义顶点坐标和颜色值。此处颜色和顶点是放到一块的。需要告知GPU如何解析数据,如:哪些是顶点,哪......
  • QT+OpenGL使用一组顶点绘制两个三角形
    一、概述需求:使用一组顶点坐标绘制两个三角形。ps:此需求和绘制一个三角形并没有什么不同,只是把顶点坐标由三个改成了6个。依次类推,如果想要绘制多边形或者更多的三角形,只需要定义不同的顶点就行了。效果:二、代码示例1.定义顶点floatvertices[18]={......
  • 用GDI+旋转多边形来绘制一个时钟摸拟小程序
    效果图 在头文件类中声明变量TCHARm_dayStr[4];//日期TCHARm_weekStr[4];//星期Gdiplus::Font*m_pFont;//字体Gdiplus::StringFormatm_strFormat;//格式化字符串Gdiplus::Pen*m_pPen;//画笔Gdiplus::So......
  • OpenGL ES->GLSurfaceView着色器程序中传递顶点数组和颜色数组绘制渐变三角形
    自定义View代码classMyGLSurfaceView(context:Context,attrs:AttributeSet):GLSurfaceView(context,attrs){init{//设置OpenGLES3.0版本setEGLContextClientVersion(3)//设置当前类为渲染器,注册回调接口的实现类......
  • 只用一个 HTML 元素可以写出多少形状?——多边形篇
    上一篇章的末尾,我们只用一个 div 元素写了一个鸡蛋,在欧几里得平面几何中,鸡蛋的形状已经不能算是标准形状了。对于非标准的形状,没有比较直观的几何规律,命名方面也更加困难,俗称不规则图形,在欧几里得平面几何中,将其统称为多边形。在平行四边形篇中,我们首先使用常规的盒模型写出......