C# 定积分求周长面积原理 代码实现
前言:
前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样。
所以来巩固加强一下记忆。一开始的时候,求周长嘛,找公式呗,什么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# 定积分求周长面积原理 代码实现相关推荐
- c#求长方形的面积周长公式_C# 定积分求周长面积原理 代码实现
前言:前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样的吧. 所以来巩固加强一下记忆. 一开始的时候,求周长嘛,找公 ...
- c#求三角形面积周长公式_C# 定积分求周长面积原理 代码实现
前言: 前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样. 所以来巩固加强一下记忆.一开始的时候,求周长嘛,找公式呗 ...
- **python入门实战**-已知圆的半径求周长面积
python入门实战-已知圆的半径求周长面积 输入半径计算圆的周长和面积 这边的知识点:调用math库里面的π值,以及数据类型. 下面展示一些 代码. import math p=math.pi a= ...
- Java6面向对象编程创建一个矩形类, 求周长 面积
package job; /** */ import java.util.Scanner; public class Space { /* 面向对象编程创建一个矩形类, 求周长 面积 */ publi ...
- python海伦公式求三角形面积程序流程图_《求三角形面积程序代码实现》教学设计...
一.教学目标: 1 .能说出能否构成三角形的条件,并了解其 VB 表达式:能读懂求解三角形面积的程序流程图: 2 .了解编写程序代码的一般步骤,了解变量定义, IF 语句的基本语法格式: 3 .掌握 ...
- c++ 求四边形面积和周长_c++-面向对象类的示例-求周长面积,判断体积相等-文件操作和一般操作...
面向对象编程示例:求周长和面积 #define _CRT_SECURE_NO_WARNINGS #include using namespace std; //圆的周长 double getCircl ...
- java求三角形周长 面积_Java代码计算三角形的周长和面积
2015-01-05 06:30:01 阅读( 244 ) import java.util.*; public class Sanjiaoxing { /** * @param args */ pu ...
- Java 知半径,求周长面积
import java.util.Scanner; public class Yuan {public static void main(String[] args) {System.out.prin ...
- C#实例——求周长面积
1.2编写一个控制台应用程序,输入三角形或者长方形的边长,计算其周长和面积并输出. using System;namespace _1._2 {class Program{static void Ma ...
最新文章
- Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)
- 游戏产品开发流程-leangoo
- Linux文件系统的实现 (图文并茂,比较好)
- Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度
- python反射详解
- ResNet Keras实现
- “10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
- 如何判定选择的日期与当前日期的前后关系
- VIVADO常见警告、错误及解决方法
- laravel 模型事件几种用法
- 一次性密码本(绝对无法破译)
- 2016年软件评测师真题精选
- 数据结构之图的基础知识(二)
- re之ida和OllyDbg的使用与代码分析
- Photoshop设计中用羽化消除边缘锯齿
- 飞腾发布高可扩展芯片腾云S2500 开启多路服务新时代
- Delphi实现多线程
- Contiki 系统框架
- 项目奖金要不要与合同额直接相关?
- C语言实现自动出题、单词拼写等功能,附带管理员模式
热门文章
- JavaScript China城市联动
- NB模组中序列号,IMEI,IMSI,ICCID的含义(一些知识科普)
- CVE-2017-0144 EternalBlue(永恒之蓝)漏洞分析
- 【技术类】【遥感入门系列】2、遥感成像与遥感影像特征
- 2020第二届网鼎杯 青龙组部分writeup
- 负面信息处理的有效途径有哪些?负面信息对企业的影响
- 防盗链Nginx设置图片防盗链
- 谷歌眼镜开发Mirror API之API使用案例
- spring-bean对象创建销毁顺序depend-on 干预
- [C/C++学习] restrict 关键字