矢量積的應用:
已知三點(x1, y1),(x2, y2), (x3, y3)
|x1 - x2 y1 - y2|
|x1 - x3 y1 - y3| < 0 就是順時針, 否則逆時針,
幾何意義
叉積的長度 |a × b| 可以解釋成以a和b爲邊的平行四邊形的面積。進一步就是說,混合積可以得到以a,b,c爲邊的平行六面體的體積。
向量積|c|=|a×b|=|a| |b|sin<a,b>
即c的長度在數值上等於以a,b,夾角爲θ組成的平行四邊形的面積。
c的方向垂直於a與b所決定的平面,c的指向按右手規則從a轉向b來確定。
b×a= -a×b右手規則
三角形ABC的面積=1/2*abs(AB×AC)
三角形面積
- 描述
- 給你三個點,表示一個三角形的三個頂點,現你的任務是求出該三角形的面積
- 輸入
- 每行是一組測試數據,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。(座標值都在0到10000之間)
輸入0 0 0 0 0 0表示輸入結束
測試數據不超過10000組 - 輸出
- 輸出這三個點所代表的三角形的面積,結果精確到小數點後1位(即使是整數也要輸出一位小數位)
- 樣例輸入
-
0 0 1 1 1 3 0 1 1 0 0 0 0 0 0 0 0 0
- 樣例輸出
-
1.0 0.5
#include<stdio.h>
#include<stdlib.h>
int main(){
double s;
int x1, x2, x3, y1, y2, y3;
while(scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3) && (x1 || x2 || x3 || y1 || y2 || y3)){
s = (x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3);//按行列式理解
s = s / 2;
if(s < 0)
printf("%.1f\n", -s);
else
printf("%.1f\n", s);
}
return 0;
}
三點順序
- 描述
-
現在給你不共線的三個點A,B,C的座標,它們一定能組成一個三角形,現在讓你判斷A,B,C是順時針給出的還是逆時針給出的?
如:
圖1:順時針給出
圖2:逆時針給出
<圖1> <圖2>
- 輸入
- 每行是一組測試數據,有6個整數x1,y1,x2,y2,x3,y3分別表示A,B,C三個點的橫縱座標。(座標值都在0到10000之間)
輸入0 0 0 0 0 0表示輸入結束
測試數據不超過10000組 - 輸出
- 如果這三個點是順時針給出的,請輸出1,逆時針給出則輸出0
- 樣例輸入
-
0 0 1 1 1 3 0 1 1 0 0 0 0 0 0 0 0 0
- 樣例輸出
-
0 1
#include<stdio.h>
int main()
{
int x1, x2, x3, y1, y2, y3;
while(scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3) && (x1 || x2 || x3 || y1 || y2 || y3) ){
if(((x2 -x1)*(y3 - y2) - (x3 - x2)*(y2 - y1)) < 0)
printf("1\n");
else if(((x2 -x1)*(y3 - y2) - (x3 - x2)*(y2 - y1)) > 0)
printf("0\n");
}
return 0;
}