POJ1269 Intersecting Lines 计算几何 C语言
生活随笔
收集整理的這篇文章主要介紹了
POJ1269 Intersecting Lines 计算几何 C语言
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:http://poj.org/problem?id=1269
題目大意:給出四個(gè)點(diǎn)確定兩條直線。如果是一條線輸出“LINE”,如果平行輸出“NONE”, 如果有交點(diǎn)輸出交點(diǎn)坐標(biāo)。
思路:注意是直線,不是線段啊。
用兩點(diǎn)式推出兩條直線方程 :
(y1 - y2)x + (x2 - x1)y = x2y1 - x1y2; (y3 - y4)x + (x4 - x3)y = x4y3 - x3y4; 又由Cramer法則: a1x + b1y = c1; a2x + b2y = c2; D = a1b2 - a2b1; D1 = c1b2 - c2b1; D2 = a1c2 - a2c1; D != 0時(shí), x = D1 / D, y = D2 / D; 得到交點(diǎn)坐標(biāo)。 D = 0時(shí);如果a1 / a2 = b1 / b2 = c1 / c2 , 則四個(gè)點(diǎn)在一條直線上;否則兩直線平行,無交點(diǎn)。 ? AC code: #include <stdio.h>#include <stdlib.h>
int main () {
?int n;
?int x1, y1, x2, y2, x3, y3, x4, y4;
?int a1, b1, c1, a2, b2, c2;
?int D, D1, D2;
?double x, y;
?scanf ("%d", &n);
?printf ("INTERSECTING LINES OUTPUT\n");
?while (n--) {
??scanf ("%d%d%d%d%d%d%d%d",&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
??a1 = y1 - y2;???????????????????? // 由公式推出的關(guān)系
??a2 = y3 - y4;
??b1 = x2 - x1;
??b2 = x4 - x3;
??c1 = x2 * y1 - x1 * y2;
??c2 = x4 * y3 - x3 * y4;
??D = a1 * b2 - a2 * b1;
??if (D) {????????????????????????? // D != 0 運(yùn)用Cramer法則求交點(diǎn)
???D1 = c1 * b2 - c2 * b1;
???D2 = a1 * c2 - a2 * c1;
???x = (double)((double)D1 / D);
???y = (double)((double)D2 / D);
???printf ("POINT %.2lf %.2lf\n", x, y);
??}
??else
???if (a1 * c2 == a2 * c1 && b1 * c2 == b2 * c1)? // 兩直線重合
????printf ("LINE\n");
???else
????printf ("NONE\n");
?}
?printf ("END OF OUTPUT\n");
?//system ("pause");
?return 0;
} ? ? 還有一個(gè)同學(xué)的代碼, 用了結(jié)構(gòu)體,但方法是一樣的。 #include <stdio.h>
#include <stdlib.h> struct point{
double x, y;
}; int main(){
?point p[4];
?double A1, A2, B1, B2, C1, C2, D, D1, D2;
?int CASE;
?scanf("%d", &CASE);
?printf("INTERSECTING LINES OUTPUT\n");
?while(CASE --){
??for(int i = 0; i < 4; i ++)
???scanf("%lf %lf", &p[i].x, &p[i].y);
?A1 = p[1].y - p[0].y;? B1 = p[0].x - p[1].x; C1 = p[0].y * (p[1].x - p[0].x) - p[0].x * (p[1].y - p[0].y);
?A2 = p[3].y - p[2].y;? B2 = p[2].x - p[3].x; C2 = p[2].y * (p[3].x - p[2].x) - p[2].x * (p[3].y - p[2].y);
?D = A1 * B2 - A2 * B1;
?if(D == 0){
??if(A1 * p[2].x + B1 * p[2].y + C1 == 0) printf("LINE\n");
??else printf("NONE\n");
??continue;
?}
?D1 = C1 * B2 - C2 * B1;
?D2 = A1 * C2 - A2 * C1;
?printf("POINT %.2lf %.2lf\n", -D1 / D, -D2 / D);
?}
?printf("END OF OUTPUT\n");
?//system("pause");
?return 0;
} ? 這個(gè)題做完發(fā)現(xiàn)思路還是比較清晰的。開始時(shí)推直線方程用的是點(diǎn)斜式,相當(dāng)麻煩,還會(huì)出現(xiàn)分母是不是零的問題,后來改用兩點(diǎn)式,一下就簡(jiǎn)單了。判斷直線重合時(shí)又出現(xiàn)了點(diǎn)小問題,后來想到a、b、c都要對(duì)應(yīng)成比例才行,再提交就AC了。
轉(zhuǎn)載于:https://www.cnblogs.com/cloehui/archive/2011/07/20/2111395.html
總結(jié)
以上是生活随笔為你收集整理的POJ1269 Intersecting Lines 计算几何 C语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sharepoint学习笔记---如何在
- 下一篇: ListBox类似组件,鼠标右键点击事件