c#求长方形的面积周长公式_C# 定积分求周长面积原理 代码实现
前言:前些日子,因?yàn)楣ぷ髟?#xff0c;接觸到了求解曲線周長,真的是搞了很久,學(xué)生時(shí)代真的很簡單,但是如今的我來說,忘記了....很多人跟我應(yīng)該一樣的吧。
所以來鞏固加強(qiáng)一下記憶。
一開始的時(shí)候,求周長嘛,找公式唄,什么matlab呀,亂七八糟的,暈,最后找到了可能還不能滿足項(xiàng)目的需求,因?yàn)榭赡苡?jì)算量過大。(我就是這樣子的,靈活性相對(duì)較低)
還有就是明明自己可以用代碼實(shí)現(xiàn),為什么非要插件,工具吶,這么不自信的?
所以,“一怒之下”,自己去看了一下定積分求周長的原理,自己還是用代碼來實(shí)現(xiàn)吧。
(以下內(nèi)容純是個(gè)人這段時(shí)間的理解,如果有錯(cuò)誤的,歡迎指正出來。)
首先需要說說兩個(gè)概念,曲線和周長,因?yàn)槲覀円笏麄兟铩?/p>
曲線:
這個(gè)世界,有曲線嗎?我的回答是,沒有。那...這...曲線是由無數(shù)個(gè)直接拼接而成。再準(zhǔn)確的說無數(shù)個(gè)很短的曲線拼接而成。
(如果您徹底理解了這句話,后面就不用看了,基本就沒了。)
面積:
與周長的概念類似,沒有正方形,沒有圓形。只有三角形,所有的圖形都是三角形拼接而成。而兩個(gè)三角形拼成長方形,而我們的面積是由無數(shù)個(gè)長方形,拼接而成。
(定積分原理的參考圖)
源碼實(shí)現(xiàn):
double GetLength(float start,floatend)
{double sumLength = 0;float eachX = (end - start) /testCount;for (int i = 1; i < testCount;i++)
{double curY =ArcFunction(start+eachX*i);double previousY = ArcFunction(start+eachX*(i-1));//根據(jù)c2=a2+b2
double curLength = Math.Sqrt(Math.Pow(eachX, 2) + Math.Pow(curY - previousY, 2));
sumLength+=curLength;
}returnsumLength;
}
解釋:
testCount,即自定義的測試數(shù)量,可以理解為精細(xì)度,值越大,計(jì)算量越大,數(shù)據(jù)越準(zhǔn)確,這個(gè)可看你項(xiàng)目需求精細(xì)度,通過該變量
可在實(shí)現(xiàn)最少的計(jì)算量情況,實(shí)現(xiàn)你要的效果。
eachX,就是你的曲線被分成N份,每份的長度。
curY,當(dāng)前點(diǎn)的y軸分量
previousY,上一個(gè)點(diǎn)的y軸分量,
curLength,即如圖
(剩余的部分,代碼里面含解釋,個(gè)人喜歡放在源碼里面,原生的,純24k原創(chuàng))
1 int testCount = 1000; //所謂的測試細(xì)致度吧,可動(dòng)態(tài)調(diào)控,你自己掌握。
2 ///
3 ///通過已知周長,獲取x軸的分量4 ///
5 ///
6 ///
7 double GetRateXByLength(doublelength)8 {9 float eachX = 1.0f;10 for (int i = 1; i < testCount; i++)11 {12 double curY = ArcFunction(eachX *i);13 double previousY = ArcFunction(eachX * (i - 1));14 double curLength = Math.Sqrt(Math.Pow(eachX, 2) + Math.Pow(curY - previousY, 2));15 length -=curLength;16 if(length<=0)17 {18 return i *eachX;19 }20 }21 return testCount *eachX;22 }23
24
25
26
27
28 ///
29 ///start到end范圍內(nèi)的面積30 ///
31 ///
32 ///
33 ///
34 double GetArea(float start,floatend)35 {36 double sumAera = 0;37
38 float eachX = (end - start) /testCount;39 for (int i = 1; i < testCount; i++)40 {41 double curY = ArcFunction(start + eachX *i);42 //面積 = 長*寬
43 double curAera = curY *eachX;44 sumAera +=curAera;45 }46 returnsumAera;47 }48
49
50
51 ///
52 ///通過已知面積,獲取x軸分量53 ///
54 ///
55 ///
56 double GetRateXByAera(doubleaera)57 {58 float eachX = 1.0f;59 for (int i = 1; i < testCount; i++)60 {61 double curY = ArcFunction(eachX *i);62 double curAera = curY *eachX;63 aera -=curAera;64 if(aera<=0)65 {66 return i *eachX;67 }68 }69 return testCount*eachX;70 }71
72
73
74 ///
75 ///通過x分量,得出y的值。(好像意義不大,但是好像可能有些人不是很理解,寫給某些人看的,一目了然)76 ///
77 ///
78 ///
79 double GetYByX(floatx)80 {81 returnArcFunction(x);82 }83
84
85 ///
86 ///核心控制函數(shù)。87 ///
88 ///
89 ///
90 double ArcFunction(floatx)91 {92 return Math.Pow(x, 2); //這邊我用冪函數(shù)來測試。各位爺可以換其他函數(shù)啊。93
94 //注:如果對(duì)曲線靈活性要求很高,推薦使用貝塞爾曲線。95 //詳情可參考:
96 }
補(bǔ)充:這邊,我對(duì)貝塞爾曲線做一下補(bǔ)充吧。因?yàn)槲乙驗(yàn)槭裁磧绾瘮?shù),指數(shù)函數(shù)遇到的肯,因?yàn)檫@些函數(shù)畢竟還不是那么靈活,都具有一定“規(guī)律”。
貝塞爾曲線的靈活,受6個(gè)參數(shù)控制,三個(gè)點(diǎn)嘛。(二維空間)
詳情可參考這篇:http://www.sohu.com/a/118656687_466876
總結(jié)
以上是生活随笔為你收集整理的c#求长方形的面积周长公式_C# 定积分求周长面积原理 代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: warning MSB8028: The
- 下一篇: FFmpeg入门详解之7:MediaIn