坐标系的问题

时间:2023-01-25 23:22:43
我在做一个绘图程序,用TranslateTransform改变坐标系来旋转图形,代码大致如下:
XFORM xform;
int   nMode   =   SetGraphicsMode(pDC->m_hDC,   GM_ADVANCED); 

m_angle = GetAngleToXAxis(m_PointOld,m_centerPt) - GetAngleToXAxis(m_PointOrigin,m_centerPt);//旋转角度
xform.eM11 = (float)cos(m_angle); 
xform.eM12 = (float)sin(m_angle); 
xform.eM21 = (float)-sin(m_angle); 
xform.eM22 = (float)cos(m_angle); 
xform.eDx = (float)(m_centerPt.x - cos(m_angle)*m_centerPt.x + sin(m_angle)*m_centerPt.y); 
xform.eDy = (float)(m_centerPt.y - cos(m_angle)*m_centerPt.y - sin(m_angle)*m_centerPt.x); 

SetWorldTransform(pDC->m_hDC,   &xform); 
pDC->Rectangle(tmpRect);
SetGraphicsMode(pDC->m_hDC,nMode);

现在的问题是,旋转完后,还可以继续编辑图形,就类似WORD里面画图似的,旋转完后还可以拖动、改变图形形状之类的。
但是我在图形旋转后再编辑图形的时候弄不对,怎么能实现上面所说的。
我的想法是把坐标系偏转m_angle角度后,就像之前正坐标那样操作,不过总有问题。

14 个解决方案

#1


应该是你旋转后只不过是显示效果上看到的,而真正的数据并没有旋转,也就是说你在编辑旋转后的某一点时其实在真正的数据上还是旋转前这个位置上的那一点,不知道我说的对不对

#2


其实你应该把内部的图像数据进行旋转处理,而不是图像显示效果上进行旋转

#3


引用 1 楼 stonewater 的回复:
应该是你旋转后只不过是显示效果上看到的,而真正的数据并没有旋转,也就是说你在编辑旋转后的某一点时其实在真正的数据上还是旋转前这个位置上的那一点,不知道我说的对不对

对,就是,我就是实际上数据还是正坐标上的那个数据,因为旋转了坐标系,看上去坐标旋转了,其实是相对静止,没变。
我就想着只通过改变坐标系来实现这个事情,不知道可不可以。

#4


引用 2 楼 stonewater 的回复:
其实你应该把内部的图像数据进行旋转处理,而不是图像显示效果上进行旋转

怎么把内部的图像数据进行旋转处理? 画过的每一个坐标都要记录吗,我做折线之类的是记录下关键点的坐标,然后计算旋转角度后的坐标,然后moveto、lineto。可是画矩形、椭圆什么的,记录左上、右下点,计算旋转后坐标位置,画出来的还是正的,只是形状变了,图形并没有旋转。这种图形要记录数据进行旋转处理的话,是不是要把画过的坐标都记录下来,然后旋转处理,之后绘制出来。不过要怎么记录

#5


既然都是些点,那旋转的时候就把点的坐标做旋转就可以了
像矩形什么的要记录四个角的点,画的时候就不要用矩形函数就用lineto就行了

#6


引用 5 楼 stonewater 的回复:
既然都是些点,那旋转的时候就把点的坐标做旋转就可以了
像矩形什么的要记录四个角的点,画的时候就不要用矩形函数就用lineto就行了

还有圆角矩形、弧线等等其它的图形,都这么画太麻烦了,而且有的也不是lineto就行的

#7


up~~

#8


LZ想着在不改变原始图像的情况,通过旋转坐标系来使图像旋转也并非不可以。
一个二维图形绕着中心旋转一个角度γ,可以理解为坐标系绕中心旋转一个角度-γ。
这样处理,显示是没问题了,但是要在显示的结果再做修改,比如移动顶点之类的操作,需要通过一个逆矩阵处理返回到原始的图像上的变化。
也就是说某点的改变,需要通过坐标轴旋转一个角度γ的反向变换映射到原始的图形上。
LZ能想通这个反向映射,这个问题就可以解决了。

#9


你旋转完后,要将坐标系恢复到原来的设置,绘制矩形的代码后面加上再试试。
xform.eM11 = (float)1.0; 
xform.eM12 = (float)0;
xform.eM21 = (float)0;
xform.eM22 = (float)1.0;
xform.eDx = (float)0;
xform.eDy = (float)0;
        
SetWorldTransform(hdc, &xform);

#10


引用 3 楼 ryanbanks 的回复:
引用 1 楼 stonewater 的回复:
应该是你旋转后只不过是显示效果上看到的,而真正的数据并没有旋转,也就是说你在编辑旋转后的某一点时其实在真正的数据上还是旋转前这个位置上的那一点,不知道我说的对不对

对,就是,我就是实际上数据还是正坐标上的那个数据,因为旋转了坐标系,看上去坐标旋转了,其实是相对静止,没变。
我就想着只通过改变坐标系来实现这个事情,不知道可不可以。



不建议,对于“旋转 编辑操作”还是老老实实变换原数据。对于“旋转显示”,你就可以用上面你的方法。

#11


引用 8 楼 beyond071 的回复:
LZ想着在不改变原始图像的情况,通过旋转坐标系来使图像旋转也并非不可以。
一个二维图形绕着中心旋转一个角度γ,可以理解为坐标系绕中心旋转一个角度-γ。
这样处理,显示是没问题了,但是要在显示的结果再做修改,比如移动顶点之类的操作,需要通过一个逆矩阵处理返回到原始的图像上的变化。
也就是说某点的改变,需要通过坐标轴旋转一个角度γ的反向变换映射到原始的图形上。
LZ能想通这个反向映射,这个问题……

