Chả hiểu sao ở hàm kiểm tra tam giác, trường hợp 2 điểm trùng nhau thì ok nhưng 3 điểm thẳng hàng nó lại k chạy
Mình debug thử thì nó cho qua luôn, k nhảy vào hàm dù đã nhập 3 iX bằng nhau, iY cũng vậy
Mấy bạn giúp mình tìm lỗi với, cảm ơn nhiều!
struct Diem
{
int iX;
int iY;
};
class TamGiac
{
private:
Diem DiemA, DiemB, DiemC;
public:
TamGiac();
int KiemTra();
TamGiac TinhTien();
friend istream& operator>>(istream &is, TamGiac &a);
friend ostream& operator<<(ostream &os, TamGiac a);
};
TamGiac::TamGiac()
{
DiemA.iX = DiemA.iY = 0;
DiemB.iX = DiemB.iY = 0;
DiemC.iX = DiemC.iY = 0;
}
int TamGiac::KiemTra()
{
if((DiemA.iX == DiemB.iX && DiemA.iY == DiemB.iY) || (DiemA.iX == DiemC.iX && DiemA.iY == DiemC.iY) || (DiemC.iX == DiemB.iX && DiemC.iY == DiemB.iY))
return 0;
if(DiemA.iX == DiemB.iX == DiemC.iX)
return 0;
if(DiemA.iY == DiemB.iY == DiemC.iY)
return 0;
return 1;
}
istream& operator>>(istream &is, TamGiac &a)
{
cout << "
Nhap vao toa do diem A: ";
cin >> a.DiemA.iX >> a.DiemA.iY;
cout << "
Nhap vao toa do diem B: ";
cin >> a.DiemB.iX >> a.DiemB.iY;
cout << "
Nhap vao toa do diem C: ";
cin >> a.DiemC.iX >> a.DiemC.iY;
return is;
}
int main()
{
TamGiac tg;
int c;
do
{
cin >> tg;
c = tg.KiemTra();
if(c == 0) continue;
else break;
}while(1);
cout << tg;
tg.TinhTien();
cout << tg;
return 0;
}
[QUOTE=truonganpn;273578]Kiểm tra mấy cái này làm gì, sao tên nó lại là kiểm tra tam giác mà vô lại kiểm tra điểm thẳng hàng[/QUOTE]
Dạ em đã nhận ra không thể kiểm tra hết được, cảm ơn thầy
[QUOTE=hiepnt;273593]Chủ topic đọc lại nguyên tắc post bài trong topic này để tránh bị nhận thẻ phạt nhé. http://forum.uit.edu.vn/threads/26761[/QUOTE]
em sẽ rút kinh nghiệm, cảm ơn thầy
Không biết còn cách nào hay hơn không nhưng theo mình để kiểm tra 3 điểm có tạo thành tam giác hay không thì mình sẽ làm những bước sau :
Kiểm tra có điểm nào trung nhau hay không
Nếu không, lập phương trình đường thẳng đi qua 2 điểm đầu
Thế tọa độ điểm còn lại nếu phương trình bằng 0 thì 3 điểm nằm trên đường thẳng và ngược lại 3 điểm tạo thành tam giác
Dưới đây là đoạn code của mình.
int TamGiac::KiemTra()
{
//Kiểm tra 3 điểm có trùng nhau hay không
if((DiemA.iX == DiemB.iX && DiemA.iY == DiemB.iY) || (DiemA.iX == DiemC.iX && DiemA.iY == DiemC.iY) || (DiemC.iX == DiemB.iX && DiemC.iY == DiemB.iY))
return 0;
//Kiểm tra 3 điểm có nằm trên đường thẳng hay không
//Lập phương trình đường thẳng đi qua 2 điểm A, B
Diem vecCP; //vector chỉ phương
vecCP.iX = DiemA.iX - DiemB.iX;
vecCP.iY = DiemA.iY - DiemB.iY;
Diem vecPT; //vector pháp tuyến : vector nhân với vector chỉ phương bằng 0;
vecPT.iX = -vecCP.iY;
vecPT.iY = vecCP.iX;
//Nếu điểm C thuộc đường thẳng qua AB thì phương trình tổng quát sẽ bằng 0
int kt = vecPT.iX * (DiemC.iX - DiemA.iX) + vecPT.iY * (DiemC.iY - DiemA.iY);
if(kt == 0) return 0;
return 1;