信息学奥赛一本通 1034:计算三角形面积 | OpenJudge NOI 1.3 17
【題目鏈接】
ybt 1034:計算三角形面積
OpenJudge NOI 1.3 17:計算三角形面積
【題目考點】
1. 已知三點求三角形面積公式
已知三點分別為(x1,y1),(x2,y2),(x3,y3)(x_1,y_1), (x_2,y_2), (x_3,y_3)(x1?,y1?),(x2?,y2?),(x3?,y3?)
先給出結論:這三個點圍成的三角形的面積為:
S=12∣x1y2+x2y3+x3y1?x1y3?x2y1?x3y2∣S=\frac{1}{2}|x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2|S=21?∣x1?y2?+x2?y3?+x3?y1??x1?y3??x2?y1??x3?y2?∣
推導過程:
- 記a?=(x2?x1,y2?y1),b?=(x3?x1,y3?y1)\vec{a} = (x_2-x_1,y_2-y_1), \vec = (x_3-x_1,y_3-y_1)a=(x2??x1?,y2??y1?),b=(x3??x1?,y3??y1?)
- 已知向量點積公式a??b?=∣a?∣∣b?∣cosθ\vec{a} \cdot \vec = |\vec{a}||\vec|cos\thetaa?b=∣a∣∣b∣cosθ,其中θ\thetaθ是向量a?,b?\vec{a}, \veca,b的夾角。
有cosθ=a??b?∣a?∣∣b?∣cos\theta = \frac{\vec{a} \cdot \vec}{|\vec{a}||\vec|}cosθ=∣a∣∣b∣a?b? - 已知sin2θ+cos2θ=1sin^2\theta + cos^2\theta = 1sin2θ+cos2θ=1,且θ<π\theta<\piθ<π
有sinθ=1?cons2θ=(∣a?∣∣b?∣)2?(a??b?)2∣a?∣∣b?∣sin\theta = \sqrt{1-cons^2\theta} = \frac{\sqrt{(|\vec{a}||\vec|)^2 - (\vec{a} \cdot \vec)^2}}{|\vec{a}||\vec|}sinθ=1?cons2θ?=∣a∣∣b∣(∣a∣∣b∣)2?(a?b)2?? - 已知三角形面積公式:S=12∣a?∣∣b?∣sinθS = \frac{1}{2}|\vec{a}||\vec|sin\thetaS=21?∣a∣∣b∣sinθ
有S=12∣a?∣∣b?∣(∣a?∣∣b?∣)2?(a??b?)2∣a?∣∣b?∣=12(∣a?∣∣b?∣)2?(a??b?)2\begin{aligned} S &= \frac{1}{2}|\vec{a}||\vec|\frac{\sqrt{(|\vec{a}||\vec|)^2 - (\vec{a} \cdot \vec)^2}}{|\vec{a}||\vec|}\\ &= \frac{1}{2}\sqrt{(|\vec{a}||\vec|)^2 - (\vec{a} \cdot \vec)^2}\\ \end{aligned} S?=21?∣a∣∣b∣∣a∣∣b∣(∣a∣∣b∣)2?(a?b)2??=21?(∣a∣∣b∣)2?(a?b)2?? - ∣a?∣=(x2?x1)2+(y2?y1)2|\vec{a}| = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}∣a∣=(x2??x1?)2+(y2??y1?)2?
∣b?∣=(x3?x1)2+(y3?y1)2|\vec| = \sqrt{(x_3-x_1)^2+(y_3-y_1)^2}∣b∣=(x3??x1?)2+(y3??y1?)2?
a??b?=(x2?x1)(x3?x1)+(y2?y1)(y3?y1)\vec{a} \cdot \vec = (x_2-x_1)(x_3-x_1)+(y_2-y_1)(y_3-y_1)a?b=(x2??x1?)(x3??x1?)+(y2??y1?)(y3??y1?) - 根據以上公式:S=12(∣a?∣∣b?∣)2?(a??b?)2S = \frac{1}{2}\sqrt{(|\vec{a}||\vec|)^2 - (\vec{a} \cdot \vec)^2}S=21?(∣a∣∣b∣)2?(a?b)2?
已經可以做到輸入x1,y1,x2,y2,x3,y3x_1,y_1, x_2,y_2, x_3,y_3x1?,y1?,x2?,y2?,x3?,y3?,求S。
繼續化歸,可以得到公式
S=12∣x1y2+x2y3+x3y1?x1y3?x2y1?x3y2∣S=\frac{1}{2}|x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2|S=21?∣x1?y2?+x2?y3?+x3?y1??x1?y3??x2?y1??x3?y2?∣
2. 海倫公式:已知三條邊的長度求三角形面積
設a=∣a?∣,b=∣b?∣,c=∣c?∣a = |\vec{a}|, b = |\vec|, c = |\vec{c}|a=∣a∣,b=∣b∣,c=∣c∣,
已知a?=(x2?x1,y2?y1),b?=(x3?x1,y3?y1),c?=(x3?x2,y3?y2)\vec{a} = (x_2-x_1,y_2-y_1), \vec = (x_3-x_1,y_3-y_1), \vec{c} = (x_3-x_2,y_3-y_2)a=(x2??x1?,y2??y1?),b=(x3??x1?,y3??y1?),c=(x3??x2?,y3??y2?)
有:
- a=∣a?∣=(x2?x1)2+(y2?y1)2a = |\vec{a}| = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}a=∣a∣=(x2??x1?)2+(y2??y1?)2?
b=∣b?∣=(x3?x1)2+(y3?y1)2b = |\vec| = \sqrt{(x_3-x_1)^2+(y_3-y_1)^2}b=∣b∣=(x3??x1?)2+(y3??y1?)2?
c=∣c?∣=(x3?x2)2+(y3?y2)2c = |\vec{c}| = \sqrt{(x_3-x_2)^2+(y_3-y_2)^2}c=∣c∣=(x3??x2?)2+(y3??y2?)2? - 半周長p=12(a+b+c)p = \frac{1}{2}(a+b+c)p=21?(a+b+c)
- 海倫公式,三角形面積S=p(p?a)(p?b)(p?c)S = \sqrt{p(p-a)(p-b)(p-c)}S=p(p?a)(p?b)(p?c)?
3. 求一個數的絕對值
- 求整數的絕對值:int abs(int a);
- 求浮點型數的絕對值:double fabs(double a);
【題解代碼】
解法1:用公式S=12(∣a?∣∣b?∣)2?(a??b?)2S = \frac{1}{2}\sqrt{(|\vec{a}||\vec|)^2 - (\vec{a} \cdot \vec)^2}S=21?(∣a∣∣b∣)2?(a?b)2?
#include <bits/stdc++.h> using namespace std; int main() {double x1,y1,x2,y2,x3,y3,a_m,b_m,adotb,res;cin>>x1>>y1>>x2>>y2>>x3>>y3;a_m = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));//|a|b_m = sqrt((x3-x1)*(x3-x1) + (y3-y1)*(y3-y1));//|b|adotb = (x2-x1)*(x3-x1)+(y2-y1)*(y3-y1);//a點乘b res = 0.5 * sqrt(a_m*b_m*a_m*b_m-adotb*adotb);//結果 cout<<fixed<<setprecision(2)<<res<<endl;return 0; }解法2:用公式S=12∣x1y2+x2y3+x3y1?x1y3?x2y1?x3y2∣S=\frac{1}{2}|x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2|S=21?∣x1?y2?+x2?y3?+x3?y1??x1?y3??x2?y1??x3?y2?∣
#include <bits/stdc++.h> using namespace std; int main() {double x1,y1,x2,y2,x3,y3;cin>>x1>>y1>>x2>>y2>>x3>>y3;cout<<fixed<<setprecision(2)<<fabs((x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2))/2;return 0; }解法3:用海倫公式S=p(p?a)(p?b)(p?c)S = \sqrt{p(p-a)(p-b)(p-c)}S=p(p?a)(p?b)(p?c)?
#include <bits/stdc++.h> using namespace std; int main() {double x1,y1,x2,y2,x3,y3,a,b,c,p;cin>>x1>>y1>>x2>>y2>>x3>>y3;a = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));//|a|b = sqrt((x3-x1)*(x3-x1) + (y3-y1)*(y3-y1));//|b|c = sqrt((x3-x2)*(x3-x2) + (y3-y2)*(y3-y2));//|c|p = (a + b + c)/2;//p半周長 cout<<fixed<<setprecision(2)<<sqrt(p*(p-a)*(p-b)*(p-c))<<endl;return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1034:计算三角形面积 | OpenJudge NOI 1.3 17的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1113:不与最大数相
- 下一篇: 信息学奥赛一本通 1083:计算星期几