学海网 文档下载 文档下载导航
设为首页 | 加入收藏
搜索 请输入内容:  
 导航当前位置: 文档下载 > 所有分类 > clipper库使用的一些心得

clipper库使用的一些心得

clipper库使⽤的⼀些⼼得

clipper

1. 版本号差异

之前project⾥⾯使⽤4.8.6,近期升级到最新版本号6.2.1。接⼝层⾯有点区别:

⽼版本号使⽤Polygon概念,最新版本号⽤Path取代了Polygon。对⽤的Polygons⽤Paths取代,Clipper::AddPath的时候还须要制定是否封闭。

2. 注意数据类型

⼀个測试,回字上半部分和下半部分,两半部分进⾏合并,可是输出结果总是不正确:

void transform_array_to_path(int* arr, int size, ClipperLib::Path& path, int scale = 1)

{

for (int i = 0; i < size; i += 2)

{

path.push_back(ClipperLib::IntPoint(arr[i] * scale, arr[i + 1] * scale));

}

}

void ClipperTest::merge_case()

{

using namespace ClipperLib;

Clipper union_worker;

Paths solution;

Path positive_path;

{

int points[] = { 1, 1, 1, 0, 2, 0, 2, 2, -2, 2, -2, 0, -1, 0, -1, 1 };

transform_array_to_path(points, sizeof(points) / sizeof(points[0]), positive_path, 10);

}

union_worker.AddPath(positive_path, ClipperLib::ptSubject, true);

Path negative_path;

{

int points[] = { 1, -1, 1, 0, 2, 0, 2, -2, -2, -2, -2, 0, -1, 0, -1, -1 };

transform_array_to_path(points, sizeof(points) / sizeof(points[0]), negative_path, 10);

}

union_worker.AddPath(negative_path, ClipperLib::ptClip, true);

union_worker.Execute(ClipperLib::ctUnion, solution, pftEvenOdd, pftEvenOdd);

for (int k = 0; k < solution.size(); k++)

{

Path& path = solution[k];

printf("[ %dth ] : ", k + 1);

for (int t = 0; t < path.size(); t++)

{

printf("%d,%d ", path[t].X, path[t].Y);

}

printf("\n");

}

}

合并后的结果输出:

// [1th] : -10, -1 - 10, -1 10, 0 10, 0

// [2th] : -20, -1 - 20, -1 20, 0 20, 0

结果百思不得其解,结果怎么是⼀个线段了。莫名其妙正确结果例如以下图。合并后是⼀个回字型。

不断地跟clipper⾃带的demo程序⽐对,最终发现了问题所在:问题出在Clipper内部的IntPoint,假设未定义宏use_int32。採⽤的是long long存储顶点XY值。⽽上⾯code中printf是%d。使⽤%lld或者cout 就没问题了。坑啊。。。

第1页

TOP相关主题

我要评论

相关文档

    站点地图 | 文档上传 | 侵权投诉 | 手机版
    新浪认证  诚信网站  绿色网站  可信网站   非经营性网站备案
    本站所有资源均来自互联网,本站只负责收集和整理,均不承担任何法律责任,如有侵权等其它行为请联系我们.
    文档下载 Copyright 2013 doc.xuehai.net All Rights Reserved.  email
    返回顶部