一些CGAL基础操作的任务

这篇具有很好参考价值的文章主要介绍了一些CGAL基础操作的任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Regular_triangulation_euclidean_traits_3.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <GLUT/GLUT.h>
#include <iostream>
#include <cmath>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_2<K> Delaunay;
typedef Delaunay::Vertex_handle Vertex_handle;
//初始化定义相关的结构体
typedef K::Point_2 Point;
std::vector<Point> vertices;
//定义顶点的结构
int global_w, global_h;
void points_add_point( int x, int y )
{
    vertices.push_back( Point( x, global_h-y ) );
}
void points_draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    std::vector <Point>::iterator iter;
    glColor3f( 0.0, 1.0, 1.0 );
    glPointSize(5);
    glBegin(GL_POINTS);
    for( iter = vertices.begin(); iter != vertices.end(); iter++ )
        glVertex2i( iter->hx(), iter->hy() );
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
}
void points_triangulation()
{
    points_draw();                          //最后一个点还要再画一下!
    Delaunay dt;
    dt.insert(vertices.begin(), vertices.end());
    //将vector数组传入狄洛尼三角形数据结构
    //cgal提供狄洛尼三角形的核心数据结构就是Delaunay
    glPushMatrix();
    Delaunay::Finite_faces_iterator fit;
    //遍历算法生成的所有三角面(其实是三角形)
    glColor3f( 1.0, 1.0, 1.0 );
    for( fit = dt.finite_faces_begin(); fit != dt.finite_faces_end(); fit ++)
    {
        //开始绘制三角形
        glBegin(GL_LINE_LOOP);
        glVertex2i( fit->vertex(0)->point().x(), fit->vertex(0)->point().y() );
        glVertex2i( fit->vertex(1)->point().x(), fit->vertex(1)->point().y() );
        glVertex2i( fit->vertex(2)->point().x(), fit->vertex(2)->point().y() );
        glEnd();
    }

        Delaunay::Edge_iterator eit;
        //遍历Delaunay的所有边,绘制Delaunay图的对偶图,即Voronoi图
        glEnable( GL_LINE_STIPPLE );//使用点画模式,即使用虚线来绘制Voronoi图
        glLineStipple( 1, 0x3333 );
        glColor3f( 0.0, 1.0,1.0 );
        for( eit = dt.edges_begin(); eit != dt.edges_end(); eit ++)
        {
            CGAL::Object o = dt.dual(eit);
            //在其对偶图中所对应的边
            if (CGAL::object_cast<K::Segment_2>(&o)) //如果这条边是线段,则绘制线段
            {
                glBegin(GL_LINES);
                glVertex2i( CGAL::object_cast<K::Segment_2>(&o)->source().hx(), CGAL::object_cast<K::Segment_2>(&o)->source().hy() );
                glVertex2i( CGAL::object_cast<K::Segment_2>(&o)->target().hx(), CGAL::object_cast<K::Segment_2>(&o)->target().hy() );
                glEnd();
            }
            else if (CGAL::object_cast<K::Ray_2>(&o))//如果这条边是射线,则绘制射线
            {
                glBegin(GL_LINES);
                glVertex2i( CGAL::object_cast<K::Ray_2>(&o)->source().hx(), CGAL::object_cast<K::Ray_2>(&o)->source().hy() );
                glVertex2i( CGAL::object_cast<K::Ray_2>(&o)->point(1).hx(), CGAL::object_cast<K::Ray_2>(&o)->point(1).hy() );
                glEnd();
            }
        }
        glDisable( GL_LINE_STIPPLE );//关闭点画模式
    glPopMatrix();
    glutSwapBuffers();
}
void display(void)
{}
void init(void)
{
    //初始化绘制环境
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);
}
void reshape(int w, int h)
{
    global_w = w;
    global_h = h;
    glViewport (0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, 0, h, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void mouse(int button, int state, int x, int y)
{   //定义鼠标事件
    if ( button == GLUT_LEFT_BUTTON && state == GLUT_UP )
    {
        points_add_point(x,y);
        points_draw();
    }
    if ( button == GLUT_RIGHT_BUTTON && state == GLUT_UP )
        points_triangulation();
}
void read_file()//从文件中读入点集数据,调试时所使用
{
    //文件读取
    FILE* f;
    f = freopen( "data.txt", "r", stdin );

    int a,b;
    while(std::cin>>a >> b)
    {
        vertices.push_back( Point( a, b ) );
    }
    fclose(f);
}
int main(int argc, char** argv)
{
    //初始化配置环境
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize (800, 600);
    glutInitWindowPosition (100, 100);
    glutCreateWindow ("Delaunay+Voronoi");
    init ();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMainLoop();
    return 0;
}

文章来源地址https://www.toymoban.com/news/detail-513806.html

到了这里,关于一些CGAL基础操作的任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloudAlibaba Gateway(二)详解-内置Predicate、Filter及自定义Predicate、Filter

    ​ Predicate(断言),用于进行判断,如果返回为真,才会路由到具体服务。SpirnngCloudGateway由路由断言工厂实现,直接配置即生效,当然也支持自定义路由断言工厂。 ​ SpringCloudGateway路由断言工厂实现有很多,可以帮助开发者完成不同的功能。 AfterRoutePredicateFactory :设定日期参

    2024年02月10日
    浏览(45)
  • CMake入门教程【基础篇】4.target_include_directories包含指定文件夹头文件

    target_include_directories包含指定文件夹头文件 target_include_directories() 指定目标包含的头文件路径  |-📁prj3   |-- 🎴CMakeLists.txt   |-📁include    |-- 📄Hello.h   |-📁src    |-- 📄Hello.cpp    |-- 📄main.cpp

    2023年04月09日
    浏览(35)
  • Java系列之Predicate

    Java8引入了许多函数式接口(Functional Interface),Predicate(断言)就是其中一个,它的主要作用可以简单描述为:向其传入一个对象(可以理解为参数),将得到一个布尔值作为输出。 Predicate接口的源码非常简单,如下所示,重点内容有: 所有的函数式接口都带有@FunctionalI

    2024年02月10日
    浏览(34)
  • Spring的定时任务不生效、不触发,一些可能导致定时任务没有生效的原因,和具体的解决方法。Spring框架的定时任务不生效或者不触发的原因

    1. 未开启定时任务 : 原因 :未在Spring Boot应用主类上添加 @EnableScheduling 注解或未在XML配置文件中配置定时任务的启用。 解决方法 :确保在应用的配置类上添加 @EnableScheduling 注解,启用定时任务。 2. 定时任务方法的访问权限问题 : 原因 :定时任务的方法可能被设置为私有

    2024年02月03日
    浏览(57)
  • ingress 路径配置中类型exact|prefix|ImplementationSpecific的区别以及配置

    Ingress 中 path 的类型有 trois 种: exact: 精确匹配路径。如 path: /foo,只匹配请求路径与之完全相同的 /foo。 prefix: 前缀匹配路径。如 path: /foo,匹配请求路径以 /foo 开始的所有路径,如 /foo、/foo/bar 等。 ImplementationSpecific: 特定 Ingress controller 的匹配方式。如 Nginx Ingress controller 忽略路径

    2024年02月15日
    浏览(39)
  • CGAL::2D Arrangements-7

    7 几何Traits 几何Traits封装了几何实体的定义以及处理这些几何实体的几何predicates和构造的实现,供Arrangement_on_surface_2类模板和其他周边模块使用。应用于Arrangement的各种算法所确定的最小要求被组织在精细几何特征概念的层次中。每个概念列出的需求只包括实现特定算法所需

    2024年02月22日
    浏览(40)
  • CGAL 网格整形平滑

    网格整形:该过程是使表面光滑的过程,通常通过最小化整形函数来进行实现,该函数本质上仍是一种对端点加权的函数,所选顶点的点被重新定位以产生尽可能光滑的表面补丁,这个过程主要是基于求解具有边界约束的线性双拉普拉斯系统,如参考文献[1]中所述。

    2024年01月20日
    浏览(35)
  • CGAL 求取曲线交点

    假设 C = C 1 , C 2 , … , C n C={C_1,C_2,…

    2024年02月11日
    浏览(34)
  • flink checkpoint时exact-one模式和atleastone模式的区别

    flink在开启checkpoint的时候有两种模式可以选择,exact-one和atleastone模式,那么这两种模式有什么区别呢? 先说结论:exact-one可以完全做到状态的一致性,而atleastone模式正常情况下没法做到状态的一致性,如果开启这个模式,有些消息会重复处理,例如统计计数时,重复的消息

    2024年02月11日
    浏览(38)
  • Gateway网关路由以及predicates用法(项目中使用场景)

    1.Gateway+nacos整合微服务 服务注册在nacos上,通过Gateway路由网关配置统一路由访问 这里主要通过yml方式说明: route:     config:     #type:database nacos yml     data-type: yml     group: DEFAULT_GROUP     data-id: jeecg-gateway-router 配置路由:   通过断言里Path地址访问到对应的system-service服务

    2024年02月12日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包