首页 > 其他分享 >使用CGAL计算直线和圆的交点

使用CGAL计算直线和圆的交点

时间:2023-10-17 17:15:08浏览次数:29  
标签:std 直线 typedef Kernel CGAL Point 交点 include

 

#include <vector>
#include <iostream>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Ray_2.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/intersections.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Vector_2 Vector_2;
typedef Kernel::Segment_2 Segment_2;

typedef Kernel::Circle_2 Circle_2;

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Line_2 Line_2;

std::vector<Point_2> lineCircleIntersect(const Point_2 &p1, const Point_2 &p2, const Point_2 &circle_origin, double circle_radius)
{
    std::vector<Point_2> points_out;
    Line_2 line(p1, p2);
    std::cout << "直线: " << line << std::endl;

    auto result = CGAL::intersection(line, Line_2(circle_origin, circle_origin + (p2 - p1).perpendicular(CGAL::LEFT_TURN)));
    const Point_2 *point_intersect = boost::get<Point_2>(&*result); // Output the intersection point
    std::cout << "垂线和直线的交点: " << *point_intersect << std::endl;
    Segment_2 seg(p1, p2);
    auto seg_len = CGAL::approximate_sqrt(seg.squared_length());
    std::cout << "线段长度: " << seg_len << std::endl;

    Vector_2 unit_vector  = (p2 - p1) / seg_len;
    std::cout << "直线单位向量: " <<  unit_vector<< std::endl;

    auto distance = (*point_intersect - circle_origin).squared_length();
    std::cout << "圆心到直线的平方距离: " <<  distance<< std::endl;

    if (distance >  CGAL::square(circle_radius)) {
        std::cout << "没有交点" << std::endl;
        return points_out;
    }

    // bool is_on_line = line.has_on(circle_origin); // 圆心在直线上
    // if (is_on_line)
    // {
    //     std::cout << "圆心在直线上" << std::endl;

    //     points_out.push_back(circle_origin + unit_vector * circle_radius);
    //     points_out.push_back(circle_origin - unit_vector * circle_radius);
    //     return points_out;
    // }

    // 直线和圆相切
    if ((*point_intersect - circle_origin).squared_length() == CGAL::square(circle_radius))
    {
        std::cout << "相切,一个点" << std::endl;
        points_out.push_back(*point_intersect);

        return points_out;
    }
    else
    {
        std::cout << "两个点" << std::endl;
        auto len_on_line =  CGAL::square(circle_radius) - CGAL::square(distance);
        std::cout << "直线上的截线段长度平方:" << len_on_line<< std::endl;
        points_out.push_back(*point_intersect + unit_vector * CGAL::approximate_sqrt(len_on_line));
        points_out.push_back(*point_intersect - unit_vector * CGAL::approximate_sqrt( len_on_line));

        return points_out;
    }
}

int main()
{
    // Point_2 start_point(-1, -1);
    // Point_2 end_point(1, -1);
    // Point_2 circle_origin(0, 0);
    // double radius = 2;

    // Point_2 start_point(-1, 0);
    // Point_2 end_point(1, 0);
    // Point_2 circle_origin(0, 0);
    // double radius = 1;

    Point_2 start_point(-1, -1);
    Point_2 end_point(1, -1);
    Point_2 circle_origin(0, 0);
    double radius = 1;

    // Point_2 start_point(-1, -2);
    // Point_2 end_point(1, -2);
    // Point_2 circle_origin(0, 0);
    // double radius = 1;

    auto points = lineCircleIntersect(start_point, end_point, circle_origin, radius);
    std::cout << "points: "<< std::endl;
    for (auto p : points)
    {
        std::cout << p << std::endl;
    }

    return 0;
}

// clang++ main.cpp -lgmp -lmpfr

 

标签:std,直线,typedef,Kernel,CGAL,Point,交点,include
From: https://www.cnblogs.com/itfanr/p/17770152.html

相关文章

  • 谈谈"求线段交点"的几种算法(js实现,完整版)
    谈谈"求线段交点"的几种算法(js实现,完整版)"求线段交点"是一种非常基础的几何计算,在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法说一说,希望对大家有所帮助. 本文讲的内容都很初级,主要是面向和我一样的初学者,所以请各位算法帝......
  • C# 点到直线的垂直距离
    privatevoidbtnShortLen_Click(objectsender,EventArgse){System.Diagnostics.Stopwatchsw0=newSystem.Diagnostics.Stopwatch();sw0.Start();inti=0;while(i<100000){......
  • 直线模组的应用场景
    直线模组是一种由直线导轨、滑块、驱动部件等组成的直线运动系统,具有高精度、高速度、高效率等特点。直线模组被广泛应用于各种机械设备中,以下是其主要的应用场景:1、数控机床:直线模组是数控机床中的重要组成部分,用于实现工件的直线运动。直线模组的高精度和高速度特性,能够提高数控......
  • 直线导轨坏了可以维修吗?
    直线导轨是工业自动化设备中常用的零部件,其性能和使用寿命对设备的稳定运行和产能有着直接的影响,在生产中,由于各种原因,直线导轨会出现各种问题,那么,直线导轨的维修方法究竟是怎样的呢?我们一起来看看!1、磨损修复:直线导轨因长期使用或其它因素可能导致磨损,可以通过磨削、镀铬等方法进......
  • AutoCAD VBNET 曲线求交点
    曲线求取点,利用几何库<CommandMethod(NameOf(TT_PolyLineCrossCheck))>PublicSubTT_PolyLineCrossCheck()DimdocAsDocument=Application.DocumentManager.MdiActiveDocumentDimdbAsDatabase=doc.DatabaseDimedAsEditor=doc.Editor'......
  • 【230927-5】已知F是双曲线的左焦点,过F作垂直于x轴的直线交该曲线的一条渐近线于M,若|F
    ......
  • 直线模组的品牌有哪些?
    中国工业制造业快速发展,工业自动化领域也进入了飞速发展的阶段,直线模组作为工业自动化领域不可缺少的机器人之一,有着重要的不可或缺的作用,在行业内做得好的直线模组品牌有哪些呢?1、NSK:日本精工株式会社(NSKLTD.)是一家全球知名的轴承、滚珠螺杆和直线导轨制造商。他们的直线模组产品......
  • 十大直线导轨品牌
    在现如今的制造业领域中,直线导轨作为重要的传动元件,广泛应用于各种机械装置中,以下是十个在直线导轨领域具有优秀表现的品牌,我们一起来看看:1、日本THK,致力于开发、生产并且销售LM滚动导轨、滚珠花键、滚珠丝杆、电动智能组合单元等在内的机械原件。LM滚动导轨使开发高精度、高刚性、......
  • 直线模组怎么搭配电机?
    直线模组在行业中主要做的是替代人工完成部分简单的操作,作为一款直线运动的设备,直线模组同样需要驱动设备去进行驱动,来完成整个模组的运转。电机作为直线模组主要驱动设备,相信熟悉这个行业的人都清楚,而选择不同的电机作为直线模组的驱动设备,同样会影响到直线模组的精度、负载、速度......
  • 【230919-4】已知双曲线x^2/a^2-y^2/b^2=1(a>0,b>0)的一条渐近线与直线x+3y+1=0垂直,则
    ......