• QQ21031394

    工作时间

    周一至周五:9:30-18:30

    周末及节日:根据情况调休

  • 手机版二维码

    随时手机查素材

  • 扫描二维码

    加入官方QQ群

站长推荐
怪诞生 二级会员
  • 未知地域
  • 227发帖数
  • 23主题数
  • 1关注数
  • 9粉丝

[演示和教程] 常用数学公式,几何,字符串的函数大集合

[复制链接]
怪诞生 发表于 2020-3-7 20:27:02 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
提莫作坊QQ群:提莫作坊www.tbwlm.cn

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

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

x
这些函数紧紧是纯粹的算法,但是编程者会用到有些函数,我就来列举一些我平常碰到时,可能会去调用的函数。
一、代数问题
一些WE所没有的代数方面的函数。
1.简单的函数
下面这些函数都较为简单,只解释下参数和返回值
1)倒数
取函数的参数,返回参数的倒数
j/
function daoshu takes real x returns real
local real a
set a=1/x
return a
endfunction
/j
2)取平方函数
取函数的参数,返回参数的平方值
j/function pingfang takes real x returns real
local real a
set a=x*x
return a
endfunction
/j
3)弧度转成角度
取一个弧度值转换成对应的角度返回。
j/
function pie2o takes real hudu returns real
local real a
set a=(hudu/bj_PI)*180//=====bj_PI是常数π
return a
endfunction
/j
4)角度转成弧度
取一个角度值转换成对应的弧度返回
j/
function o2pie takes real jiaodu returns real
local real a
set a=(jiaodu/180)*bj_PI
return a
endfunction
/j
5)判断一个正整数是否为质数
取一个整数,转换成自身的绝对值,并检验是否为质数,返回相应真值
j/
function iszhishu takes integer n returns boolean
local integer i=1
set n=IAbsBJ(n)
loop
exitwhen (i==n)
set i=i+1
if (ModuloInteger(n,i)==0) then//取模运算,看余数是否为0
return false
endif
endloop
return true
endfunction
/j

2.中等难度的函数
有一定的难度,做一些简要的说明(主要是基本思路和方法)
1)解二次方程
输入二次方程系数,返回真值。true表示有实根,false表示不是二次方程或者没有实根。
先判断系数a,为0,则不是二次方程。不为0,判断delta,delta小于0没有实根。delta=0,有两个相等的实根。
delta大于0,有两个实根。用公式法计算根的数值。
j/
function ercifangchen takes real a,real b,real c returns boolean
local real delta=pingfang(b)-4*a*c
if (a==0) then                     //a为0,不是二次方程
return false
else
if (delta==0) then                //=======delta为0,有两个相等的实根
set udg_erci[0]=RSignBJ(b/(2*a))
set udg_erci[1]=udg_erci[0]
elseif (delta>0) then             //====利用公式法计算方程的两根
set udg_erci[0]=(SquareRoot(delta)-b)/(2*a)
set udg_erci[1]=(RSignBJ(SquareRoot(delta))-b)/(2*a)
else                              //====delta小于0,没有实数根
return false
endif
endif
return true
endfunction
/j
2)对数函数
wei函数取需要求对数的值和调整后的比对值还有相应的调整位数(该参数为整数)作为参数,返回该位调整后的数值。
wei函数用来对不同位进行调整,调整到刚好的位置返回其值。一个循环完成都没有符合的,返回-1,表示需要进位
此只用于整数部分,小数部分由于每次前一位都已做好调整,不会返回-1值。
j/
function wei takes real b,real t, integer weishu returns integer
local integer i=1
loop
exitwhen (i>10)
set t=t+Pow(0.1,I2R(weishu))     //=====进行对应位的数字调整
if (Pow(10.00,t)>b) then        //=====用调整后的数字进行比对,满足条件则返回前一个调整值。
return i-1
endif
set i=i+1
endloop
return -1                     //======循环一个轮回后还不满足返回-1
endfunction
/j
lg是以十为底的对数函数,取要求对数的值,返回对数值
分情况计算,b小于0不合法,b在1,10之间,b大于10,b在0,1之间。
j/
function lg takes real b returns real
local real t=0
local integer i=1
local real m=0
if (b==1) then
return 0.00
endif
if (b<=0) then                    //=====b<0不合法
call DoNothing()
elseif ((b>1)and(b<10)) then      //======1<b<10,对数值在0,1之间。
loop
exitwhen (i>4)                    //=====从小数一位到四位,逐一进行微调
if (wei(b,t,i)>0) then
set t=t+I2R(wei(b,t,i))*Pow(0.1,I2R(i))
endif
set i=i+1
endloop
elseif (b>=10) then          //===========b>=10,则对数值>=1
set t=1
set i=0
loop
exitwhen ((Pow(10,t)>b)or(wei(b,t,i)==0))    //==对整数位进行调整
if (wei(b,t,i)==-1) then                   //===返回-1,需要进位
set t=t+10
elseif (wei(b,t,i)>0) then                //====否则调整整数位
set t=t+wei(b,t,i)
endif
endloop
set i=1
loop
exitwhen (i>4)                            //=====调整小数位
if (wei(b,t,i)>0) then
set t=t+I2R(wei(b,t,i))*Pow(0.1,I2R(i))
endif
set i=i+1
endloop
endif
if ((b>0)and(b<1)) then                  //=======b在0,1之间,对数值小于0
set i=0
set m=b
loop
exitwhen (m>=1)
set m=m*10
set i=i+1
endloop
set t=lg(m)-I2R(i)                   //=====通过调用自身来求对数值
endif
return t
endfunction
/j
log函数计算任意底的函数
j/
function log takes real a,real b returns real              //=====根据对数运算来求任意底的对数值
local real x=lg(a)
local real y=lg(b)
local real z=y/x
return z
endfunction
/j


