gpt4 book ai didi

computational-geometry - 检查给定点是否在圆的(无)有界边/边界上(CGAL)

转载 作者:行者123 更新时间:2023-12-04 16:11:03 26 4
gpt4 key购买 nike

我正在使用 Kernel::Circle_2 和 CGAL::Arr_circle_segment_traits_2。

给定一个点(这组特征的嵌套类型 Point_2),我想检查它是在有界边、无界边还是在给定圆的边界上。

Circle_2 类有一个叫做 bounded_side 的函数,但它只支持 Kernel::Point_2 的点。当我使用 CGAL::to_double() 将点转换为此类时,我失去了准确性。

还有其他方法可以执行此检查吗?
如果有帮助,我会将信息存储在 2D_Arrangement 中。

最佳答案

您可以使用以下代码。请注意,二维点的坐标类型为 Sqrt_extension .

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

typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef CGAL::Arr_circle_segment_traits_2<K> Traits;
typedef Traits::Point_2::CoordNT Sqrt_extension;

CGAL::Bounded_side
incircle(const typename K::Circle_2& circle,
const typename Traits::Point_2& p)
{
const K::Point_2& center = circle.center();
K::FT sq_rad = circle.squared_radius();

switch(CGAL::compare( CGAL::square(p.x()-center.x())-sq_rad,
-CGAL::square(p.y()-center.y()) ) )
{
case CGAL::LARGER:
return CGAL::ON_UNBOUNDED_SIDE;
case CGAL::SMALLER:
return CGAL::ON_BOUNDED_SIDE;
case CGAL::EQUAL:
break;
}
return CGAL::ON_BOUNDARY;
}

int main()
{

K::Circle_2 circle(K::Point_2(0,0), 2);

Traits::Point_2 out(Sqrt_extension(1,2,3) , Sqrt_extension(4,5,6));
CGAL_assertion( incircle(circle, out) == CGAL::ON_UNBOUNDED_SIDE );

Traits::Point_2 in(Sqrt_extension(1) , Sqrt_extension(0));
CGAL_assertion( incircle(circle, in) == CGAL::ON_BOUNDED_SIDE );

Traits::Point_2 bnd(Sqrt_extension(0,1,2) , Sqrt_extension(0));
CGAL_assertion( incircle(circle, bnd) == CGAL::ON_BOUNDARY );

return 0;
}

关于computational-geometry - 检查给定点是否在圆的(无)有界边/边界上(CGAL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41438756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com