A=(x1,y1),B=(x2,y2),C=(x3,y3),D=(x4,y4)の異なる4つの座標点が与えられたとき、直線ABと直線CDが平行かどうかを判定、平行である場合にはYES、そうでない場合にはNOを出力するプログラムを作成。
なお、x1,y1,x2,y2,x3,y3,x4,y4はそれぞれ-100以上100以下です。
x1(実数)
y1(実数)
x2(実数)
y2(実数)
x3(実数)
y3(実数)
x4(実数)
y4(実数)
YES または NO
0
0
1
1
0
1
1
2
YES
まず、点Bから点Aを、点Dから点Cを引き算します。そうすると、原点(0,0)からB,Dそれぞれを通る直線に平行移動できます。後は、この二つの傾きを比較すればそれが平行であるのか分かります。
この際0除算に注意してください。
#include <stdio.h> int main(){ double x1,y1,x2,y2,x3,y3,x4,y4; scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); x2 -= x1; y2 -= y1; x4 -= x3; y4 -= y3; if(x2 == 0 || x4 == 0){ if(x2 == 0 && x4 == 0){ printf("YES\n"); }else{ printf("NO\n"); } }else{ if(y2/x2 == y4/x4){ printf("YES\n"); }else{ printf("NO\n"); } } return 0; }
最初は、それぞれの直線の傾きをバカ正直に求めていましたが少し改良すると簡単に出来る事に気付いて修正しました(平行移動しても傾きが変わらないことに気付かなかった)。原点に合わせるという動作は他の図形問題でも簡単に求めるために役に立ちます。ちょっとした前処理でif文の中身を簡単に出来るのであればバグも減らせることでしょう。