3.较复杂的问题
下面的问题比较复杂,看懂估计需要点时间。
1)求解三次方程的根。
weida函数取3次方程的系数,比对值,条件以及所需调整的位数作为参数,返回该位的取值。
此函数作自增调整,根据条件辨别是增函数还是减函数,为增函数则是从负顶点(即函数曲线的两个顶点所在位置在x轴下方)
向上方调整(即随着自变量的改变函数值从负值慢慢接近0),为减函数则是从正顶点向下调整。
j/
function weida takes real a,real b,real c,real d,real x,boolean t, integer weishu returns integer
local integer i=1
local real y
loop
exitwhen (i>10)                                              //======调整整数位
set x=x+Pow(0.1,I2R(weishu))
set y=a*Pow(x,3.00)+b*pingfang(x)+c*x+d                //= 根据自变量求y值
if (t) then                             //===========如果函数为增函数
if (y>0) then
return i-1
endif
else                                    //=====如果函数为减函数
if (y<0) then
return i-1
endif
endif
set i=i+1
endloop
return -1
endfunction
/j
weixiao函数与前面相同,不同的是不需要条件判断参数,作自减调整一律认为是向下调整。
j/
function weixiao takes real a,real b,real c,real d,real x, integer weishu returns integer
local integer i=1
local real y
loop
exitwhen (i>10)
set x=x-Pow(0.1,I2R(weishu))                   //====自变量自减调整
set y=a*Pow(x,3.00)+b*pingfang(x)+c*x+d
if (y<0) then
return i-1
endif
set i=i+1
endloop
return -1
endfunction
/j
bijin函数取方程的参数,比对值,条件参数,返回调整后的数据,也是最后的求值
与对数函数相同,也是需分为整数和小数两部分调整。输入的条件参数是判断作自减调整还是自加调整。再分别运算。
此函数是对应左顶点来调整的。
j/
function bijin takes real a,real b,real c,real d,real t,boolean shifou returns real
local integer i=1
local boolean y=false
if (shifou) then                                //====选择自减调整
loop                                               //====调整整数部分
exitwhen ((t<=0)or(y))                           
if (weixiao(a,b,c,d,t,i)>0) then
set t=t-I2R(weixiao(a,b,c,d,t,i))*Pow(0.1,i)
endif
if (weixiao(a,b,c,d,t,i)==0) then                 //====返回值为0,整数部分调整结束
set y=true
endif
if (weixiao(a,b,c,d,t,i)==-1) then
set t=t+10
endif
endloop
set i=0
loop                            //===========调整小数部分
exitwhen (i>4)                        //====小数位部分精确位数可在此调整
if (weixiao(a,b,c,d,t,i)>0) then
set t=t-I2R(weixiao(a,b,c,d,t,i))*Pow(0.1,i)
endif
set i=i+1
endloop
else                          //======================自加调整
set y=false
set i=1
loop                                 //====调整整数部分
exitwhen ((t<=0)or(y))                    
if (weida(a,b,c,d,t,false,i)>0) then
set t=t+I2R(weixiao(a,b,c,d,t,i))*Pow(0.1,i)
endif
if (weida(a,b,c,d,t,false,i)==0) then  
set y=true
endif
if (weida(a,b,c,d,t,false,i)==-1) then           //====返回-1,需要进位
set t=t+10
endif
endloop
set i=0
loop
exitwhen (i>4)
if (weida(a,b,c,d,t,false,i)>0) then
set t=t+I2R(weida(a,b,c,d,t,false,i))*Pow(0.1,i)
endif
set i=i+1
endloop
endif
return t
endfunction
/j
bijinshen函数与前一个函数一样的原理,只是它对应的是右顶点,只需做自加调整所以不需条件。
j/
function bijinshen takes real a,real b,real c,real d,real t returns real
local integer i=1
local boolean y=false
loop
exitwhen ((t<=0)or(y))
if (weida(a,b,c,d,t,true,i)>0) then
set t=t+I2R(weida(a,b,c,d,t,true,i))*Pow(0.1,i)
endif
if (weida(a,b,c,d,t,true,i)==0) then
set y=true
endif
if (weida(a,b,c,d,t,true,i)==-1) then
set t=t+10
endif
endloop
set i=0
loop
exitwhen (i>4)
if (weida(a,b,c,d,t,true,i)>0) then
set t=t-I2R(weida(a,b,c,d,t,true,i))*Pow(0.1,i)
endif
set i=i+1
endloop
return t
endfunction
/j
sanci是本算法的主函数,分情况计算解。通过求解导数,算其二次方程的根来获得顶点横坐标。
a=0不是三次方程。
a>0,delta>0且ji<0,此时函数曲线与x轴有3个交点,即有三个实根。
              ji>0,两个顶点的纵坐标要么都为正,要么都为负,此时曲线与横坐标只有一个交点,即只有一个实根。
              ji=0,有一个顶点的纵坐标为0,即该顶点的横坐标为根,此时曲线与横坐标有两个交点。
     delta=0,只有一个顶点,曲线与横坐标只有一个交点。根据顶点的纵坐标的正负选择相应的调整运算。
     delta<0, 没有顶点,用0横坐标,判断相应纵坐标正负,选择相应调整运算。
