C++实现二维坐标系的平移和旋转

有这样一个问题,平面内有一个点集,需要将坐标原点平移,到点集的某一点,然后在将坐标系旋转一定角度使得和点集中地另一个点重合。

坐标变换

坐标变换是空间实体的位置描述,是从一种坐标系统变换到另一种坐标系统的过程。通过建立两个坐标系统之间一一对应关系来实现。是各种比例尺地图测量和编绘中建立地图数学基础必不可少的步骤。两个及以上的坐标转换时由极坐标相对参照确定维数空间。

坐标变换共有五种分别是平移、倍变、旋转、切变、反射,除平移外均以坐标原点为基准点,即变换前后坐标原点不变。

平移:

当把原点 移到 时,平面上任一点 的旧坐标 及其新坐标 之间有下列关系:


其中(1)以新坐标表示旧坐标,(2)以旧坐标表示新坐标,叫做“平移公式”或“移轴公式”。

旋转

如下图, 在2维坐标上,有一点p(x, y) , 直线opの长度为r, 直线op和x轴的正向的夹角为a。 直线op围绕原点做逆时针方向b度的旋转,到达p’ (s,t)

s = r cos(a + b) = r cos(a)cos(b) – r sin(a)sin(b) (1.1)
t = r sin(a + b) = r sin(a)cos(b) + r cos(a) sin(b) (1.2)
其中 x = r cos(a) , y = r sin(a)
代入(1.1), (1.2) ,
s = x cos(b) – y sin(b) (1.3)
t = x sin(b) + y cos(b) (1.4)

代码实现:


