明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 719|回复: 0

c#积分法求取缓和曲线切线支距坐标,适用于大偏角切线支距坐标。

[复制链接]
发表于 2023-12-16 10:54:40 | 显示全部楼层 |阅读模式
本帖最后由 flz0728 于 2023-12-16 10:56 编辑
  1. //定义被积函数
  2.         static double IntegrandCos(double l, double A)
  3.         { return Math.Cos(Math.Pow(l, 2) / (2 * A * A)); }
  4.         static double IntegrandSin(double l, double A)
  5.         { return Math.Sin(Math.Pow(l, 2) / (2 * A * A)); }

  6.         // 梯形法则进行数值积分
  7.         static double TrapezoidalRule(Func<double, double, double> integrand, double a, double b, int n, double A)
  8.         {
  9.             double h = (b - a) / n;
  10.             double sum = 0.5 * (integrand(a, A) + integrand(b, A));
  11.             for (int i = 1; i < n; i++)
  12.             { sum += integrand(a + i * h, A); }
  13.             return sum * h;
  14.         }
  15.         /// <summary>
  16.         /// 使用高斯-克朗罗德法则进行积分计算切线支距坐标
  17.         /// </summary>
  18.         /// <param name="l">缓和曲线长度</param>
  19.         /// <param name="A">缓和曲线参数</param>
  20.         /// <param name="n">分割的数量,越大计算越精确但是计算量越大</param>
  21.         /// <param name="x">切线支距X坐标</param>
  22.         /// <param name="y">切线支距Y坐标</param>
  23.         public void QXZJZBjifenX(double l, double A, int n, out double x, out double y)
  24.         {
  25.             x = 0;
  26.             y = 0;
  27.             // 使用高斯-克朗罗德法则进行积分计算

  28.             x = TrapezoidalRule(IntegrandCos, 0, l, n, A);
  29.             y = TrapezoidalRule(IntegrandSin, 0, l, n, A);

  30.         }
  31.       

  32.         /// <summary>
  33.         /// 根据缓和曲线长度和缓和曲线参数求缓和曲线的坐标增量
  34.         /// </summary>
  35.         /// <param name="l">缓和曲线长度</param>
  36.         /// <param name="A">缓和曲线参数</param>
  37.         /// <param name="X">X方向坐标增量</param>
  38.         /// <param name="Y">Y方向坐标增量</param>
  39.         public void Qzjzb(double l, double A, out double X, out double Y)
  40.         {

  41.             //X = l - Math.Pow(l, 5) / (40 * Math.Pow(A, 4)) + Math.Pow(l, 9) / (3456 * Math.Pow(A, 8)) - Math.Pow(l, 13) / (599040 * Math.Pow(A, 12));
  42.             // Y = Math.Pow(l, 3) / (6 * Math.Pow(A, 2)) - Math.Pow(l, 7) / (336 * Math.Pow(A, 6)) + Math.Pow(l, 11) / (42240 * Math.Pow(A, 10)) - Math.Pow(l, 15) / (9676800 * Math.Pow(A, 14));

  43.             QXZJZBjifenX(l, A, 10000, out X, out Y);

  44.         }
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 03:35 , Processed in 0.607354 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表