a<0,系数取反,再调用自身。
j/
function sanci takes real a,real b,real c,real d returns integer
local real delta=4*pingfang(b)-12*a*c                  //===求导获得函数的delta值
local real ji                                          //===导数的根的纵坐标乘积
local real y1
local real y2
local real t                                           //===调整所需变量
if (a==0) then                                         //===a=0不是三次方程
return 0
endif
if (a>0) then
if (delta>0) then
call ercifangchen(3*a,2*b,c)
set ji=udg_erci[0]
set y1=(a*Pow(ji,3.00)+b*pingfang(ji)+c*ji+d)
set ji=udg_erci[1]
set y2=(a*Pow(ji,3.00)+b*pingfang(ji)+c*ji+d)
set ji=y1*y2
if (ji<0) then                                          //====积小于0两个顶点一正一负,所以有三个实根
set t=udg_erci[1]
set t=bijin(a,b,c,d,t,true)                             //===从左顶点自减调整自变量逼近运算
set udg_sanci[0]=t
set t=udg_erci[1]
set t=bijin(a,b,c,d,t,false)                           //===从左顶点自加调整自变量逼近运算
set udg_sanci[1]=t
set t=udg_erci[0]
set t=bijinshen(a,b,c,d,t)                             //====从右顶点自加调整自变量逼近运算
set udg_sanci[2]=t
endif
if (ji>0) then                                         //===积大于0只有一个实根
set t=udg_erci[1]
if ((a*Pow(t,3.00)+b*pingfang(t)+c*t+d)<0) then         //===左顶点小于0则与x轴交点在右顶点右方,即根在右方
set t=udg_erci[0]
set t=bijinshen(a,b,c,d,t)
set udg_sanci[0]=t
endif
set t=udg_erci[0]
if ((a*Pow(t,3.00)+b*pingfang(t)+c*t+d)>0) then           //===相反就是在左顶点左方
set t=udg_erci[1]
set t=bijin(a,b,c,d,t,true)
set udg_sanci[0]=t
endif
endif
if (ji==0) then                                         //====有一个顶点值为0,即该顶点为根
set t=udg_erci[0]
if ((a*Pow(t,3.00)+b*pingfang(t)+c*t+d)==0) then
set udg_sanci[0]=t
set t=udg_erci[1]
set t=bijin(a,b,c,d,t,true)
set udg_sanci[1]=t
else
set udg_sanci[0]=udg_erci[1]
set t=bijinshen(a,b,c,d,t)
set udg_sanci[1]=t
endif
endif
endif
if (delta==0) then                                       //====delta为0,只有一个顶点
set t=udg_erci[0]
if ((a*Pow(t,3.00)+b*pingfang(t)+c*t+d)==0) then            //====由顶点大小来判断根的位置
set udg_sanci[0]=t
endif
if ((a*Pow(t,3.00)+b*pingfang(t)+c*t+d)>0) then
set t=bijin(a,b,c,d,t,true)
set udg_sanci[0]=t
endif
if ((a*Pow(t,3.00)+b*pingfang(t)+c*t+d)<0) then
set t=bijinshen(a,b,c,d,t)
set udg_sanci[0]=t
endif
endif
if (delta<0) then                                       //====delta小于0,只有一个实根
if (d<0) then                                           //====从0开始判断根的位置
set t=0
set t=bijinshen(a,b,c,d,t)
set udg_sanci[0]=t
endif
if (d>0) then
set t=0
set t=bijin(a,b,c,d,t,true)
set udg_sanci[0]=t
endif
if (d==0) then
set udg_sanci[0]=0
endif
endif
endif
if (a<0) then                                       //===a小于0,系数取反再调用自身
call sanci(RSignBJ(a),RSignBJ(b),RSignBJ(c),RSignBJ(d))
endif
return 3
endfunction
/j


