/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
//請完成兩個運算子覆載,err_detection和find_intersection函式
#include <iostream>
#include <cmath>
using namespace std;
const double TOL = 1.e-13;
//異常處理類別
class Err{
private:
int kind;//可用來判斷異常的種類,如兩點重疊(目前設定的值為1)、沒有交點、兩線重疊
public:
Err(int i) : kind(i){}
//完成運算子覆載功能,透過kind的值將不同種類的異常狀態回傳
friend ostream& operator<<(ostream& out, const Err& foo);
};
//生成點座標的類別
class Point{
private:
double x, y;
public:
Point(double a = 0. , double b = 0.) : x(a) , y(b){}
//將交於一點的該點根據題意輸出
friend ostream& operator<<(ostream& out , const Point& pt){
return out << "(" << (abs(pt.x) < TOL ? 0. : pt.x)
<< "," << (abs(pt.y) < TOL ? 0. : pt.y)
<< ")";
}
friend istream& operator>> (istream& in , Point& pt){
return in >> pt.x >> pt.y;
}
//完成運算子覆載功能,透過該函式比較兩點座標是否相等,相等回傳true
friend bool operator==(const Point& a, const Point& b);
friend class Line;
};
//透過兩點(Point物件)構成一線
class Line{
private:
Point pt1, pt2;
double a, b, c;//直線方程式為ax+by=c
public:
Line(const Point& m, const Point& n) : pt1(m), pt2(n){
if(m == n){//透過運算子覆載功能比較兩點座標
throw(Err(1));//若無法構成線(兩點重疊)的情況,擲出Err物件
}
if(pt1.x == pt2.x){
a = 1;
b = 0;
c = pt1.x;
}
else{
a = (pt2.y - pt1.y) / (pt2.x - pt1.x);
b = -1;
c = a * pt1.x - pt1.y;
}
}
friend Point intersection(const Line& line1 , const Line& line2);
//待完成的函式,功能主要是回傳異常的種類("沒有交點"或"兩線重疊"),沒有異常回傳0
friend int err_detection(const Line& line1 , const Line& line2);
//待完成的函式,計算出兩線交於一點的點座標,可透過x,y儲存計算出的xy座標
friend void find_intersection(const Line& line1, const Line& line2, double *x, double *y);
};
//先透過err_detection()判斷line1, line2是否有異常,之後再透過find_intersection()找出交於一點的點座標
Point intersection(const Line& line1, const Line& line2){
double point_x, point_y;//交點的點座標
int errlog = err_detection(line1, line2);//先找出是否有異常
if (errlog != 0) throw(Err(errlog));
else{
find_intersection(line1, line2, &point_x, &point_y);//計算出交於一點的點座標
return Point(point_x, point_y);
}
}
int main(){
Point pt1, pt2, pt3, pt4;
while(cin >> pt1 >> pt2 >> pt3 >> pt4){
try{
Line line1(pt1, pt2);
Line line2(pt3, pt4);
cout << intersection(line1, line2) << endl;
}
catch(const Err& err){
cout << err << endl;
}
}
return 0;
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE*/
int err_detection(const Line& line1 , const Line& line2){
double m,n,r;
m=fabs(line1.a/line2.a);
n=fabs(line1.b/line2.b);
r=fabs(line1.c/line2.c);
if(m==n&&n==r){
return 2;
//重和
}
else if(m==n&&n!=r){
return 3;
//沒焦點
}
else{
return 0;
}
}
void find_intersection(const Line& line1, const Line& line2, double *x, double *y){
double det=line1.a*line2.b-line1.b*line2.a;
double ans1;
double ans2;
ans1=(line1.c*line2.b-line1.b*line2.c)/det;
ans2=(line1.a*line2.c-line1.c*line2.a)/det;
x=&ans1;
y=&ans2;
//對應點 line1.a line1.b line1.c line2.a line2.b line2.c
}
ostream& operator<<(ostream& out, const Err& foo){
if (foo.kind == 1) {
return out << "兩點重疊";
}
else if (foo.kind == 2) {
return out << "兩線重疊";
}
else if (foo.kind == 3) {
return out << "沒有交點";
}
}
bool operator==(const Point& a, const Point& b) {
if (a.x==b.x&&a.y==b.y){
return true;
}
else{
return false;
}
}
LyogUFJFU0VUIENPREUgQkVHSU4gLSBORVZFUiBUT1VDSCBDT0RFIEJFTE9XICovCgovL+iri+WujOaIkOWFqeWAi+mBi+eul+WtkOimhui8iSxlcnJfZGV0ZWN0aW9u5ZKMZmluZF9pbnRlcnNlY3Rpb27lh73lvI8KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0ICBkb3VibGUgIFRPTCA9IDEuZS0xMzsKLy/nlbDluLjomZXnkIbpoZ7liKUKY2xhc3MgRXJyewogIHByaXZhdGU6CiAgICBpbnQga2luZDsvL+WPr+eUqOS+huWIpOaWt+eVsOW4uOeahOeorumhnu+8jOWmguWFqem7numHjeeWiijnm67liY3oqK3lrprnmoTlgLzngroxKeOAgeaykuacieS6pOm7nuOAgeWFqee3mumHjeeWigogIHB1YmxpYzoKICAgIEVycihpbnQgaSkgOiBraW5kKGkpe30KICAgIC8v5a6M5oiQ6YGL566X5a2Q6KaG6LyJ5Yqf6IO977yM6YCP6YGOa2luZOeahOWAvOWwh+S4jeWQjOeorumhnueahOeVsOW4uOeLgOaFi+WbnuWCswogICAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LCBjb25zdCBFcnImIGZvbyk7Cn07Ci8v55Sf5oiQ6bue5bqn5qiZ55qE6aGe5YilCmNsYXNzICBQb2ludHsKICBwcml2YXRlOgogICAgZG91YmxlIHgsIHk7CgogIHB1YmxpYzoKICAgIFBvaW50KGRvdWJsZSBhID0gMC4gLCBkb3VibGUgYiA9IDAuKSA6IHgoYSkgLCB5KGIpe30KICAgIC8v5bCH5Lqk5pa85LiA6bue55qE6Kmy6bue5qC55pOa6aGM5oSP6Ly45Ye6CiAgICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQgLCBjb25zdCBQb2ludCYgcHQpewogICAgICAgIHJldHVybiAgb3V0IDw8ICIoIiA8PCAoYWJzKHB0LngpIDwgVE9MID8gMC4gOiBwdC54KSAKICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgKGFicyhwdC55KSA8IFRPTCA/IDAuIDogcHQueSkKICAgICAgICAgICAgICAgICAgICA8PCAiKSI7CiAgICB9CgogICAgZnJpZW5kIGlzdHJlYW0mIG9wZXJhdG9yPj4gKGlzdHJlYW0mIGluICwgUG9pbnQmIHB0KXsKICAgICAgICByZXR1cm4gaW4gPj4gcHQueCA+PiBwdC55OwogICAgfQogICAgLy/lrozmiJDpgYvnrpflrZDopobovInlip/og73vvIzpgI/pgY7oqbLlh73lvI/mr5TovIPlhanpu57luqfmqJnmmK/lkKbnm7jnrYnvvIznm7jnrYnlm57lgrN0cnVlCiAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBvaW50JiBhLCBjb25zdCBQb2ludCYgYik7CiAgICBmcmllbmQgY2xhc3MgTGluZTsKfTsKLy/pgI/pgY7lhanpu54oUG9pbnTnianku7Yp5qeL5oiQ5LiA57eaCmNsYXNzICBMaW5lewogIHByaXZhdGU6CiAgICBQb2ludCBwdDEsIHB0MjsKICAgIGRvdWJsZSBhLCBiLCBjOy8v55u057ea5pa556iL5byP54K6YXgrYnk9YwoKICBwdWJsaWM6CiAgICBMaW5lKGNvbnN0IFBvaW50JiBtLCBjb25zdCBQb2ludCYgbikgOiBwdDEobSksIHB0MihuKXsKICAgICAgICBpZihtID09IG4pey8v6YCP6YGO6YGL566X5a2Q6KaG6LyJ5Yqf6IO95q+U6LyD5YWp6bue5bqn5qiZCiAgICAgICAgICAgIHRocm93KEVycigxKSk7Ly/oi6XnhKHms5Xmp4vmiJDnt5oo5YWp6bue6YeN55aKKeeahOaDheazge+8jOaTsuWHukVycueJqeS7tgogICAgICAgIH0KICAgICAgICBpZihwdDEueCA9PSBwdDIueCl7CiAgICAgICAgICAgIGEgPSAxOwogICAgICAgICAgICBiID0gMDsKICAgICAgICAgICAgYyA9IHB0MS54OwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgIGEgPSAocHQyLnkgLSBwdDEueSkgLyAocHQyLnggLSBwdDEueCk7IAogICAgICAgIGIgPSAtMTsKICAgICAgICBjID0gYSAqIHB0MS54IC0gcHQxLnk7CiAgICAgICAgfQogICAgfQoKICAgIGZyaWVuZCBQb2ludCBpbnRlcnNlY3Rpb24oY29uc3QgTGluZSYgbGluZTEgLCBjb25zdCBMaW5lJiBsaW5lMik7CgogICAgLy/lvoXlrozmiJDnmoTlh73lvI/vvIzlip/og73kuLvopoHmmK/lm57lgrPnlbDluLjnmoTnqK7poZ4oIuaykuacieS6pOm7niLmiJYi5YWp57ea6YeN55aKIinvvIzmspLmnInnlbDluLjlm57lgrMwCiAgICBmcmllbmQgaW50IGVycl9kZXRlY3Rpb24oY29uc3QgTGluZSYgbGluZTEgLCBjb25zdCBMaW5lJiBsaW5lMik7CiAgICAvL+W+heWujOaIkOeahOWHveW8j++8jOioiOeul+WHuuWFqee3muS6pOaWvOS4gOm7nueahOm7nuW6p+aome+8jOWPr+mAj+mBjngseeWEsuWtmOioiOeul+WHuueahHh55bqn5qiZCiAgICBmcmllbmQgdm9pZCBmaW5kX2ludGVyc2VjdGlvbihjb25zdCBMaW5lJiBsaW5lMSwgY29uc3QgTGluZSYgbGluZTIsIGRvdWJsZSAqeCwgZG91YmxlICp5KTsKfTsKLy/lhYjpgI/pgY5lcnJfZGV0ZWN0aW9uKCnliKTmlrdsaW5lMSwgbGluZTLmmK/lkKbmnInnlbDluLjvvIzkuYvlvozlho3pgI/pgY5maW5kX2ludGVyc2VjdGlvbigp5om+5Ye65Lqk5pa85LiA6bue55qE6bue5bqn5qiZClBvaW50IGludGVyc2VjdGlvbihjb25zdCBMaW5lJiBsaW5lMSwgY29uc3QgTGluZSYgbGluZTIpewogICAgZG91YmxlIHBvaW50X3gsIHBvaW50X3k7Ly/kuqTpu57nmoTpu57luqfmqJkKICAgIGludCBlcnJsb2cgPSBlcnJfZGV0ZWN0aW9uKGxpbmUxLCBsaW5lMik7Ly/lhYjmib7lh7rmmK/lkKbmnInnlbDluLgKICAgIGlmIChlcnJsb2cgIT0gMCkgdGhyb3coRXJyKGVycmxvZykpOwogICAgZWxzZXsKICAgICAgICBmaW5kX2ludGVyc2VjdGlvbihsaW5lMSwgbGluZTIsICZwb2ludF94LCAmcG9pbnRfeSk7Ly/oqIjnrpflh7rkuqTmlrzkuIDpu57nmoTpu57luqfmqJkKICAgICAgICByZXR1cm4gUG9pbnQocG9pbnRfeCwgcG9pbnRfeSk7CiAgICB9IAp9CiAgICAKaW50IG1haW4oKXsKICAgIFBvaW50IHB0MSwgcHQyLCBwdDMsIHB0NDsKICAgIHdoaWxlKGNpbiA+PiBwdDEgPj4gcHQyID4+IHB0MyA+PiBwdDQpewogICAgICAgIHRyeXsKICAgICAgICAgICAgTGluZSBsaW5lMShwdDEsIHB0Mik7CiAgICAgICAgICAgIExpbmUgbGluZTIocHQzLCBwdDQpOwogICAgICAgICAgICBjb3V0IDw8IGludGVyc2VjdGlvbihsaW5lMSwgbGluZTIpIDw8IGVuZGw7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGNvbnN0IEVyciYgZXJyKXsKICAgICAgICAgICAgY291dCA8PCBlcnIgPDwgZW5kbDsKICAgICAgICB9ICAKICAgIH0KICAgIHJldHVybiAwOwp9CgovKiBQUkVTRVQgQ09ERSBFTkQgLSBORVZFUiBUT1VDSCBDT0RFIEFCT1ZFKi8KaW50IGVycl9kZXRlY3Rpb24oY29uc3QgTGluZSYgbGluZTEgLCBjb25zdCBMaW5lJiBsaW5lMil7CiAgICBkb3VibGUgbSxuLHI7CiAgICBtPWZhYnMobGluZTEuYS9saW5lMi5hKTsKICAgIG49ZmFicyhsaW5lMS5iL2xpbmUyLmIpOwogICAgcj1mYWJzKGxpbmUxLmMvbGluZTIuYyk7ICAgICAgICAgICAgIAogICAgaWYobT09biYmbj09cil7CiAgICAgICAgcmV0dXJuIDI7IAogICAgICAgIC8v6YeN5ZKMCiAgICB9CiAgICBlbHNlIGlmKG09PW4mJm4hPXIpewogICAgICAgIHJldHVybiAzOwogICAgICAgIC8v5rKS54Sm6bueCiAgICB9CiAgICBlbHNlewogICAgICAgIHJldHVybiAwOwogICAgfQp9CnZvaWQgZmluZF9pbnRlcnNlY3Rpb24oY29uc3QgTGluZSYgbGluZTEsIGNvbnN0IExpbmUmIGxpbmUyLCBkb3VibGUgKngsIGRvdWJsZSAqeSl7CiAgICBkb3VibGUgZGV0PWxpbmUxLmEqbGluZTIuYi1saW5lMS5iKmxpbmUyLmE7CiAgICBkb3VibGUgYW5zMTsKICAgIGRvdWJsZSBhbnMyOwogICAgYW5zMT0obGluZTEuYypsaW5lMi5iLWxpbmUxLmIqbGluZTIuYykvZGV0OwogICAgYW5zMj0obGluZTEuYSpsaW5lMi5jLWxpbmUxLmMqbGluZTIuYSkvZGV0OwogICAgeD0mYW5zMTsKICAgIHk9JmFuczI7CiAgICAvL+WwjeaHiem7niBsaW5lMS5hIGxpbmUxLmIgbGluZTEuYyBsaW5lMi5hIGxpbmUyLmIgbGluZTIuYwp9Cm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LCBjb25zdCBFcnImIGZvbyl7CiAgICAgICAgaWYgKGZvby5raW5kID09IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG91dCA8PCAi5YWp6bue6YeN55aKIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZm9vLmtpbmQgPT0gMikgewogICAgICAgICAgICByZXR1cm4gb3V0IDw8ICLlhannt5rph43nlooiOwogICAgICAgIH0gCiAgICAgICAgZWxzZSBpZiAoZm9vLmtpbmQgPT0gMykgewogICAgICAgICAgICByZXR1cm4gb3V0IDw8ICLmspLmnInkuqTpu54iOwogICAgICAgIH0KfQpib29sIG9wZXJhdG9yPT0oY29uc3QgUG9pbnQmIGEsIGNvbnN0IFBvaW50JiBiKSB7CiAgICBpZiAoYS54PT1iLngmJmEueT09Yi55KXsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9