图形学的旋转算法及演示程序
easyx吧
全部回复
仅看楼主
level 12
yangw80 楼主
先粘贴一段网上找的理论计算部分:
二维旋转变换:图形相对坐标原点的旋转如图所示,它产生图形位置和方向的变动。新图形p'的每个图元点是原图形p每个图元点保持离坐标原点距离不变并绕原点旋转θ角产生的,并以逆时针方向旋转为正角度,对应图元点的坐标值满足关系式:
x'=xcosθ-ysinθ
y'=xsinθ+ycosθ
用矩阵形式简记为P'=P·R,其中R是旋转变换矩阵:
在齐次坐标系中的比例变换矩阵形式是:

2013年01月13日 17点01分 1
level 12
yangw80 楼主
刚刚写了一个演示程序,凑合看吧:
///////////////////////////////////
// 程序名称:旋转演示
//
// 旋转公式: x'=xcosθ-ysinθ
// y'=xsinθ+ycosθ
//
#include <graphics.h>
#include <conio.h>
#include <math.h>
void main()
{
initgraph(640, 480);
setorigin(320, 240);
// 旋转前的点
POINT pSrc[4] = {{-100, -50}, {200, -50}, {200, 90}, {-100, 90}};
// 旋转后的点
POINT pDst[4];
// 循环变量
int i;
for(double pi = 0; pi < 6.28; pi += 0.01)
{
cleardevice();
for(i = 0; i < 4; i++)
{
pDst[i].x = int(pSrc[i].x * cos(pi) - pSrc[i].y * sin(pi));
pDst[i].y = int(pSrc[i].x * sin(pi) + pSrc[i].y * cos(pi));
}
moveto(pDst[3].x, pDst[3].y);
for(i = 0; i < 4; i++)
lineto(pDst[i].x, pDst[i].y);
Sleep(20);
}
getch();
closegraph();
}
2013年01月13日 17点01分 2
@SITH19901002 为什么头文件graphics.h打不开
2015年05月11日 11点05分
回复
����
:我是在VS2013上运行
2015年05月11日 11点05分
POINT pSrc[4] = {{-100, -50}, {200, -50}, {200, 90}, {-100, 90}}; // 旋转后的点 POINT pDst[4];我运行时是错的,怎么办
2015年07月10日 05点07分
为什么要小于6,28??[疑问]
2015年07月28日 18点07分
level 7
运行的效果不错诶~先顶下,再慢慢学习~~
2013年01月13日 17点01分 3
POINT pSrc[4] = {{-100, -50}, {200, -50}, {200, 90}, {-100, 90}}; // 旋转后的点 POINT pDst[4];能帮我解释一下吗?c中运行是错的
2015年07月10日 06点07分
回复
˼��Ľ��
: 前面加一句 typedef PP { int x; int y; } POINT;
2015年07月18日 14点07分
回复
���硤��
: typedef struct PP { int x; int y; } POINT;
2015年07月18日 14点07分
谢谢
2015年07月19日 05点07分
level 11
要是没有cleardevice();效果更欢喜~~
2013年01月14日 07点01分 4
level 11
参数对应: 左上角四个元素,旋转,对称,错切,
最右边一列的上方两个元素,投影(透视)
最下方一行左边两个元素,平移
右下角元素,整体伸缩变换.
2013年01月14日 07点01分 5
level 1
学习了 谢谢!
2015年05月10日 16点05分 6
level 12
问一下 操作显存的方法其他语言可以用吗?? java我没找到
2015年05月19日 08点05分 7
java是不可以直接操作内存的,但是应该会提供相应的库方法实现操作显存实现的功能。
2017年02月21日 14点02分
level 5
线性代数忘得差不多了
2015年07月22日 06点07分 8
level 7
搞个图片旋转一下,更帅
2017年02月21日 14点02分 10
level 8
为什么我用easyx的旋转函数这么慢。。。有什么办法么?
2017年02月23日 12点02分 11
都是三角函数运算吧?要加速,可以缓存运算结果。
2017年02月25日 17点02分
你看看是不是每次循环旋转弧度太小或者说Sleep时间长的原因。改一下pi+=0.01或者Sleep(20),
2017年02月26日 01点02分
回复
就是喜欢浪baby
:嗯,,不是这个原因。看来只能缓存图片了
2017年02月26日 03点02分
1