二、几何问题
这里列举一些几何运算方面的函数。这里的直线用一个在直线上的点的坐标和这条直线与x正半轴的夹角来表示。夹角范围0到180°
下文中称直线的角就是指直线与x正半轴的夹角
1.简单问题
1)zhixian函数取两个点的坐标,返回直线的角
j/
function zhixian takes real x1,real y1,real x2,real y2 returns real
local real jiao
set jiao=AngleBetweenPoints(Location(x1,y1),Location(x2,y2)) //计算两个点之间形成的角
if (jiao>180) then                      //===================对角进行处理==
set jiao=jiao-180                           //=统一调整为0到180°之间。
endif
return jiao
endfunction
/j
2)jiaoduyuchuli函数取角度,返还处理后的角度.
j/
function jiaoduyuchuli takes real jiaodu returns real
if (jiaodu>=180) then                             //====对输入的任意角进行处理
loop
exitwhen(jiaodu<180)                             //==全不调整为0到180°
set jiaodu=jiaodu-180
endloop
endif
if (jiaodu<0) then
loop
exitwhen (jiaodu>=0)
set jiaodu=jiaodu+180
endloop
endif
return jiaodu
endfunction
/j
3)ispointinline函数取一条直线的各元素和一个点的坐标,返还真值。其作用是检验点是否在直线上。
j/
function ispointinline takes real x1,real y1,real an,real x2,real y2 returns boolean
local real jiao
set jiao=zhixian(x1,y1,x2,y2)                  //==计算两个点形成直线与x正半轴的夹角
if (jiao==jiaoduyuchuli(an)) then               //如果一直线1的角相等则在直线上,否则不在
return true
endif
return false
endfunction
/j
4)is3pointinline函数取3个点的坐标,返还真值。检验3点是否在一条直线上。
j/
function is3pointinline takes real x1,real y1,real x2,real y2,real x3,real y3 returns boolean
return ispointinline(x1,y1,zhixian(x1,y1,x2,y2),x3,y3)
endfunction
/j
5)jiajiao函数取两条直线的角,返还两条直线的夹角。取的是锐角。
j/
function jiajiao takes real an1,real an2 returns real
local real angle
set angle=RAbsBJ(an1-an2)              //====两条直线的夹角等于他们各自角差值的绝对值
set angle=jiaoduyuchuli(angle)
return angle
endfunction
/j
6)ischuizhi函数取两条直线的角就,返还真值。判断两直线是否垂直。
j/
function ischuizhi takes real an1,real an2 returns boolean
local real angle=jiajiao(an1,an2)
if (angle==90) then                      //===夹角为90°为真
return true
endif
return false
endfunction
/j
7)ispingxing函数取两条直线的角,返还真值。判断两直线是否平行。
j/
function ispingxing takes real an1,real an2 returns boolean
local real angle1=jiaoduyuchuli(an1)
local real angle2=jiaoduyuchuli(an2)
if (angle1==angle2) then                //===两条直线的角相等为真
return true
endif
return false
endfunction
/j
8)chuixian函数取一条直线的角返还其垂线的角。
j/
function chuixian takes real an1 returns real
local real angle
if (an1>=90) then                   //==an1>=90,则为外侧角
set angle=an1-90
endif
if (an1<90) then                     //==an1<90,则为内侧角
set angle=an1+90
endif
return angle
endfunction
/j


