首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGAL:线上点?

CGAL:线上点?
EN

Stack Overflow用户
提问于 2014-05-29 16:27:02
回答 1查看 449关注 0票数 1

我在CGAL遇到了一件奇怪的事。我有一条线和一个应该在这条线上的点。这段代码

代码语言:javascript
复制
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;

int main( ) {
  CGAL::Line_2<Kernel> l(0.2, 1.0, -1.4);

  std::cout << l.has_on(CGAL::Point_2<Kernel>(-3.0, 2.0)) << std::endl;
  std::cout << l.y_at_x(-3.0).exact() << std::endl;

  return 0;
}

生产产出:

代码语言:javascript
复制
0
36028797018963967/18014398509481984

好吧,也许Exact_predicates_exact_constructions_kernel不够好.(为什么?)

我尝试使用用CGAL::Quotient定义的内核,而不是:

代码语言:javascript
复制
typedef CGAL::Quotient<CGAL::MP_Float> NT;
typedef CGAL::Cartesian<NT> Kernel;

int main( ) {
  CGAL::Line_2<Kernel> l(0.2, 1.0, -1.4);

  std::cout << l.has_on(CGAL::Point_2<Kernel>(-3.0, 2.0)) << std::endl;
  std::cout << l.y_at_x(-3.0) << std::endl;

  return 0;
}

结果对我来说更加神秘:

代码语言:javascript
复制
0
2/1

我是遗漏了什么还是它是个虫子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-29 17:35:20

当您从0.2构造这条线时,会发生两个转换。编译器将字符串"0.2“转换为”双“。然后,这个双值被转换为内核的数字类型(在本例中是一个精确的rational )。

问题是,0.2的转换不是精确的,因为0.2是一个不能用浮点值表示的理性,所以引入了一些不精确的地方。CGAL对此无能为力。

如果您需要精确地表示0.2,则需要使用以下内容:

代码语言:javascript
复制
  CGAL::Line_2<Kernel> l(NT(2)/NT(10), 1.0, NT(-14)/NT(10));

或者,把你的问题放大成10次方,这样你所有的坐标都变成整数。

也有可能有些有理数类型能够直接从表示有理数的字符串构造,而不带任何舍入,但我认为CGAL::Quotient<MP_Float>不能。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23938162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档