C++实现坐标的平移和旋转
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++实现坐标的平移和旋转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gauss 消元法求解线性方程组
- 下一篇: 写在岁末 -- 程序员的人生并非那么容易