【发布时间】:2016-05-18 20:55:18
【问题描述】:
我的代码用于翻译,唯一的问题是我似乎无法将其居中。 我试过做 “translate = translate * center” 并且它看起来像移动到右上角。我不确定我还能做什么。我知道我的矩阵函数工作正常,我在这里缺少什么?
oid viewContext::calculate() {
std::cout << "calculate" << std::endl;
/*
* reinitialize these values
*/
translated.clear();
translated[0][0] = 1;
translated[1][1] = 1;
translated[2][2] = 1;
//translated = translated * center;
//if translate is called
if (whichMethod == trans) {
translated = translated * center;
translated = translated * S;
translated = translated * T;
}
上面代码中的 if 语句是我正在尝试的,我知道它是不必要的。
matrix viewContext::model_to_device(const matrix& param) {
std::cout << "model to device" << std::endl;
//matrix hold_values = param;
matrix hold_values = translated * param;
return hold_values;
}
我的翻译、旋转等方法如下所示。好吧是以这种方式格式化的,他们在最后调用calculate()
void viewContext::rotator(double degree) {
std::cout << "Rotate" << std::endl;
double theta = ((degree * M_PI) / 180);
R[0][0] = cos(theta);
R[0][1] = -1 * sin(theta);
R[1][0] = sin(theta);
R[1][1] = cos(theta);
calculate();
}
viewContext::viewContext() :
translated(3, 3), inverted(3, 3), center(3, 3), T(3, 3), S(3, 3), R(3,
3) {
//clear matrix just incase it isn't empty
//Should be empty but this is precautionary
translated.clear();
inverted.clear();
/*
* Constant values
* echelon form
*/
T[0][0] = 1;
T[1][1] = 1;
T[2][2] = 1;
/*
* Constant values
* 300 = x, 400 = y to put at origin.
*/
center[0][0] = 1;
center[0][2] = width;
center[1][1] = -1;
center[1][2] = height;
center[2][2] = 1;
/*
* Constant values
* Echelon form
*/
S[0][0] = 1;
S[1][1] = 1;
S[2][2] = 1;
//TODO
// /*
// * Constant values
// * Echelon form
// */
translated[0][0] = 1;
translated[1][1] = 1;
translated[2][2] = 1;
/*
* Constant values
* Echelon form
*/
R[0][0] = 1;
R[0][1] = 0;
R[1][0] = 0;
R[1][1] = 1;
R[2][2] = 1;
calculate();
}
这是我的构造函数的一部分,实现了中心。
private:
/* translation matrix */
matrix translated;
/* translation inverse matrix */
matrix inverted;
/* to center the image */
matrix center;
matrix T;
matrix S;
matrix R;
const int height = 300;
const int width = 400;
void calculate();
int whichMethod;
};
案例(KEY_U): std::cout 清除(); 派生->绘制(gc, &vContext); 休息;
我不确定我做错了什么。 我使用键盘进行翻译(向上、向下箭头键等等。左右) 这很好用,但由于我已经实现了中心部分,它会移动到右上角,然后开始翻译。我不完全确定出了什么问题。 任何帮助将不胜感激!
【问题讨论】:
-
您的问题并没有真正提供有关您在做什么的大量信息,但它看起来像是齐次坐标中平移和旋转的矩阵表示。你在哪里使用它们以及如何使用它们? OpenGL?请记住,使用矩阵时顺序很重要,所以
translated = center * S * T先应用 T,然后是 S,然后再计算中心,如果你稍后计算translated * coordinateVector -
@Anedar 对不起我的其他帖子,有些人写道我提供了太多信息。我在基于 linux 的虚拟机上。 center 是我的矩阵,其中包含您在代码中看到的内容。 T 包含转换后的坐标。 S 包括缩放坐标。我应该把这些代码部分也放在这里吗?但是,是的,我首先居中,然后缩放,然后翻译。我认为这是实施它的正确方法。有什么我想念的吗?
-
根据您发布的代码,
center、R和translated是矩阵。但什么是 S 和 T?你希望model_to_device()做什么?您应该提供与您的问题相关的所有信息 - 并且只提供相关信息。 -
@Anedar 每个具体的Shape都会使用ViewContext对象的变换方法将其局部模型坐标转换为设备坐标。 S 和 T 也是矩阵,它显示在靠近底部的代码部分。
-
@Anedar 我回复了你的回答,我相信你可能是对的,我绝对可以仔细检查。
标签: c++ graphics 2d computer-science transformation