前言:

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

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

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

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

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

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

曲线:

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

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

面积:

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

  

(定积分原理的参考图)

源码实现: 

double GetLength(float start,float end)
{
double sumLength = ; float eachX = (end - start) / testCount;
for (int i = ; i < testCount;i++ )
{ double curY =ArcFunction(start+eachX*i);
double previousY = ArcFunction(start+eachX*(i-));
//根据c²=a²+b²
double curLength = Math.Sqrt(Math.Pow(eachX, ) + Math.Pow(curY - previousY, ));
sumLength += curLength;
}
return sumLength;
}

   解释:

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

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

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

    curY,当前点的y轴分量

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

    curLength,即如图   

    

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

     int testCount = ; //所谓的测试细致度吧,可动态调控,你自己掌握。
/// <summary>
/// 通过已知周长,获取x轴的分量
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
double GetRateXByLength(double length)
{
float eachX = 1.0f;
for (int i = ; i < testCount; i++)
{
double curY = ArcFunction(eachX * i);
double previousY = ArcFunction(eachX * (i - ));
double curLength = Math.Sqrt(Math.Pow(eachX, ) + Math.Pow(curY - previousY, ));
length -= curLength;
if(length<=)
{
return i * eachX;
}
}
return testCount * eachX;
} /// <summary>
/// start到end范围内的面积
/// </summary>
/// <param name="start"></param>
/// <param name="end"></param>
/// <returns></returns>
double GetArea(float start,float end)
{
double sumAera = ; float eachX = (end - start) / testCount;
for (int i = ; i < testCount; i++)
{
double curY = ArcFunction(start + eachX * i);
//面积 = 长*宽
double curAera = curY * eachX;
sumAera += curAera;
}
return sumAera;
} /// <summary>
/// 通过已知面积,获取x轴分量
/// </summary>
/// <param name="aera"></param>
/// <returns></returns>
double GetRateXByAera(double aera)
{
float eachX = 1.0f;
for (int i = ; i < testCount; i++)
{
double curY = ArcFunction(eachX * i);
double curAera = curY * eachX;
aera -= curAera;
if(aera<=)
{
return i * eachX;
}
}
return testCount*eachX;
} /// <summary>
/// 通过x分量,得出y的值。(好像意义不大,但是好像可能有些人不是很理解,写给某些人看的,一目了然)
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
double GetYByX(float x)
{
return ArcFunction(x);
} /// <summary>
/// 核心控制函数。
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
double ArcFunction(float x)
{
return Math.Pow(x, ); //这边我用幂函数来测试。各位爷可以换其他函数啊。 //注:如果对曲线灵活性要求很高,推荐使用贝塞尔曲线。
//详情可参考:
}

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

贝塞尔曲线的灵活,受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²)    

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

C# 定积分求周长&面积原理 代码实现的更多相关文章

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

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

  2. 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

    package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...

  3. 按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有确定位

    package com.hanqi.test; public class Rect { ; ; public double getWidth() { return width; } public vo ...

  4. C#使用多态求方形面积周长和圆的面积周长

    class class1 { public static void Main(string[] args) { //使用多态求矩形面积与周长和圆的面积与周长 Shape cl = ); double ...

  5. java求三角形面积以及周长---封装

    /*时间: 2012-10-08作者: 烟大程序要求: 1.封装一类三角形对象Triangle,该类对象具有三条边的属性, 具有初始化三角形的功能.修改边长的功能.判断三条边能否构成三角形的功能. 求 ...

  6. 微信群里一道六年级数学题,求阴影面积,那我只能用python代码了

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  7. 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

    package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public ...

  8. UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)

    Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...

  9. (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状;2.定义构造方法,给形状赋值;3.定义两个抽象方法:计算面积和计算周长;4.定义一个显示方法:显示图像形状,周长,面积;

    题目显示不全,完整题目描述: (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状:2.定义构造方法,给形状赋值:3.定义两个抽象方法:计算面积和计算周长:4.定义一个显示方法:显示图像 ...

随机推荐

  1. hive-jdbc获取查询日志慢的问题发现与解决

    1.问题描述: 数据平台的临时查询一直有一个问题,就是日志获取太慢了,每次都是和结果一块出来的,这就非常影响用户的体验,半天都没任何输出.另一个是Beeline客户端不一致,beeline客户端每次都 ...

  2. 用JavaScript实现动态省市县三级联动

  3. Java中Set集合是如何实现添加元素保证不重复的?

    Java中Set集合是如何实现添加元素保证不重复的? Set集合是一个无序的不可以重复的集合.今天来看一下为什么不可以重复. Set是一个接口,最常用的实现类就是HashSet,今天我们就拿HashS ...

  4. 全球性WannaCry蠕虫勒索病毒感染前后应对措施

    前言:针对WannaCrypt勒索病毒的讨论和技术文章是铺天盖地,大量的技术流派,安全厂家等纷纷献计献策,有安全厂家开发各种安全工具,对安全生态来说是一个好事,但对个人未必就是好事,我们国家很多用户是 ...

  5. 部署上次的Hapi到Windows+Docker,WindowsDocker

    前言: 理论的就不多说了,具体的架构看图.web这里是上篇文章开发的Hapi服务,数据库Mysql,废话不多说,粗略的画了下,架构图如下: Mysql镜像拉取,配置 数据库镜像查找 docker se ...

  6. STM32 - SYSTICK(系统滴答定时器)

    SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...

  7. tarjan——cogs 1298 通讯问题

    1298. 通讯问题 ★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比 时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

  8. python 网路爬虫(二) 爬取淘宝里的手机报价并以价格排序

    今天要写的是之前写过的一个程序,然后把它整理下,巩固下知识点,并对之前的代码进行一些改进. 今天要爬取的是淘宝里的关于手机的报价的信息,并按照自己想要价格来筛选. 要是有什么问题希望大佬能指出我的错误 ...

  9. [Codeforces 606C]Sorting Railway Cars

    Description An infinitely long railway has a train consisting of n cars, numbered from 1 to n (the n ...

  10. 【USACO】电子游戏 有条件的背包

    题目描述 翰的奶牛玩游戏成瘾!本来约翰是想把她们拖去电击治疗的,但是他发现奶牛们在玩游戏后生产 了更多的牛奶,也就支持它们了. 但是,奶牛在选择游戏平台上的分歧很大:有些奶牛想买 Xbox 360 来 ...