2.中等难度的函数
1)jiaodianzuobiaox函数取两条直线的各元素,返还交点x坐标
利用直线表达式y=ax+b,其中a为斜率。两条直线就构成了方程组,解得的x值即为x坐标。
j/
function jiaodianzuobiaox takes real x1,real y1,real an1,real x2,real y2,real an2 returns real
local real angle1=jiaoduyuchuli(an1)
local real angle2=jiaoduyuchuli(an2)
local real x
local real a1
local real b1
local real a2
local real b2
if (ispingxing(angle1,angle2)==false) then            //===两条直线不平行
if ((not(angle1==90))and(not(angle2==90))) then       //===两条直线的角都不是90°
set a1=TanBJ(angle1)
set a2=TanBJ(angle2)
set b1=y1-a1*x1
set b2=y2-a2*x2
set x=(b1-b2)/(a2-a1)
return x
endif
if (angle1==90) then
return x1
endif
if (angle2==90) then
return x2
endif
endif
return -1.00
endfunction
/j
2)jiaodianzuobiaoy函数取两条直线的各元素,返还交点y坐标
方法和第一个一样
j/
function jiaodianzuobiaoy takes real x1,real y1,real an1,real x2,real y2,real an2 returns real
local real angle1=jiaoduyuchuli(an1)
local real angle2=jiaoduyuchuli(an2)
local real y
local real a1
local real b1
local real a2
local real b2
if (ispingxing(angle1,angle2)==false) then
if ((not(angle1==90))and(not(angle2==90))) then
set a1=TanBJ(angle1)
set a2=TanBJ(angle2)
set b1=y1-a1*x1
set b2=y2-a2*x2
set y=(b1*a2-a1*b2)/(a2-a1)
return y
endif
if (angle1==90) then
set a2=TanBJ(angle2)
set b2=y2-a2*x2
set y=a2*x1+b2
return y
endif
if (angle2==90) then
set a1=TanBJ(angle1)
set b1=y1-a1*x1
set y=a1*x2+b1
return y
endif
endif
return -1.00
endfunction
/j
3)jiaodianzuobiao函数取两个条直线的各元素,返还点。
整合了x坐标和y坐标。
j/
function jiaodianzuobiao takes real x1,real y1,real an1,real x2,real y2,real an2 returns location
local real x
local real y
if (ispingxing(an1,an2)) then
return null
else
set x=jiaodianzuobiaox(x1,y1,an1,x2,y2,an2)   //====计算x轴坐标
set y=jiaodianzuobiaoy(x1,y1,an1,x2,y2,an2)   //====计算y轴坐标
return Location(x,y)       //=====坐标整合
endif
return null
endfunction
/j
4)distancepl函数取一条直线的各元素和一个点的坐标,返还距离
先计算该直线的垂线的角,与点2构成了一条直线的所需元素。计算直线1与直线2的交点。计算交点与点2的距离。
j/
function distancepl takes real x1,real y1,real an1,real x2,real y2 returns real
local real angle1=jiaoduyuchuli(an1)
local real angle2
local location d
local real dis
if (angle1>=90) then   //===计算过x2,y2直线1的垂线的角
set angle2=angle1-90
else
set angle2=angle1+90
endif
set d=jiaodianzuobiao(x1,y1,angle1,x2,y2,angle2)    //====计算直线1与其垂线的交点
set dis=DistanceBetweenPoints(d,Location(x2,y2))    //====计算点2与交点之间的距离
call RemveLoction(d)
set d=null
return dis
endfunction
/j
5)isxiangqie函数取一条直线的所需元素,圆心和半径,返还真值。
计算圆心与直线1的距离,等于半径的话就是相切。
j/
function isxiangqie takes real x1,real y1,real an1,real x2,real y2,real banjin returns boolean
local real dis=distancepl(x1,y1,an1,x2,y2)        //===计算直线1与圆心的距离
if (dis==banjin) then                             //====两个值相等则相切
return true
endif
return false
endfunction
/j
6)isxiangjiao取直线1的所有元素,圆心和半径。返还真值。判断直线与圆是否相交
与前一个函数方法一样,判断距离。
j/
function isxiangjiao takes real x1,real y1,real an1,real x2,real y2,real banjin returns boolean
local real dis=distancepl(x1,y1,an1,x2,y2)
if (dis<banjin) then
return true
endif
return false
endfunction
/j
7)qiexian函数取点1(点1必须是圆外的点),圆心和半径,返还切线的角。通过圆外一点计算切线。
计算点1与圆心的距离从而算出圆心与点1连线的夹角,再由连线的角算出切线的角。
j/
function qiexian takes real x1,real y1,real x2,real y2,real banjin returns real
local real dis=DistanceBetweenPoints(Location(x1,y1),Location(x2,y2)) //==计算两点距离
local real an=AsinBJ(banjin/dis)
local real an1=zhixian(x1,y1,x2,y2)
local real an2
if (an1>=90) then
set an2=an1-an
else
set an2=an+an1
endif
return an2
endfunction
/j


