Tìm slope của 2 lines !!
Bài toán:Tìm tọa độ giao điểm của hai đường thẳng AB và CD khi biết tọa độ của bốn điểm A,B,C,D
Các bạn có thể gợi ý cho mình cáh thực hiện không.
Đã được chỉnh sửa lần cuối bởi kegiaumat055 : 19-09-2008 lúc 06:19 PM.
Tìm slope của 2 lines !!
Cái này là toán học thuần túy thôi à. Bạn viết phương trình đường thẳng qua 2 điểm rồi giải hệ phương trình để tìm ra giao điểm. Từ đó bạn hãy lập công thức tìm ra mối liên hệ giữa 4 điểm của 2 đường thẳng và giao điểm của chúng. Có công thức rồi thì đưa vào code là chuyện quá dễ.
Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.
Về phần toán học,mình đã làm nhiều rồi.Nhưng trong lập trình, mình không biết cách viết đường thẳng qua hai điểm
phương trình tổng quát của đường thẳng Ax+By+C = 0;
với 4 điểm bạn có thể viết được 2 phương trình đường thẳng.
thông qua các hằng số A,B,C.
được 6 hằng số này rồi bạn ngồi giải tay ra phương trình tính x theo y hoặc y theo x, nếu tính được 1 trong 2 thằng thì thằng còn lại đơn giản là thay vào 1 trong 2 phương trình là ok mà.
cách viết 3 hệ số A,B,C từ 2 điểm thì lâu ngày quá mình không nhớ được. chỉ hướng dẫn bạn được vậy thôi.
chúc bạn thành công.
Chỉ là tìm tọa độ giao điểm của hai đường thẳng chứ đâu bắt viết phương trình đường thẳng , bạn nên đọc lại yêu cầu đề bài.
Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.
Bài này mình từng làm từ rất lâu rồi, giờ thấy có người hỏi nên mình share code vậy. À, mà bài này là 2 đoạn thẳng với 2 đầu mút chứ không phải 2 đường thẳng nhé, nhưng ý tưởng thì gần như là giống nhau, sửa lại tí là xong.
C++ Code:
#include <iostream> using namespace std; //---------------------------------------------------- void Swap(double&a , double& b); /*! alters a, b; requires ensures a = #b and b = #a !*/ bool Is_In(double x, double a, double b); /*! requires a <= b ensures Is_In = x is in [a,b] !*/ //---------------------------------------------------- void Swap(double& a, double& b) { double temp = a; a = b; b = temp; } bool Is_In(double x, double a, double b) { return ((x >= a) and (x <= b)); } //---------------------------------------------------- int main() { double x1, x2, x3, x4, y1, y2, y3, y4, a1, a2, x; //swap for later convenient comparison if(x1>x2) { Swap(x1, x2); Swap(y1, y2); } if(x3>x4) { Swap(x3, x4); Swap(y3, y4); } a1 = (y1-y2)/(x1-x2); //slope of the line contains segment 1 a2 = (y3-y4)/(x3-x4); //slope of the line contains segment 2 /*! the line function y = a*x - a*xo + yo solve for x where two lines intersect !*/ if(a1 == a2) //special cases where 2 segments are parallel or lie on each other { if( (a2*(x1-x3) + y3) != y1 ) { } else if(Is_In(x1, x3, x4) or Is_In(x2, x3, x4) or (x1 <= x3 and x2 >= x4)) { } else { } } else { x = (a1*x1 - a2*x3 - y1 + y3)/(a1-a2); if(x >= x1 and x <= x2) { } else { } } return 0; }
Đã được chỉnh sửa lần cuối bởi hvutrong : 26-08-2008 lúc 02:29 PM.
Bài này chỉ cần dùng định thức cấp 2 là tính được . Đâu gì khó khăn vậy ?
Bài này theo tôi nghĩ là không đơn giản đâu. Nếu vẫn tôn trọng đề bài thì tôi nghĩ rất phức tạp. Vì theo toán học có thể có rất nhiều đường thẳng, vì cứ hai điểm tạo thành đường thẳng. Vậy với 4 điểm có 12 đường thẳng, biết chọn cặp nào và giải thuật ra sao, tôi thấy các huynh không ai nói đến giải thuật để giải bài toán này cả.