#include <iostream>
#include <math.h>
#include<fstream>
#include<cstdlib>
using namespace std;class Transform {public:Transform(int x, double d[]) {pointNums = x;if (x<0)cout << "Not enough" << endl;int c = 0;for (int i = 0; i<x; i++) {for (int j = 0; j<2; j++) {data[i][j] = d[c];c++;}}}void print();int matPoints();void translation(int x,double n,double m) ;void rotation(int x,double ax,double ay);double data[200][200]; // 点容量private:int pointNums;  //点的个数};//输出点坐标
void Transform::print() {for (int i = 0; i<pointNums; i++) {for (int j = 0; j<2; j++) {cout.width(4);cout << data[i][j] << " ";}cout << endl;}cout << endl;
}//统计点的个数
int Transform::matPoints() {return pointNums;
}//二维平移(例如:从p1(x1,y1),平移到p2(x2,y2),n = x2-x1;m=y2-y1)
//输入参数:x为点的个数,n为X轴平移量,m为Y轴平移量。
void Transform::translation(int x,double n,double m) {for (int i = 0; i<x; i++) {         data[i][0] = data[i][0] + n;data[i][1] = data[i][1] + m;}
}//旋转 将坐标轴的X轴旋转到以原点和某一点的连线上
void Transform::rotation(int x,double ax,double ay) {double r = sqrt(ax*ax + ay*ay);double    s_a =  -ay/r;double    c_a = ax/r;for (int i = 0; i<x; i++) {double temp = data[i][0]* c_a - data[i][1]* s_a;data[i][1] = data[i][0]* s_a + data[i][1]* c_a;data[i][0] = temp;}
}int main(int argc, char** argv) {double v[100000] = {};int n;int cc;  ifstream infile("2.txt",ios::in);int count =0;infile>>n;while(infile){infile>>cc;v[count] = cc;count++;}Transform a(n, v);a.print();//将坐标原点移到某一点 a.translation(n,-a.data[0][0],-a.data[0][1]);a.print();//将x轴旋转,使得x轴与某点重合 double ax = a.data[1][0];double bx = a.data[1][1];a.rotation(n,ax,bx);a.print();return 0;
}```cpp
在这里插入代码片

2.txt
10
2 4
6 8
11 14
15 7
22 13
56 7
34 5
13 15
-10 15
10 -19

输出:

C++实现坐标的平移和旋转相关推荐

  1. 坐标的平移,旋转,缩放矩阵

    1.二维坐标的平移,旋转.缩放矩阵 平移矩阵M: 1    0    0 0    1    0 dx  dy   1 D2 = D1*M 旋转矩阵M 设某点与原点连线和X轴夹角为b度,以原点为圆心, ...

  2. WebGL入门(六)-通过坐标计算实现图形的平移、旋转和缩放变换

    通过坐标计算实现图形的平移.旋转和缩放变换 1.图形的平移 1.1平移效果说明 1.2平移原理说明 1.3平移图形的实现步骤 1.3.1在顶点着色器中声明存放平移信息的uniform变量u_Trans ...

  3. Unity3D 游戏引擎之脚本实现模型的平移与旋转(六)

    Unity3D 游戏引擎之脚本实现模型的平移与旋转 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/ar ...

  4. mesh threejs 属性_threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸...

    这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...

  5. OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔

    1 图像缩放 缩放是对图像的大小进行调整,即使图像放大或缩小. API cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR) 参 ...

  6. python处理svg 平移 旋转_svg rotate 怎么转化平移和旋转两个参数。

    问题描述 现在我要转化一下svg的rotate算出平移和旋转角度 问题出现的环境背景及自己尝试过哪些方法 function rotate(p1,p2,r){var x=p1.x-p2.x; var y ...

  7. 二维绕任意点旋转_解析几何|对称,平移和旋转

    作者:henu_wxj 链接:https://blog.nowcoder.net/n/803d062c35624a67a0917ed7dd44fa1d 来源:牛客网 对称问题就是计算几何中的经典问题, ...

  8. Matlab图像的平移,旋转,缩放,裁剪

    %%------------------------Matlab图像的平移,旋转,缩放,裁剪------------------------------- %-------------------头文 ...

  9. 计算机图形与OpenGL学习五(二维几何变换1.平移、旋转、缩放)

    二维几何变换(平移.旋转.缩放) 本章涉及数学变换比较多,代码是次要的,数学理论可自己推导一下. [二维平移] 通过将二维量加到一个点的坐标上来生成一个新的坐标位置,可以实现一次平移.将平移距离加到原 ...

最新文章

  1. 马云成功靠的是机遇还是努力?网友戏谑:是那张其貌不扬的脸
  2. html表格以及form表单部分标签的使用
  3. 预见未来 | 数据智能的现在与未来
  4. Opencv模块功能介绍
  5. 又掌握了一项新技能 - 断点调试 Gradle 插件
  6. lintcode-93-平衡二叉树
  7. 驱动开发类文章公告篇
  8. HANA report creation implementation go through
  9. linux设置环境变量_什么是linux环境变量
  10. Stateflow历史节点的使用
  11. linux下apache+openssl配置记录
  12. 如何用代码爬抓电商数据(附淘宝API调用实例)
  13. 【VTK】VTK 之一 环境准备
  14. Linux字符设备驱动
  15. Android H5交互实现拍照显示
  16. 建立完善的员工晋升机制_员工晋升管理制度精选5篇
  17. ln: creating hard link 问题
  18. centos7下多播路由器安装及配置
  19. 写给女儿高中编程课老师的一封信
  20. mac 关于 /bin/sh: ifconfig: command not found

热门文章

  1. 利用matlab画混淆矩阵(confusion matrix)
  2. 燃烧学往年精选真题解析 2018-01-01
  3. 云炬Android开发笔记 4单Activity界面架构设计与验证
  4. class ts 扩展方法_ts类型声明文件的正确使用姿势
  5. C++类内存分布——深度理解继承与虚函数
  6. MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16
  7. go语言中channel的创建和销毁以及匿名函数的使用
  8. SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting
  9. PC 机 UART(NS8250)详解
  10. 存储器的保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记19