3.复杂问题
1)求解点撞击圆的反弹问题(计算反弹轨迹的直线)
要解决点撞击圆的反弹问题,先解决点撞击直线反弹问题。
zhixianfantanl函数取直线1,2的各元素,返回点。该函数是计算撞击点的坐标。
方法:实际上就是计算直线的交点。
j/
function zhixianfantanl takes real x1,real y1,real an1,real x2,real y2,real an2 returns location
return jiaodianzuobiao(x1,y1,an1,x2,y2,an2)
endfunction
/j
zhixianfantanjiao函数取入射直线1的角度和反弹的直线的角度,返还反弹轨迹所在直线的角度。
先计算入射角,根据不同情况计算反弹轨迹。
j/
function zhixianfantanjiao takes real an1,real an2 returns real
local real anjia                        
local real anru                    //===入射角
local real an
set anjia=jiajiao(an1,an2)
set anru=90-anjia                   //==计算入射角
if (an2<90) then                   //==计算出射直线的角
set an=an2+2*anru
endif
if (an2>90) then
set an=an2-2*anru
endif
if (an2==90) then
set an=0
endif
return an
endfunction
/j
yuanjiaodian函数取直线1和圆心,半径,返回与点1较近的交点坐标。
用解析法计算较为麻烦,所以用几何法莱求解。此方法需要图形说明,这里就不予介绍了。
j/
function yuanjiaodian takes real x1,real y1,real an1,real x2,real y2,real banjin returns location
local real distance=distancepl(x1,y1,an1,x2,y2)            //==计算圆心到直线1的距离
local real zangle=AsinBJ(distance/banjin)                   //==计算两点连线与直线1的夹角
local real angle1=an1-zangle                                 //==计算出两个交点
local real angle2=an1+zangle
local location b1=jiaodianzuobiao(x1,y1,an1,x2,y2,angle1)
local location b2=jiaodianzuobiao(x1,y1,an1,x2,y2,angle2)
local real d1=DistanceBetweenPoints(Location(x1,y1),b1)
local real d2=DistanceBetweenPoints(Location(x1,y1),b2)
local real x1=GetLocationX(b1)
local real y1=GetLocationY(b1)
local real x2=GetLocationX(b2)
local real y2=GetLocationY(b2)
call RemoveLocation(b1)
call RemoveLocation(b2)
set b1=null
set b2=null
if (d1>d2) then                                               //==取其中距离较近的
return Location(x1,y1)
endif
return Location(x2,y2)
endfunction
/j
yuanfantanjiao取直线1的所有元素和圆心,半径,返还反弹轨迹所在直线的角。
先计算直线与圆的交点,即碰撞点,再计算交点与圆心连线的角,以此计算出它的垂线(即求出了过交点的切线)
这样就把撞击圆的问题转化为撞击直线的问题。再调用之前的撞击直线的函数解决问题。
j/
function yuanfantanjiao takes real x1,real y1,real an1,real x2,real y2,real banjin returns real
local location penzhuangdian=yuanjiaodian(x1,y1,an1,x2,y2,banjin)                        //==计算交点
local real angle=zhixian(GetLocationX(penzhuangdian),GetLocationY(penzhuangdian),x2,y2)//=计算交点与圆心连线的角
local real angle1=chuixian(angle)                                                      //=计算其垂线的角
local real jiao=zhixianfantanjiao(angle1,an1)                                         //=计算反弹角
return jiao
endfunction
/j







楼主热帖
免责条款:本站仅提供学习的平台,所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,并不承担任何法律责任,如果对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。

本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

本网站所提供的信息,只供参考之用。本网站不保证信息的准确性、有效性、及时性和完整性。本网站及其雇员一概毋须以任何方式就任何信息传递或传送的失误、不准确或错误,对用户或任何其他人士负任何直接或间接责任。在法律允许的范围内,本网站在此声明,不承担用户或任何人士就使用或未能使用本网站所提供的信息或任何链接所引致的任何直接、间接、附带、从属、特殊、惩罚性或惩戒性的损害赔偿。

精彩评论13

 楼主| 怪诞生 发表于 2020-3-7 20:27:28 | 显示全部楼层
三、字符串问题
1.简单问题
在jass中没有字符型变量,但在这里,我使用单个字符的概念。
1)isshuzi函数取字符串a返回验证的整数型代码。为-1,不是单个字符,为0,不是数字。为1,是数字。
j/
function isshuzi takes string a returns integer
local integer i
local integer length=StringLength(a)             //==记录字符串长度         
if (not(length==1))  then
return -1                                   //===长度不为1,不是单个字符
endif
if (length==1) then
set i=0
loop
exitwhen (i>9)                   //=====与0到9是个数字比较
if (a==I2S(i)) then
return 1
endif
set i=i+1
endloop
endif
return 0
endfunction
/j
2)iszimu函数取字符串a返回整数型代码。为-1,不是单个字符,为0,不是字母。为1,是字母。
先用26个小写字母比对,再将其变成大写,再次比对。
j/
function iszimu takes string a returns integer
local integer i
local integer length=StringLength(a)
local string t="abcdefghijklmnopqrstuvwxyz"              //===记录26个字母
if (not(length==1))  then              
return -1
endif
if (length==1) then                           
set i=1
loop                                       //==分别于26个字母比较
exitwhen (i>26)
if (a==SubStringBJ(t,i,i)) then
return 1                                   //==符合返回1
endif
set i=i+1
endloop
endif
set t=StringCase(t,true)                  //==记录26个字母的大写
if (length==1) then
set i=1
loop
exitwhen (i>26)
if (a==SubStringBJ(t,i,i)) then
return 1                                    //==与26个字母比较符合返回
endif
set i=i+1
endloop
endif
return 0                                  //==都不符合返回0
endfunction
/j
3)iskongge函数取字符串a返回整数型代码。为-1,不是单个字符,为0,不是空格。为1,是空格。
j/
function iskongge takes string a returns integer
local integer length=StringLength(a)
if (not(length==1))  then
return -1
endif
if (length==1) then
if (a==" ") then
return 1                            //==是空格,返回1
endif
endif
return 0
endfunction
/j
4)isqita函数取字符串a返回整数型代码。为-1,不是单个字符,为0,不是其他字符。为1,是其他字符。
j/
function isqita takes string a returns integer
local integer i
if (isshuzi(a)==-1) then
return -1                             
else
set i=isshuzi(a)+iszimu(a)+iskongge(a)            
if (i==0) then                             //==三个都为0,返回1
return 1
endif
endif
return 0
endfunction
/j
5)isshuzis函数取字符串a返回真值。为真,a是数字,为非,不是数字。
j/
function isshuzis takes string a returns boolean
local integer length=StringLength(a)
local integer i=1
local string s
loop
exitwhen (i>length)                     //==比对所有字符
set s=SubStringBJ(a,i,i)
if (isshuzi(s)==0) then
return false                         //===只要有不是数字的,返回否
endif
set i=i+1
endloop
return true
endfunction
/j
6)iszimus函数取字符串a返回真值。为真,a是字母,为非,不是字母。
j/
function iszimus takes string a returns boolean
local integer length=StringLength(a)
local integer i=1
local string s
loop
exitwhen (i>length)
set s=SubStringBJ(a,i,i)
if (iszimu(s)==0) then
return false
endif
set i=i+1
endloop
return true
endfunction
/j
7)iskongges函数取字符串a返回真值。为真,a是空格,为非,不是空格。
j/
function iskongges takes string a returns boolean
local integer length=StringLength(a)
local integer i=1
local string s
loop
exitwhen (i>length)
set s=SubStringBJ(a,i,i)
if (iskongge(s)==0) then
return false
endif
set i=i+1
endloop
return true
endfunction
/j
8)isqitas函数取字符串a返回真值。为真,a是其他字符,为非,不是其他字符。
j/
function isqitas takes string a returns boolean
local integer length=StringLength(a)
local integer i=1
local string s
loop
exitwhen (i>length)
set s=SubStringBJ(a,i,i)
if (isqita(s)==0) then
return false
endif
set i=i+1
endloop
return true
endfunction
/j


