gpt4 book ai didi

c++ - 按点坐标旋转点 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:08 28 4
gpt4 key购买 nike

是否有一种简单的方法来移动存储在 cv::vector<cv::Point> 中的一组点?由 cv::Point 定义的数量?类似于 std::rotate,但仅适用于点的一个坐标。它应该考虑 vector 的大小。

例如,

[1,0],[0,1],[1,2],[2,3][0,2] 移动至 [1,2],[0,3],[1,0],[2,1]

我能想到的唯一方法是使用 for 循环手动完成。

最佳答案

您可以:

  1. 创建一个 Mat来自 vector<Point> .它将是一个 2 channel 矩阵,Nx1
  2. reshape 使其成为 1 channel 矩阵,Nx2
  3. 获取包含 x 和 y 坐标的列
  4. 使用 MatIterator 在该列上使用旋转

请注意 Mat没有反向迭代器(实现 旋转),因此,当 shift 为负时,您应该添加 vector<Point> 的大小到类次并使用旋转。

你主要是在玩弄矩阵头,所以数据不会被复制。

代码如下:

#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
vector<Point> pts = { Point(1, 0), Point(0, 1), Point(1, 2), Point(2, 3) };
Point shift(0,2);

for (const Point& p : pts) { cout << "[" << p.x << ", " << p.y << "] "; } cout << endl;

// [1, 0] [0, 1] [1, 2] [2, 3]

// ----------------------------

Mat mpts(pts);
Mat xy = mpts.reshape(1);
Mat x = xy.col(0);
Mat y = xy.col(1);

if (shift.x < 0)
shift.x += pts.size();

std::rotate(x.begin<Point::value_type>(), x.begin<Point::value_type>() + shift.x, x.end<Point::value_type>());

if (shift.y < 0)
shift.y += pts.size();

std::rotate(y.begin<Point::value_type>(), y.begin<Point::value_type>() + shift.y, y.end<Point::value_type>());

// ----------------------------

for (const Point& p : pts) { cout << "[" << p.x << ", " << p.y << "] "; } cout << endl;

// [1, 2] [0, 3] [1, 0] [2, 1]

return 0;
}

关于c++ - 按点坐标旋转点 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31987260/

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