2014-03-03 156 views
0

我對C++編程語言非常新穎,我只需要知道如何聲明一組給定它們的開始點和結束點的線段?在C++中是否有類似的東西? 我有這樣的代碼,它從文本文件中讀取線段的起點和終點,並將輸入分爲4個矢量:X_start,Y_start,X_end,Y_end。 我需要知道如何使用這些向量來定義線段?任何幫助,將不勝感激。在此先感謝我如何找到2線段之間的交點座標C++

#include <iostream> 
#include <algorithm> // for std::copy#include <iostream> 
#include <iterator> 
#include <fstream> 
#include <math.h> 
#include <vector> 
#include <algorithm> // for std::copy 
using namespace std; 

int main() 
{ 
std::ifstream is("D:\\Task1.txt"); 
std::istream_iterator<double> start(is), end; 
std::vector<double> numbers(start, end); 
std::vector<double> X_start(start, end); 
std::vector<double> Y_start(start, end); 
std::vector<double> X_end(start, end); 
std::vector<double> Y_end(start, end); 
std::vector<double>::iterator i; 
std::vector<double>::iterator j; 
float left, top, right, bottom; // Bounding Box For Line Segments 
left = 12; 
top = 12; 
right = 0; 
bottom = 0; 

std::cout << "Read " << numbers.size() << " numbers" << std::endl; 
std::copy(numbers.begin(), numbers.end(), 
     std::ostream_iterator<double>(std::cout, " ")); 
std::cout << std::endl; 

for (vector<double>::iterator i = numbers.begin(); 
         i != numbers.end(); 
         ++i) 
{ 
for(int j = 0; j < numbers.size(); j = j+4) 
{ 
std::cout << "elemnts of X_start " << numbers[j] << " " <<std::endl; 
X_start.push_back(numbers[j]); 

} 
for(int k = 1; k < numbers.size(); k = k+4) 
{ 
std::cout << "elemnts of Y_start " << numbers[k] << " " <<std::endl; 
Y_start.push_back(numbers[k]); 
} 
for(int l = 2; l < numbers.size(); l = l+4) 
{ 
std::cout << "elemnts of X_end " << numbers[l] << " " <<std::endl; 
X_end.push_back(numbers[l]); 
} 
for(int m = 3; m < numbers.size(); m = m+4) 
{ 
std::cout << "elemnts of Y_end " << numbers[m] << " " <<std::endl; 
Y_end.push_back(numbers[m]); 
} 
getchar(); 
} 
} 
+0

一旦你有了在紙上找到交點的數學方法,實現它就不難了,1提示:做一類線。如果你想通過一個庫來實現,可以通過google和stackoverflow找到。 – stefaanv

+0

你認爲2D還是3D? 2D中的線至少由x,y座標的兩個點描述,在x,y,z座標的3D兩個點中描述。你的載體如何與此相關? – 4pie0

+0

@stefaanv謝謝你能爲我們提供這些圖書館的鏈接嗎? – user3101219

回答

0

我使用以下函數。只需修改它以符合您的要求。

class Point 
{ 
    public: 
    float x,y; 
}; 


class LineSegment 
{ 
    public: 
    Point top; 
    Point bottom; 
}; 

Point* getIntersectionPoint(LineSegment line1,LineSegment line2) 
{ 
    float s1_x, s1_y, s2_x, s2_y; 
    float p1_x = line1.bottom.x,p1_y = line1.bottom.y; 
    float p0_x = line1.top.x,p0_y = line1.top.y; 
    float p3_x = line2.bottom.x,p3_y = line2.bottom.y; 
    float p2_x = line2.top.x,p2_y = line2.top.y; 
    s1_x = p1_x - p0_x;  s1_y = p1_y - p0_y; 
    s2_x = p3_x - p2_x;  s2_y = p3_y - p2_y; 

    float s, t; 
    s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y))/(-s2_x * s1_y + s1_x * s2_y); 
    t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x))/(-s2_x * s1_y + s1_x * s2_y); 

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1) 
    { 
     Point *intsPoint = (Point *)malloc(sizeof(Point)); 
     intsPoint->x = p0_x + (t * s1_x); 
     intsPoint->y = p0_y + (t * s1_y); 
     return intsPoint; 
    } 

    return NULL; 
} 
+0

爲什麼intsPoint被分配在堆上?也請刪除它,以避免內存泄漏 – 4pie0

+0

@piotruś大概允許函數在兩個線段* not * intersect事件中返回null。因爲答案並沒有提供對該方法的調用,所以您提出的刪除應該去哪裏!? –

+0

你應該返回值 – 4pie0

0

「我很新的C++編程語言」

如何新的C++?你知道你首先想要做什麼的數學嗎?

+0

是的其實我是這樣做的,但我不知道如何在C++中定義一組線段等等, 數學不是我的問題 – user3101219

+0

代碼是從頭開始做的嗎?或從某處複製(來源?) –

+0

沒有沒有複製它,我正努力學習我自己的C++,但我只是一個初學者 – user3101219

相關問題