2.中等难度的问题
1)isxiaoxie函数取字符串a返回验证整数代码。-1为非字符,0为非小写字母,1为小写字母。
方法与判断是否是字母的相同。
j/
function isxiaoxie takes string a returns integer
local integer i
local integer length=StringLength(a)
local string t="abcdefghijklmnopqrstuvwxyz"    //===与小写26个字母比较
if (not(length==1))  then
return -1
endif
if (length==1) then
set i=1
loop
exitwhen (i>26)
if (a==SubStringBJ(t,i,i)) then
return 1
endif
set i=i+1
endloop
endif
return 0
endfunction
/j
2)isdaxie函数取字符串a返回验证整数代码。-1为非字符,0为非大写字母,1为大写字母
j/
function isdaxie takes string a returns integer
local integer i
local integer length=StringLength(a)
local string t="abcdefghijklmnopqrstuvwxyz"
set t=StringCase(t,true)                             //====与大写26个字母比较
if (not(length==1))  then
return -1
endif
if (length==1) then
set i=1
loop
exitwhen (i>26)
if (a==SubStringBJ(t,i,i)) then
return 1
endif
set i=i+1
endloop
endif
return 0
endfunction
/j
3)fanzhuan函数取字符串a返回处理后的字符串。该函数将其中的大写字母变成小写字母,小写字母变成大写字母。jass库函数中只有全部改大写(或小写)。
逐个读取字符进行处理。
j/
function fanzhuan takes string a returns string
local integer i=1
local string t
local integer length=StringLength(a)
local string a1
loop
exitwhen (i>length)
set t=SubStringBJ(a,i,i)
if (isxiaoxie(t)==1) then             //===是小写,则改成大写添加给a1
set t=StringCase(t,true)
set a1=a1+t
elseif (isdaxie(t)==1) then             //====是大写,则改成小写添加给a1
set t=StringCase(t,false)
set a1=a1+t
else                                   //====不是字母,直接添加个a1
set a1=a1+t
endif
endloop
return a1                              //====返回调整后的字符串
endfunction
/j
3)qushuzi取字符串a返回去除数字字符的剩余字符串。
j/
function qushuzi takes string a returns string
local string t
local string t1
local integer length=StringLength(a)
local integer i
set i=1
loop
exitwhen (i>length)
set t=SubStringBJ(a,i,i)
if (isshuzi(t)==0) then                     //==截取的字符不是数字,添加给t1
set t1=t1+t
endif                                          
set i=i+1
endloop
return t1                             //===返回调整后的字符串
endfunction
/j
4)qushuzi取字符串a返回去除字母字符的剩余字符串。
j/
function quzimu takes string a returns string
local string t
local string t1
local integer length=StringLength(a)
local integer i
set i=1
loop
exitwhen (i>length)
set t=SubStringBJ(a,i,i)
if (iszimu(t)==0) then            //==截取的字符不是字母,添加给t1
set t1=t1+t
endif
set i=i+1
endloop
return t1                 //===返回调整后的字符串
endfunction
/j