嗯,昨天我后来想了想是想把捕获的鼠标的点倒推回正坐标时候应在的位置,这样解决方便很多,我试了试也是可以的。这样处理一个简单的数据比处理描述图形的那一堆数据要方便很多。

#12


可以参考图形学里,将你的2D向量,根据你的旋转生成的旋转矩阵,进行处理,再对处理后的2D向量组成的图元进行绘制显示,这样实际数据跟你的显示结果都一致了

#13


受教了!

#14


内存中再复制一份图出来   在复制出来的新图上 随意改变

#1


应该是你旋转后只不过是显示效果上看到的,而真正的数据并没有旋转,也就是说你在编辑旋转后的某一点时其实在真正的数据上还是旋转前这个位置上的那一点,不知道我说的对不对

#2


其实你应该把内部的图像数据进行旋转处理,而不是图像显示效果上进行旋转

#3


引用 1 楼 stonewater 的回复:
应该是你旋转后只不过是显示效果上看到的,而真正的数据并没有旋转,也就是说你在编辑旋转后的某一点时其实在真正的数据上还是旋转前这个位置上的那一点,不知道我说的对不对

对,就是,我就是实际上数据还是正坐标上的那个数据,因为旋转了坐标系,看上去坐标旋转了,其实是相对静止,没变。
我就想着只通过改变坐标系来实现这个事情,不知道可不可以。

#4


引用 2 楼 stonewater 的回复:
其实你应该把内部的图像数据进行旋转处理,而不是图像显示效果上进行旋转

怎么把内部的图像数据进行旋转处理? 画过的每一个坐标都要记录吗,我做折线之类的是记录下关键点的坐标,然后计算旋转角度后的坐标,然后moveto、lineto。可是画矩形、椭圆什么的,记录左上、右下点,计算旋转后坐标位置,画出来的还是正的,只是形状变了,图形并没有旋转。这种图形要记录数据进行旋转处理的话,是不是要把画过的坐标都记录下来,然后旋转处理,之后绘制出来。不过要怎么记录

#5


既然都是些点,那旋转的时候就把点的坐标做旋转就可以了
像矩形什么的要记录四个角的点,画的时候就不要用矩形函数就用lineto就行了

#6


引用 5 楼 stonewater 的回复:
既然都是些点,那旋转的时候就把点的坐标做旋转就可以了
像矩形什么的要记录四个角的点,画的时候就不要用矩形函数就用lineto就行了

还有圆角矩形、弧线等等其它的图形,都这么画太麻烦了,而且有的也不是lineto就行的

#7


up~~

#8


LZ想着在不改变原始图像的情况,通过旋转坐标系来使图像旋转也并非不可以。
一个二维图形绕着中心旋转一个角度γ,可以理解为坐标系绕中心旋转一个角度-γ。
这样处理,显示是没问题了,但是要在显示的结果再做修改,比如移动顶点之类的操作,需要通过一个逆矩阵处理返回到原始的图像上的变化。
也就是说某点的改变,需要通过坐标轴旋转一个角度γ的反向变换映射到原始的图形上。
LZ能想通这个反向映射,这个问题就可以解决了。

#9


你旋转完后,要将坐标系恢复到原来的设置,绘制矩形的代码后面加上再试试。
xform.eM11 = (float)1.0; 
xform.eM12 = (float)0;
xform.eM21 = (float)0;
xform.eM22 = (float)1.0;
xform.eDx = (float)0;
xform.eDy = (float)0;
        
SetWorldTransform(hdc, &xform);

#10


引用 3 楼 ryanbanks 的回复:
引用 1 楼 stonewater 的回复:
应该是你旋转后只不过是显示效果上看到的,而真正的数据并没有旋转,也就是说你在编辑旋转后的某一点时其实在真正的数据上还是旋转前这个位置上的那一点,不知道我说的对不对

对,就是,我就是实际上数据还是正坐标上的那个数据,因为旋转了坐标系,看上去坐标旋转了,其实是相对静止,没变。
我就想着只通过改变坐标系来实现这个事情,不知道可不可以。



不建议,对于“旋转 编辑操作”还是老老实实变换原数据。对于“旋转显示”,你就可以用上面你的方法。

#11


引用 8 楼 beyond071 的回复:
LZ想着在不改变原始图像的情况,通过旋转坐标系来使图像旋转也并非不可以。
一个二维图形绕着中心旋转一个角度γ,可以理解为坐标系绕中心旋转一个角度-γ。
这样处理,显示是没问题了,但是要在显示的结果再做修改,比如移动顶点之类的操作,需要通过一个逆矩阵处理返回到原始的图像上的变化。
也就是说某点的改变,需要通过坐标轴旋转一个角度γ的反向变换映射到原始的图形上。
LZ能想通这个反向映射,这个问题……

嗯,昨天我后来想了想是想把捕获的鼠标的点倒推回正坐标时候应在的位置,这样解决方便很多,我试了试也是可以的。这样处理一个简单的数据比处理描述图形的那一堆数据要方便很多。

#12


可以参考图形学里,将你的2D向量,根据你的旋转生成的旋转矩阵,进行处理,再对处理后的2D向量组成的图元进行绘制显示,这样实际数据跟你的显示结果都一致了

#13


受教了!

#14


内存中再复制一份图出来   在复制出来的新图上 随意改变