找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1303|回复: 2

[原创] 练习 Lisp定义数学函数

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-4-28 07:25:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 csharp 于 2014-4-28 07:33 编辑

以Asin为例
  1.         [LispFunction("Math_Asin")]
  2.         public Object Math_Asin (ResultBuffer rb)
  3.         {
  4.             Object ret = null;
  5.             if (rb != null );
  6.             {
  7.                 TypedValue[] tv = rb.AsArray();
  8.                  if (tv.Count( ) > 0)
  9.                 {
  10.                     if (tv.Count() == 1)
  11.                     {
  12.                         switch (tv[0].TypeCode)
  13.                         {
  14.                             case 5001:
  15.                                 double i = (double)tv[0].Value;
  16.                                  ret = System.Math.Asin(i);
  17.                                 break;
  18.                             case 5003:
  19.                                 short ii = (short)tv[0].Value;
  20.                                 double d = ii;
  21.                                 ret = System.Math.Asin(d);
  22.                                 break;
  23.                             default:
  24.                                 ret = tv;
  25.                                 break;
  26.                         }
  27.                     }
  28.                     else
  29.                     {
  30.                         ret = rb;
  31.                     }
  32.                 }
  33.             }
  34.             return ret;
  35.         }

合理值为 -1.0 ~ 1.0 ,或者 -1 ~ 1,C# 中 .5  是非法数据,0 不可省略,Autolisp 定义中也是如此
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-4-30 06:16:36 | 显示全部楼层
[ 本帖最后由 csharp 于 2014-4-30 06:17 编辑 ]\n\n继续学习,也许还可以简化
  1.         Object  GetValue(ResultBuffer rb , int i)
  2.         {
  3.             TypedValue[] values = rb.AsArray();
  4.             Object ret = null;
  5.             double num;
  6.             if (values.Count() == 1)
  7.             {
  8.                 if (values[0].TypeCode == (int) LispDataType.Int16 | values[0].TypeCode == (short) LispDataType.Double)
  9.                 {
  10.                     num = System.Convert.ToDouble(values[0].Value);
  11.                 }
  12.                 else
  13.                 {
  14.                     return null;
  15.                 }
  16.             }
  17.             else
  18.             {
  19.                 return null;
  20.             }
  21.             switch (i)
  22.             {
  23.                 case  1:
  24.                     ret = Math.Asin(num);
  25.                     break;
  26.                 case 2:
  27.                     ret = Math.Acos(num);
  28.                     break;
  29.                 case 3:
  30.                     ret = Math.Tan(num);
  31.                     break;
  32.                 case 4:
  33.                     ret = Math.Sinh(num);
  34.                     break;
  35.             }
  36.             return ret;
  37.         }
  38.         //反正弦函数
  39.         [LispFunction("math_asin")]
  40.         public Object MathAtan(ResultBuffer rb)
  41.         {
  42.             Object ret = null;
  43.             if (rb != null)ret = (GetValue(rb , 1));
  44.             return ret;
  45.         }
  46.         //反余弦函数
  47.         [LispFunction("math_acos")]
  48.         public Object MathAcos(ResultBuffer rb)
  49.         {
  50.             Object ret = null;
  51.             if (rb != null) ret =  (GetValue(rb, 2));
  52.            return ret;
  53.         }
  54.         //正切函数
  55.         [LispFunction("math_tan")]
  56.         public Object MathTan(ResultBuffer rb)
  57.         {
  58.             Object ret = null;
  59.             if (rb != null) ret = (GetValue(rb, 3));
  60.             return ret;
  61.         }
  62.         //指定角度的双曲正弦值
  63.         [LispFunction("math_sinh")]
  64.         public Object MathSinh(ResultBuffer rb)
  65.         {
  66.             Object ret = null;
  67.             if (rb != null) ret = (GetValue(rb, 4));
  68.             return ret;
  69.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-3 07:59:34 | 显示全部楼层
这样写就对了,虽然还不太理解
  1.         static Object MathMethod(String methodName, ResultBuffer rb)
  2.         {
  3.             TypedValue[] values = rb.AsArray();
  4.             if (rb != null)
  5.             {
  6.                 if (values.Count() == 1 && values[0].TypeCode == (int)LispDataType.Double)
  7.                 {
  8.                     Double num = (Double)Convert.ToDouble(values[0].Value);
  9.                     Type t = Type.GetType("System.Math");
  10.                     Type[] parameterTypes = new Type[1];
  11.                     parameterTypes[0] = Type.GetType("System.Double");
  12.                     MethodInfo method = t.GetMethod(methodName, parameterTypes);
  13.                     return (Object)method.Invoke(null, new Object[] { num });
  14.                 }
  15.                 else
  16.                 {
  17.                     return null;
  18.                 }
  19.             }
  20.             else
  21.             {
  22.                 return null;
  23.             }
  24.         }
  25.         //反正弦函数
  26.         [LispFunction("math_asin")]
  27.         public Object MathAtan(ResultBuffer rb)
  28.         {
  29.             return MathMethod("Asin", rb);
  30.         }
  31.         //反余弦函数
  32.         [LispFunction("math_acos")]
  33.         public Object MathAcos(ResultBuffer rb)
  34.         {
  35.             return MathMethod("Acos", rb);
  36.         }
  37.         //正切函数
  38.         [LispFunction("math_tan")]
  39.         public Object MathTan(ResultBuffer rb)
  40.         {
  41.             return MathMethod( "Tan",rb);
  42.         }
  43.         //指定角度的双曲正弦值
  44.         [LispFunction("math_sinh")]
  45.         public Object MathSinh(ResultBuffer rb)
  46.         {
  47.             return MathMethod( "Sinh",rb);
  48.         }
  49.         //指定角度的双曲余弦值
  50.         [LispFunction("Math_Cosh")]
  51.         public Object MathCosh(ResultBuffer rb)
  52.         {
  53.             return MathMethod("Cosh", rb);
  54.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-28 09:46 , Processed in 0.359396 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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