前言:

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

所以来巩固加强一下记忆。一开始的时候,求周长嘛,找公式呗,什么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         /// <summary>
 3         /// 通过已知周长,获取x轴的分量
 4         /// </summary>
 5         /// <param name="length"></param>
 6         /// <returns></returns>
 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         /// <summary>
29         /// start到end范围内的面积
30         /// </summary>
31         /// <param name="start"></param>
32         /// <param name="end"></param>
33         /// <returns></returns>
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         /// <summary>
52         /// 通过已知面积,获取x轴分量
53         /// </summary>
54         /// <param name="aera"></param>
55         /// <returns></returns>
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         /// <summary>
75         /// 通过x分量,得出y的值。(好像意义不大,但是好像可能有些人不是很理解,写给某些人看的,一目了然)
76         /// </summary>
77         /// <param name="x"></param>
78         /// <returns></returns>
79         double GetYByX(float x)
80         {
81             return ArcFunction(x);
82         }
83
84
85         /// <summary>
86         /// 核心控制函数。
87         /// </summary>
88         /// <param name="x"></param>
89         /// <returns></returns>
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

C# 定积分求周长面积原理 代码实现相关推荐

  1. c#求长方形的面积周长公式_C# 定积分求周长面积原理 代码实现

    前言:前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样的吧. 所以来巩固加强一下记忆. 一开始的时候,求周长嘛,找公 ...

  2. c#求三角形面积周长公式_C# 定积分求周长面积原理 代码实现

    前言: 前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样. 所以来巩固加强一下记忆.一开始的时候,求周长嘛,找公式呗 ...

  3. **python入门实战**-已知圆的半径求周长面积

    python入门实战-已知圆的半径求周长面积 输入半径计算圆的周长和面积 这边的知识点:调用math库里面的π值,以及数据类型. 下面展示一些 代码. import math p=math.pi a= ...

  4. Java6面向对象编程创建一个矩形类, 求周长 面积

    package job; /** */ import java.util.Scanner; public class Space { /* 面向对象编程创建一个矩形类, 求周长 面积 */ publi ...

  5. python海伦公式求三角形面积程序流程图_《求三角形面积程序代码实现》教学设计...

    一.教学目标: 1 .能说出能否构成三角形的条件,并了解其 VB 表达式:能读懂求解三角形面积的程序流程图: 2 .了解编写程序代码的一般步骤,了解变量定义, IF 语句的基本语法格式: 3 .掌握 ...

  6. c++ 求四边形面积和周长_c++-面向对象类的示例-求周长面积,判断体积相等-文件操作和一般操作...

    面向对象编程示例:求周长和面积 #define _CRT_SECURE_NO_WARNINGS #include using namespace std; //圆的周长 double getCircl ...

  7. java求三角形周长 面积_Java代码计算三角形的周长和面积

    2015-01-05 06:30:01 阅读( 244 ) import java.util.*; public class Sanjiaoxing { /** * @param args */ pu ...

  8. Java 知半径,求周长面积

    import java.util.Scanner; public class Yuan {public static void main(String[] args) {System.out.prin ...

  9. C#实例——求周长面积

    1.2编写一个控制台应用程序,输入三角形或者长方形的边长,计算其周长和面积并输出. using System;namespace _1._2 {class Program{static void Ma ...

最新文章

  1. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)
  2. 游戏产品开发流程-leangoo
  3. Linux文件系统的实现 (图文并茂,比较好)
  4. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度
  5. python反射详解
  6. ResNet Keras实现
  7. “10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
  8. 如何判定选择的日期与当前日期的前后关系
  9. VIVADO常见警告、错误及解决方法
  10. laravel 模型事件几种用法
  11. 一次性密码本(绝对无法破译)
  12. 2016年软件评测师真题精选
  13. 数据结构之图的基础知识(二)
  14. re之ida和OllyDbg的使用与代码分析
  15. Photoshop设计中用羽化消除边缘锯齿
  16. 飞腾发布高可扩展芯片腾云S2500 开启多路服务新时代
  17. Delphi实现多线程
  18. Contiki 系统框架
  19. 项目奖金要不要与合同额直接相关?
  20. C语言实现自动出题、单词拼写等功能,附带管理员模式

热门文章

  1. JavaScript China城市联动
  2. NB模组中序列号,IMEI,IMSI,ICCID的含义(一些知识科普)
  3. CVE-2017-0144 EternalBlue(永恒之蓝)漏洞分析
  4. 【技术类】【遥感入门系列】2、遥感成像与遥感影像特征
  5. 2020第二届网鼎杯 青龙组部分writeup
  6. 负面信息处理的有效途径有哪些?负面信息对企业的影响
  7. 防盗链Nginx设置图片防盗链
  8. 谷歌眼镜开发Mirror API之API使用案例
  9. spring-bean对象创建销毁顺序depend-on 干预
  10. [C/C++学习] restrict 关键字