c++ 圆_2和光线_2相交

lnlaulya  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(137)

在CGAL库中有没有一种方法可以计算圆和射线的交点?文档中说在CGAL::intersection() (2D Circular Kernel)中有直线和圆的交点。但是直线没有方向,我必须添加一些额外的检查。有没有一种方便的方法可以计算这样的交点,而不需要额外的操作,以使这个例程更快?也许没有必要使用循环内核?

ubof19bj

ubof19bj1#

不,你不能在CGAL中计算圆和射线的交点(我不是CGAL开发人员,所以如果我错了,希望他们能纠正我)。
但是,您可以使用两种类型的内核(圆形和线性)检测圆和射线之间的交点。全局CGAL函数do_intersect计算圆心和射线之间的距离,然后将其与圆半径进行比较-因此它不需要计算实际交点。

#include <iostream>

#include <CGAL/Exact_circular_kernel_2.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>

using KernelC = CGAL::Exact_circular_kernel_2;
using PointC = KernelC::Point_2;
using CircleC = KernelC::Circle_2;
using RayC = KernelC::Ray_2;

using KernelL = CGAL::Exact_predicates_exact_constructions_kernel;
using PointL = KernelL::Point_2;
using CircleL = KernelL::Circle_2;
using RayL = KernelL::Ray_2;

int main()
{
  {
    CircleC c{PointC{0,0}, 1};
    RayC r{PointC{0, 0}, PointC{1, 1}};
    std::cout << CGAL::do_intersect(c, r) << std::endl;
  }
  {
    CircleL c{PointL{0,0}, 1};
    RayL r{PointL{0, 0}, PointL{1, 1}};
    std::cout << CGAL::do_intersect(c, r) << std::endl;
  }
}

如果你用intersection替换这里的do_intersect,然后编译,你会看到所有类型的组合,它们是允许相交的。

相关问题