3.复杂问题
以下问题是检测一个字符串是否包含另一个字符串,并减去包含的部分。
1)baohan函数取字符串a(被包含的),字符串b(包含的)。返回真值。被包含的字符串在b中是连续的。
改函数先去除a中的第一个字符,从字符串b中搜索到的匹配的第一个字符,则都进行下一位的比较。一直循环。如遇到不相等的,a则需要再次回到
开头重新验证。
j/
function baohan takes string a,string b returns boolean
local integer i
local integer j
local string t1
local string t2
local boolean y
local integer length1=StringLength(a)              //===记录两个字符串的长度。
local integer length2=StringLength(b)
if (length1>length2) then                          //===b长不符合要求
return false
endif
set i=1
set t1=SubStringBJ(a,i,i)
set j=1
loop
exitwhen ((j>length2)or(i>length1))        //=当检验到b末尾时,或已经检验b包含了a跳出
set t2=SubStringBJ(b,j,j)               //=跳到b的下一位字符
if (t1==t2) then                        //比较两个字符串截取出的字符
set i=i+1
set t1=SubStringBJ(a,i,i)               //相同则取a的下一位
else                                      //不相同则再从第一位开始验证。
set i=1
set t1=SubStringBJ(a,i,i)
if (t1==t2) then
set i=i+1
set t1=SubStringBJ(a,i,i)
endif               
endif
set j=j+1
endloop
if (i==(length1+1)) then
return true
endif
return false
endfunction
/j
2)jian函数取字符串a(被包含的),字符串b(包含的)。返回处理后的字符串。
方法和上一个函数一样。只是需要获得被包含字符串在b中的位置。其末位为跳出循环时j值减1,首位为j-length1
那就需要挖去这部分。
j/
function jian takes string a,string b returns string
local integer i
local integer j
local string t1
local string t2
local boolean y
local integer length1=StringLength(a)
local integer length2=StringLength(b)
if (length1>length2) then
return b
endif
set i=1
set t1=SubStringBJ(a,i,i)
set j=1
loop
exitwhen ((j>length2)or(i>length1))
set t2=SubStringBJ(b,j,j)
if (t1==t2) then
set i=i+1
set t1=SubStringBJ(a,i,i)
else
set i=1
set t1=SubStringBJ(a,i,i)
if (t1==t2) then
set i=i+1
set t1=SubStringBJ(a,i,i)
endif        
endif
set j=j+1
endloop
if (i==length1) then
set t1=SubStringBJ(b,1,j-length1-1)+SubStringBJ(b,j,length2)     //=挖去包含的部分。
return t1
endif
return b
endfunction
/j
mm807700690 发表于 2020-3-7 21:50:56 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享!我觉得天工社区是注册对了!
蓝忘机 发表于 2020-3-7 22:06:10 | 显示全部楼层
回想起当初在数学课上睡着的样子。
  “你遇见一个人,犯了一个错,你想弥补想还清,到最后才发现你根本无力回天,犯下的罪过永远无法弥补,我们永远无法还清欠下的…只要错了,就是错了永远无法弥补。”
创世神 发表于 2020-3-8 00:03:07 | 显示全部楼层

既然你诚信诚意的推荐了,那我就勉为其难的看看吧!天工社区不走平凡路。
亦真亦假皆为常世之梦
demonsung 发表于 2020-3-8 09:46:51 | 显示全部楼层
看了几秒钟睡着了....感谢分享
haha7328 发表于 2020-3-8 10:35:12 | 显示全部楼层

楼主太厉害了!楼主,I*老*虎*U!我觉得天工社区真是个好地方!
yhw5231 发表于 2020-3-8 12:04:59 | 显示全部楼层

我看不错噢 谢谢楼主!天工社区越来越好!
天道至尊 发表于 2020-3-11 17:31:52 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享!我觉得天工社区是注册对了!
tancy 发表于 2020-3-14 09:14:52 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享!我觉得天工社区是注册对了!

强调下版规的规定,如有恶意灌水从重处罚:
=====发表主题规则=======
1.主题内容请一定要附带预览图片,谢谢;
2.搬运来的东西请尽量不要卖钱!;
3.发帖有任何疑问请联系QQ21031394;
=====发表回复规则=======
1.禁止直接复制标题内容的;
2.禁止纯数字或者纯字母的;
3.禁止乱打一通文不对题;
4.禁止屠版和刷分行为;
第一次扣分处理,第二次扣分+警告,警告三次禁言三天,绝不手软,情况严重的直接封号,请大家珍惜自己的账号!

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

本版积分规则

猜你喜欢
天工维度唯一QQ群
786014245

欢迎进群交流,入群答案:编辑器

  • 官方在线客服

    QQ客服:小雪

    点击交谈

    QQ客服:砂糖

    点击交谈

    团队老大:荀公子

    商务合作
  • 上海市静安区共和新路4718号宏慧新汇园6号楼603室

  • 手机扫码查看手机版

    手机查找资源更方便

  • 扫一扫关注官方微信

    加入官方QQ群

Powered by 天天RPG&DZX3.4 ©2020-2021 Comsenz Inc.提百万设计( 沪ICP备18032615号-1 )营业执照