博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 定积分求周长&面积原理 代码实现
阅读量:4704 次
发布时间:2019-06-10

本文共 4609 字,大约阅读时间需要 15 分钟。

前言:

         前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样。

          所以来巩固加强一下记忆。一开始的时候,求周长嘛,找公式呗,什么matlab呀,乱七八糟的,晕,最后找到了可能还不能满足项目的需求,因为可能计算量过大。(我就是这样子的,灵活性相对较低)

          还有就是明明自己可以用代码实现,为什么非要插件,工具呐,这么不自信的?

          所以,“一怒之下”,自己去看了一下定积分求周长的原理,自己还是用代码来实现吧。

(以下内容纯是个人这段时间的理解,如果有错误的,欢迎指正出来。)

 

首先需要说说两个概念,曲线和周长,因为我们要求他们嘛。

曲线:

  这个世界,有曲线吗?我的回答是,没有。那...这...曲线是由无数个直接拼接而成。再准确的说无数个很短的曲线拼接而成。

(如果您彻底理解了这句话,后面就不用看了,基本就没了。)

 

面积:

  与周长的概念类似,没有正方形,没有圆形。只有三角形,所有的图形都是三角形拼接而成。而两个三角形拼成长方形,而我们的面积是由无数个长方形,拼接而成。

  

                (定积分原理的参考图)

 

源码实现: 

double GetLength(float start,float end)        {            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));                //根据c²=a²+b²                double curLength = Math.Sqrt(Math.Pow(eachX, 2) + Math.Pow(curY - previousY, 2));                sumLength += curLength;            }                return sumLength;        }

   解释:

             testCount,即自定义的测试数量,可以理解为精细度,值越大,计算量越大,数据越准确,这个可看你项目需求精细度,通过该变量

可在实现最少的计算量情况,实现你要的效果。

    eachX,就是你的曲线被分成N份,每份的长度。

    curY,当前点的y轴分量

    previousY,上一个点的y轴分量,

    curLength,即如图   

    

                                                      

                  (剩余的部分,代码里面含解释,个人喜欢放在源码里面,原生的,纯24k原创)   

1     int testCount = 1000; //所谓的测试细致度吧,可动态调控,你自己掌握。 2         ///  3         /// 通过已知周长,获取x轴的分量 4         ///  5         ///  6         /// 
7 double GetRateXByLength(double length) 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范围内的面积30 /// 31 /// 32 /// 33 ///
34 double GetArea(float start,float end)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 return sumAera;47 }48 49 50 51 /// 52 /// 通过已知面积,获取x轴分量53 /// 54 /// 55 ///
56 double GetRateXByAera(double aera)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(float x)80 {81 return ArcFunction(x);82 }83 84 85 /// 86 /// 核心控制函数。87 /// 88 /// 89 ///
90 double ArcFunction(float x)91 {92 return Math.Pow(x, 2); //这边我用幂函数来测试。各位爷可以换其他函数啊。93 94 //注:如果对曲线灵活性要求很高,推荐使用贝塞尔曲线。95 //详情可参考:96 }

 

 

补充:这边,我对贝塞尔曲线做一下补充吧。因为我因为什么幂函数,指数函数遇到的肯,因为这些函数毕竟还不是那么灵活,都具有一定“规律”。

贝塞尔曲线的灵活,受6个参数控制,三个点嘛。(二维空间)

 详情可参考这篇:http://www.sohu.com/a/118656687_466876

 

 

======================================= 2018年9月3日补充================================================================

        可以使用第三方插件:开源Math.Net进行数值积分。

        参考:https://www.cnblogs.com/asxinyu/p/4301017.html     

public static double OnClosedInterval(Func<double, double> f, double intervalBegin, double intervalEnd);

 

 

void Start () {        var result = Integrate.OnClosedInterval(TestFunc, 0, 24);         Debug.Log(result);	}    double TestFunc(double x)    {        return x * x;    }

 

  但是上述的result为面积,也是dy。

 

  再根据定积分求弧长公式:

              

       即:弧长 =  √(1+result²)    

===================================================================================================================

转载于:https://www.cnblogs.com/u3ddjw/p/8945782.html

你可能感兴趣的文章
ArcGIS客户端API中加载大量数据的几种解决办法(以Silverlight API为例)
查看>>
C# App.config 自定义 配置节
查看>>
Windows PowerShell
查看>>
几道前端的面试题
查看>>
进程间通信的四种方式
查看>>
Sentinel系统监控Redis主从节点
查看>>
Java设计模式之《享元模式》及应用场景
查看>>
TX2安装QT
查看>>
PHP使用curl替代file_get_contents
查看>>
iOS推送通知的实现步骤
查看>>
Webstorm通用设置
查看>>
ios实现程序切入后台,实现后台任务 (转自)
查看>>
组合数的求法 (n<=1e8 可以过来看)
查看>>
第二章:分支结构
查看>>
邮件详解
查看>>
【C++】C++自学旅程(3):函数与预处理
查看>>
浅析JavaScript的字符串查找函数:indexOf和search
查看>>
Doxygen+Graphviz用来画程序结构图
查看>>
jquery倾斜的动画导航菜单
查看>>
Android的AsyncTask类的解读 分类: Android ...
查看>>