C#,计算几何,贝塞耳插值(Bessel‘s interpolation)的算法与源代码

本文主要是介绍C#,计算几何,贝塞耳插值(Bessel‘s interpolation)的算法与源代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Friedrich Wilhelm Bessel

1 贝塞耳插值(Bessel's interpolation)

首先要区别于另外一个读音接近的插值算法:贝塞尔插值(Bézier)。

(1)读音接近,但不是一个人;

(2)一个是多项式(整体)插值,一个是分段插值;

(3)一个已经很少用,一个还是应用主力;

贝塞耳插值(Bessel's interpolation)是一种等距节点插值方法,适用于被插值节点z位于插值区间中部且位于两相邻插值点的中点附近的情况。

2 文本格式源代码

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public partial class TPoint
    {
        public double X { get; set; } = 0.0;
        public double Y { get; set; } = 0.0;
        public double Z { get; set; } = 0.0;
        public TPoint()
        {
        }
        public TPoint(double x, double y)
        {
            X = x; Y = y;
        }
        public TPoint(double x, double y, double z)
        {
            X = x; Y = y; Z = z;
        }

        public double Distance(TPoint p1)
        {
            double ds = (p1.X - this.X) * (p1.X - this.X) + (p1.Y - this.Y) * (p1.Y - this.Y);
            if (ds <= float.Epsilon) return 0.0;
            return Math.Sqrt(ds);
        }

        public static double Distance(TPoint p1, TPoint p2)
        {
            double ds = (p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y);
            if (ds <= float.Epsilon) return 0.0;
            return Math.Sqrt(ds);
        }
    }

    public static partial class Algorithm_Gallery
    {
        private static double U_Calculate(double u, int n)
        {
            if (n == 0)
            {
                return 1.0;
            }
            double temp = u;
            for (int i = 1; i <= n / 2; i++)
            {
                temp = temp * (u - i);
            }
            for (int i = 1; i < n / 2; i++)
            {
                temp = temp * (u + i);
            }
            return temp;
        }

        private static int Fact(int n)
        {
            int f = 1;
            for (int i = 2; i <= n; i++)
            {
                f *= i;
            }
            return f;
        }

        public static double Bessel_Interpolation(List<TPoint> points, double value)
        {
            int n = points.Count;
            double[,] y = new double[n, n];
            for (int i = 0; i < n; i++)
            {
                y[i, 0] = points[i].Y;
            }
            for (int i = 1; i < n; i++)
            {
                for (int j = 0; j < n - i; j++)
                {
                    y[j, i] = y[j + 1, i - 1] - y[j, i - 1];
                }
            }

            double sum = (y[2, 0] + y[3, 0]) / 2;

            int k;
            if ((n % 2) > 0)
            {
                k = n / 2;
            }
            else
            {
                k = (n / 2) - 1; // origin for even
            }
            double u = (value - points[k].X) / (points[1].X - points[0].X);

            for (int i = 1; i < n; i++)
            {
                if ((i % 2) > 0)
                {
                    sum = sum + ((u - 0.5) * U_Calculate(u, i - 1) * y[k, i]) / Fact(i);
                }
                else
                {
                    sum = sum + (U_Calculate(u, i) * (y[k, i] + y[--k, i]) / (Fact(i) * 2));
                }
            }
            return sum;
        }
    }
}
 

POWER BY TRUFFER.CN
BY 315SOFT.COM

3 代码格式

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public partial class TPoint{public double X { get; set; } = 0.0;public double Y { get; set; } = 0.0;public double Z { get; set; } = 0.0;public TPoint(){}public TPoint(double x, double y){X = x; Y = y;}public TPoint(double x, double y, double z){X = x; Y = y; Z = z;}public double Distance(TPoint p1){double ds = (p1.X - this.X) * (p1.X - this.X) + (p1.Y - this.Y) * (p1.Y - this.Y);if (ds <= float.Epsilon) return 0.0;return Math.Sqrt(ds);}public static double Distance(TPoint p1, TPoint p2){double ds = (p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y);if (ds <= float.Epsilon) return 0.0;return Math.Sqrt(ds);}}public static partial class Algorithm_Gallery{private static double U_Calculate(double u, int n){if (n == 0){return 1.0;}double temp = u;for (int i = 1; i <= n / 2; i++){temp = temp * (u - i);}for (int i = 1; i < n / 2; i++){temp = temp * (u + i);}return temp;}private static int Fact(int n){int f = 1;for (int i = 2; i <= n; i++){f *= i;}return f;}public static double Bessel_Interpolation(List<TPoint> points, double value){int n = points.Count;double[,] y = new double[n, n];for (int i = 0; i < n; i++){y[i, 0] = points[i].Y;}for (int i = 1; i < n; i++){for (int j = 0; j < n - i; j++){y[j, i] = y[j + 1, i - 1] - y[j, i - 1];}}double sum = (y[2, 0] + y[3, 0]) / 2;int k;if ((n % 2) > 0){k = n / 2;}else{k = (n / 2) - 1; // origin for even}double u = (value - points[k].X) / (points[1].X - points[0].X);for (int i = 1; i < n; i++){if ((i % 2) > 0){sum = sum + ((u - 0.5) * U_Calculate(u, i - 1) * y[k, i]) / Fact(i);}else{sum = sum + (U_Calculate(u, i) * (y[k, i] + y[--k, i]) / (Fact(i) * 2));}}return sum;}}
}

这篇关于C#,计算几何,贝塞耳插值(Bessel‘s interpolation)的算法与源代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711124

相关文章

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.