本文整理汇总了C++中ConvexHull::call方法的典型用法代码示例。如果您正苦于以下问题:C++ ConvexHull::call方法的具体用法?C++ ConvexHull::call怎么用?C++ ConvexHull::call使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConvexHull
的用法示例。
在下文中一共展示了ConvexHull::call方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: reassembleDrawings
//TODO: Regard some kind of aspect ration (input)
//(then also the rotation of a single component makes sense)
void ComponentSplitterLayout::reassembleDrawings(GraphAttributes& GA, const Array<List<node> > &nodesInCC)
{
int numberOfComponents = nodesInCC.size();
Array<IPoint> box;
Array<IPoint> offset;
Array<DPoint> oldOffset;
Array<double> rotation;
ConvexHull CH;
// rotate components and create bounding rectangles
//iterate through all components and compute convex hull
for (int j = 0; j < numberOfComponents; j++)
{
//todo: should not use std::vector, but in order not
//to have to change all interfaces, we do it anyway
std::vector<DPoint> points;
//collect node positions and at the same time center average
// at origin
double avg_x = 0.0;
double avg_y = 0.0;
for (node v : nodesInCC[j])
{
DPoint dp(GA.x(v), GA.y(v));
avg_x += dp.m_x;
avg_y += dp.m_y;
points.push_back(dp);
}
avg_x /= nodesInCC[j].size();
avg_y /= nodesInCC[j].size();
//adapt positions to origin
int count = 0;
//assume same order of vertices and positions
for (node v : nodesInCC[j])
{
//TODO: I am not sure if we need to update both
GA.x(v) = GA.x(v) - avg_x;
GA.y(v) = GA.y(v) - avg_y;
points.at(count).m_x -= avg_x;
points.at(count).m_y -= avg_y;
count++;
}
// calculate convex hull
DPolygon hull = CH.call(points);
double best_area = numeric_limits<double>::max();
DPoint best_normal;
double best_width = 0.0;
double best_height = 0.0;
// find best rotation by using every face as rectangle border once.
for (DPolygon::iterator j = hull.begin(); j != hull.end(); ++j) {
DPolygon::iterator k = hull.cyclicSucc(j);
double dist = 0.0;
DPoint norm = CH.calcNormal(*k, *j);
for (const DPoint &z : hull) {
double d = CH.leftOfLine(norm, z, *k);
if (d > dist) {
dist = d;
}
}
double left = 0.0;
double right = 0.0;
norm = CH.calcNormal(DPoint(0, 0), norm);
for (const DPoint &z : hull) {
double d = CH.leftOfLine(norm, z, *k);
if (d > left) {
left = d;
}
else if (d < right) {
right = d;
}
}
double width = left - right;
dist = max(dist, 1.0);
width = max(width, 1.0);
double area = dist * width;
if (area <= best_area) {
best_height = dist;
best_width = width;
best_area = area;
best_normal = CH.calcNormal(*k, *j);
}
}
if (hull.size() <= 1) {
best_height = 1.0;
best_width = 1.0;
//.........这里部分代码省略.........