使用指针简化我在C ++中的代码

时间:2013-11-25 20:34:16

标签: c++ pointers reference

这是我的代码:

    void spin(double angle) {

    // Convert degrees to radians
    angle = get_radians(angle);

    vector<complex<double>> coordinate_list;
    coordinate_list.push_back(co1);
    coordinate_list.push_back(co2);
    coordinate_list.push_back(co3);
    coordinate_list.push_back(co4);

    // Origin point
    complex<double> origin(0,0);

    for (int i = 0; i < coordinate_list.size(); ++i)
    {
        complex<double> current = coordinate_list[i];
        double x = current.real();
        double y = current.imag();

        // Assuming all rectangles origins are at (0,0)
        float temp_x = origin.real() - x;
        float temp_y = origin.imag() - y;

        x = round(temp_x * cos(angle) - temp_y * sin(angle));
        y = round(temp_x * sin(angle) + temp_y * cos(angle));

        complex<double> rotated(x,y);
        coordinate_list[i] = rotated;
    }

    co1 = coordinate_list[0];
    co2 = coordinate_list[1];
    co3 = coordinate_list[2];
    co4 = coordinate_list[3];
    }

我正在寻找一种方法来避免循环后的部分。我已经有了co1-4值,可以在任何点调用此方法来旋转坐标。我宁愿直接访问这些值,而不是将它们粘贴在列表中,更改它们,然后将它们分配回来。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:3)

使用指针和引用:

vector<complex<double> *> coordinate_list;
coordinate_list.push_back(&co1);
coordinate_list.push_back(&co2);
coordinate_list.push_back(&co3);
coordinate_list.push_back(&co4);

// Origin point
complex<double> origin(0,0);

for (int i = 0; i < coordinate_list.size(); ++i)
{
    complex<double> &current = *coordinate_list[i];
    ...
    complex<double> rotated(x,y);
    current = rotated;
}

答案 1 :(得分:2)

如何使用单独的函数而不是for循环:

void rotate(complex<double> &co)
{
    // rotate it in place
}

// then just do something like this
rotate(co1);
rotate(co2);
rotate(co3);
rotate(co4);

答案 2 :(得分:0)

更改矢量&lt; complex&lt; double&gt; &GT;到向量&lt; reference_wrapper&lt; complex&lt; double&gt; &GT; &GT;然后你不需要循环后的部分。其余代码将保持不变。