1. 程式人生 > 其它 >向量運算的一些模板(一)

向量運算的一些模板(一)

因為帶測試資料,所以就稍微分開一些。
以下有向量加減法、求斜率、求一堆點中一條直線能包括的最多點的數量、點積運算

#include <iostream>
#include <cstdio>
#include <algorithm> 

using namespace std;

double ax[5] = {1, 2, 3, 9, 10};
double ay[5] = {1, 2, 3, 10, 11};

//為了方便全部都是double型 

//兩個向量的加減法,x1 +- x2,y1 +- y2 
void addAndSub(double x1, double y1, double x2, double y2){
    double x = x1 + x2;
    double y = y1 + y2;
  //看題目情況,不知道返回值要帶啥
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
} 

//求斜率
double sumK(double x, double y){
    double k = y / x;	//以(0, 0)為原點的話,不然需要帶上(x0, y0)求差值再算 
    return k; 
} 

//求斜率的延伸,求有多少個點在(x1, y1)and(x2, y2)的連線上POJ1118
int sumOfPoint(int n){
    int maxSum = 2;	//最初肯定有兩個點在這個線上 
    for(int i = 0; i < n; i++){
      //資料都存放在陣列當中,令j = i + 1就避免了重複計算 
      for(int j = i + 1; j < n; j++){
        int sum = 2;
        for(int k = j + 1; k < n; k++){
          //這裡以我的風格是ax存放x的值,ay存放y的值 
          if((ax[i] - ax[j]) * (ay[i]- ay[k]) == (ax[i] - ax[k]) * (ay[i] - ay[j])){
            sum++;
          }
        }
        if(sum > maxSum){
          maxSum = sum;
        }
      }
    }
    return maxSum;
}

//點積運算 
double Dot(double x1, double y1, double x2, double y2){
    return x1 * x2 + y1 * y2;
} 



int main(){
    //測試點(2, 1)and(1, 1)相加
    cout << "測試點(2, 1)and(1, 1)相加" << endl;
    addAndSub(2, 1, 1, 1);
 	
    //測試多個點中一條線能覆蓋最多的點
    cout << "測試多個點中一條線能覆蓋最多的點(應該輸出3)" << endl;
    cout << sumOfPoint(5) << endl;	//應該輸出3 
	
    //測試點(1, 1)and(1, 1)的點積運算(以(0, 0)為原點 
     cout << "測試點(1, 1)and(1, 1)的點積運算(應該輸出2)" << endl;
     cout << Dot(1, 1, 1, 1) << endl;
 	
 	
    return 0;
}
一名電腦科學與技術的女大學生~