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;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472928.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【二十一】【C++】模版特化

模版的参数 类型模板参数 类型模板参数允许在定义模板时指定一个占位符&#xff0c;这个占位符在模板实例化时将被具体的类型替换。这使得我们能够编写与类型无关的通用代码。例如&#xff0c;标准库中的 std::vector<T> 使用一个类型模板参数 T&#xff0c;这意味着你…

transformer-Attention is All You Need(一)

1. 为什么需要transformer 循环模型通常沿输入和输出序列的符号位置进行因子计算。通过在计算期间将位置与步骤对齐&#xff0c;它们根据前一步的隐藏状态和输入产生位置的隐藏状态序列。这种固有的顺序特性阻止了训练样本内的并行化&#xff0c;这在较长的序列长度上变得至关重…

透光卓越,光耦继电器的独特特点全面解析

光耦继电器作为电子控制系统中的核心元件&#xff0c;其光电隔离技术为其独特之处。通过光电隔离技术&#xff0c;光耦继电器实现了输入和输出之间的电气隔离&#xff0c;有效阻止了高电压与低电压之间的直接接触。这项技术不仅提高了系统的安全性&#xff0c;还有效减少了电气…

【图论经典题目讲解】CF786B - Legacy 一道线段树优化建图的经典题目

C F 786 B − L e g a c y \mathrm{CF786B - Legacy} CF786B−Legacy D e s c r i p t i o n \mathrm{Description} Description 给定 1 1 1 张 n n n 个点的有向图&#xff0c;初始没有边&#xff0c;接下来有 q q q 次操作&#xff0c;形式如下&#xff1a; 1 u v w 表示…

计算机网络之网络安全

文章目录 1. 网络安全概述1.1 安全威胁1.1.1 被动攻击1.1.2 主动攻击 1.2 安全服务 2. 密码学与保密性2.1 密码学相关基本概念2.2 对称密钥密码体制2.2.1 DES的加密方法2.2.2.三重DES 2.3 公钥密码体制 3. 报文完整性与鉴别3.1 报文摘要和报文鉴别码3.1.1 报文摘要和报文鉴别码…

360可视门铃双摄版恢复案例

家用的智能摄像头恢复了很多&#xff0c;但是可视门铃的恢复却是第一次&#xff0c;现代社会似乎已经全方位处于监控网络之下。360的产品很多&#xff0c;可视门铃只是其众多品牌中的一个&#xff0c;这个案例能让我们窥视到360的开发小精产品的理念。 故障存储: 64G TF卡/ex…

Unity 2D Spine 外发光实现思路

Unity 2D Spine 外发光实现思路 前言 对于3D骨骼&#xff0c;要做外发光可以之间通过向法线方向延申来实现。 但是对于2D骨骼&#xff0c;各顶点的法线没有向3D骨骼那样拥有垂直于面的特性&#xff0c;那我们如何做2D骨骼的外发光效果呢&#xff1f; 理论基础 我们要知道&a…

optee CA/TA flow

以 TEEC_InvokeCommand 为例 CA—normal world EL0 //imx-optee-client\libteec\src\tee_client_api.c TEEC_InvokeCommandioctl(session->ctx->fd, TEE_IOC_INVOKE, &buf_data)通过syscall陷入内核态driver linux driver—normal world EL1 tee_ioctl // drive…

力扣题目训练(11)

2024年2月4日力扣题目训练 2024年2月4日力扣题目训练455. 分发饼干459. 重复的子字符串463. 岛屿的周长146. LRU 缓存147. 对链表进行插入排序76. 最小覆盖子串 2024年2月4日力扣题目训练 2024年2月4日第十一天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括简…

VMware Workstation 17.0 虚拟机安装MS-DOS 7.1完整详细步骤图文教程

VMware Workstation 17.0 虚拟机安装MS-DOS 7.1完整详细步骤图文教程 一、配置MS-DOS虚拟机机器环境二、安装MS-DOS磁盘操作系统 一、配置MS-DOS虚拟机机器环境 1.打开VMware Workstation Pro 2.新建虚拟机 3.建议选择【典型】&#xff0c;之后点击【下一步】 关于【自定义…

分省年度数据集(1990-2021年)

一、数据介绍 数据名称&#xff1a;分省年度数据集&#xff08;1990-2021年&#xff09; 数据来源&#xff1a;国家统计局-分省年度数据 数据范围&#xff1a;1990-2021年&#xff0c;包括31个省份 指标数量 &#xff1a;2981个指标 数据整理&#xff1a;自主整理 更新时…

简单的edge浏览器插件开发记录

今天在浏览某些网页的时候&#xff0c;我想要屏蔽掉某些信息或者修改网页中的文本的颜色、背景等等。于是在浏览器的控制台中直接输入JavaScript操作dom完成了我想要的功能。但是每次在网页之间跳转该功能都会消失&#xff0c;我需要反复复制粘贴js脚本&#xff0c;无法实现自动…