c#求长方形的面积周长公式_C# 定积分求周长面积原理 代码实现
前言:前些日子,因為工作原因,接觸到了求解曲線周長,真的是搞了很久,學生時代真的很簡單,但是如今的我來說,忘記了....很多人跟我應該一樣的吧。
所以來鞏固加強一下記憶。
一開始的時候,求周長嘛,找公式唄,什么matlab呀,亂七八糟的,暈,最后找到了可能還不能滿足項目的需求,因為可能計算量過大。(我就是這樣子的,靈活性相對較低)
還有就是明明自己可以用代碼實現(xiàn),為什么非要插件,工具吶,這么不自信的?
所以,“一怒之下”,自己去看了一下定積分求周長的原理,自己還是用代碼來實現(xiàn)吧。
(以下內(nèi)容純是個人這段時間的理解,如果有錯誤的,歡迎指正出來。)
首先需要說說兩個概念,曲線和周長,因為我們要求他們嘛。
曲線:
這個世界,有曲線嗎?我的回答是,沒有。那...這...曲線是由無數(shù)個直接拼接而成。再準確的說無數(shù)個很短的曲線拼接而成。
(如果您徹底理解了這句話,后面就不用看了,基本就沒了。)
面積:
與周長的概念類似,沒有正方形,沒有圓形。只有三角形,所有的圖形都是三角形拼接而成。而兩個三角形拼成長方形,而我們的面積是由無數(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ù)量,可以理解為精細度,值越大,計算量越大,數(shù)據(jù)越準確,這個可看你項目需求精細度,通過該變量
可在實現(xiàn)最少的計算量情況,實現(xiàn)你要的效果。
eachX,就是你的曲線被分成N份,每份的長度。
curY,當前點的y軸分量
previousY,上一個點的y軸分量,
curLength,即如圖
(剩余的部分,代碼里面含解釋,個人喜歡放在源碼里面,原生的,純24k原創(chuàng))
1 int testCount = 1000; //所謂的測試細致度吧,可動態(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 //注:如果對曲線靈活性要求很高,推薦使用貝塞爾曲線。95 //詳情可參考:
96 }
補充:這邊,我對貝塞爾曲線做一下補充吧。因為我因為什么冪函數(shù),指數(shù)函數(shù)遇到的肯,因為這些函數(shù)畢竟還不是那么靈活,都具有一定“規(guī)律”。
貝塞爾曲線的靈活,受6個參數(shù)控制,三個點嘛。(二維空間)
詳情可參考這篇:http://www.sohu.com/a/118656687_466876
總結
以上是生活随笔為你收集整理的c#求长方形的面积周长公式_C# 定积分求周长面积原理 代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: warning MSB8028: The
- 下一篇: C#使用GDI+绘制高质量图和字体