-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
plugin_math.mts
338 lines (335 loc) · 9.24 KB
/
plugin_math.mts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
/** plugin_math */
import { NakoSystem } from './plugin_api.mjs'
export default {
'meta': {
type: 'const',
value: {
pluginName: 'plugin_math', // プラグインの名前
description: '数学関数を提供するプラグイン', // プラグインの説明
pluginVersion: '3.6.0', // プラグインのバージョン
nakoRuntime: ['wnako', 'cnako', 'phpnako'], // 対象ランタイム
nakoVersion: '^3.6.0' // 要求なでしこバージョン
}
},
'初期化': {
type: 'func',
josi: [],
pure: true,
fn: function (): void {
// 初期化不要
}
},
// @三角関数
'SIN': { // @ラジアン単位VのSINを求める // @SIN
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: number): number {
return Math.sin(v)
}
},
'COS': { // @ラジアン単位VのCOSを求める // @COS
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: number): number {
return Math.cos(v)
}
},
'TAN': { // @ラジアン単位VのTANを求める // @TAN
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: number): number {
return Math.tan(v)
}
},
'ARCSIN': { // @ラジアン単位VのARCSINを求める // @ARCSIN
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: number): number {
return Math.asin(v)
}
},
'ARCCOS': { // @ラジアン単位VのARCCOSを求める // @ARCCOS
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: number): number {
return Math.acos(v)
}
},
'ARCTAN': { // @ラジアン単位VのARCTANを求める // @ARCTAN
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: number): number {
return Math.atan(v)
}
},
'ATAN2': { // @ARCTAN(Y/X)をラジアン単位で返す // @ATAN2
type: 'func',
josi: [['と'], ['の']],
pure: true,
fn: function (y: number, x: number): number {
return Math.atan2(y, x)
}
},
'座標角度計算': { // @点[0,0]から[x,y]の直線とX軸の角度(度)を返す // @ざひょうかくどけいさん
type: 'func',
josi: [['の']],
pure: true,
fn: function (XY: number[]): number {
return Math.atan2(XY[1], XY[0]) * 180 / Math.PI
}
},
'RAD2DEG': { // @ラジアンから度に変換 // @RAD2DEG
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return v / Math.PI * 180
}
},
'DEG2RAD': { // @度からラジアンに変換 // @DEG2RAD
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return (v / 180) * Math.PI
}
},
'度変換': { // @ラジアンから度に変換 // @どへんかん
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return v / Math.PI * 180
}
},
'ラジアン変換': { // @度からラジアンに変換 // @らじあんへんかん
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return (v / 180) * Math.PI
}
},
// @算術関数
'SIGN': { // @Vが0なら0を、0超なら1を、0未満なら-1を返す // @SIGN
type: 'func',
josi: [['の']],
pure: true,
fn: function (v: any): number {
return (parseFloat(v) === 0) ? 0 : (v > 0) ? 1 : -1
}
},
'符号': { // @Vが0なら0を、0超なら1を、0未満なら-1を返す // @ふごう
type: 'func',
josi: [['の']],
pure: false,
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
fn: function (v: number, sys: NakoSystem): number {
return sys.__exec('SIGN', [v])
}
},
'ABS': { // @Vの絶対値を返す // @ABS
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.abs(a)
}
},
'絶対値': { // @Vの絶対値を返す // @ぜったいち
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.abs(a)
}
},
'EXP': { // @e(自然対数の底)の A 乗の値を返す // @EXP
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.exp(a)
}
},
'HYPOT': { // @直角三角形の二辺の長さA,Bから斜辺を求めて返す。 // @HYPOT
type: 'func',
josi: [['と'], ['の']],
pure: true,
fn: function (a: number, b: number): number {
return Math.hypot(a, b)
}
},
'斜辺': { // @直角三角形の二辺の長さA,Bから斜辺を求めて返す。 // @しゃへん
type: 'func',
josi: [['と'], ['の']],
pure: true,
fn: function (a: number, b: number): number {
return Math.hypot(a, b)
}
},
'LN': { // @実数式 A の自然対数(Ln(A) = 1)を返す // @LN
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.log(a)
}
},
'LOG': { // @Aの自然対数(底はE)を返す // @LOG
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.log(a)
}
},
'LOGN': { // @指定された底AでBの対数を計算して返す // @LOGN
type: 'func',
josi: [['で'], ['の']],
pure: true,
fn: function (a: number, b: number): number {
if (a === 2) { return Math.LOG2E * Math.log(b) }
if (a === 10) { return Math.LOG10E * Math.log(b) }
return Math.log(b) / Math.log(a)
}
},
'FRAC': { // @実数Aの小数部分を返す // @FRAC
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return a % 1
}
},
'小数部分': { // @実数Aの小数部分を返す // @しょうすうぶぶん
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return a % 1
}
},
'整数部分': { // @実数Aの整数部分を返す // @せいすうぶぶん
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.trunc(a)
}
},
'乱数': { // @0から(A-1)までの乱数を返す // @らんすう
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.floor(Math.random() * a)
}
},
'乱数範囲': { // @AからBまでの範囲の乱数を返す // @らんすうはんい
type: 'func',
josi: [['から'], ['までの', 'の']],
pure: true,
fn: function (a: number, b: number): number {
return (Math.floor(Math.random() * (b - a + 1)) + a)
}
},
'SQRT': { // @Aの平方根を返す // @SQRT
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.sqrt(a)
}
},
'平方根': { // @Aの平方根を返す // @へいほうこん
type: 'func',
josi: [['の']],
pure: true,
fn: function (a: number): number {
return Math.sqrt(a)
}
},
// @数値切上切捨丸め
'ROUND': { // @実数型の値Vを丸めてもっとも近い整数値を返す // @ROUND
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return Math.round(v)
}
},
'四捨五入': { // @実数型の値Vを丸めてもっとも近い整数値を返す // @ししゃごにゅう
type: 'func',
josi: [['を', 'の']],
pure: true,
fn: function (v: number): number {
return Math.round(v)
}
},
'小数点切上': { // @整数Aを小数点第B桁で切り上げして返す // @しょうすうてんきりあげ
type: 'func',
josi: [['を'], ['で']],
pure: true,
fn: function (a: number, b: number): number {
const base = Math.pow(10, b)
return Math.ceil(a * base) / base
}
},
'小数点切下': { // @整数Aを小数点第B桁で切り下げして返す // @しょうすうてんきりさげ
type: 'func',
josi: [['を'], ['で']],
pure: true,
fn: function (a: number, b: number): number {
const base = Math.pow(10, b)
return Math.floor(a * base) / base
}
},
'小数点四捨五入': { // @実数Aを小数点第B桁で四捨五入して返す // @しょうすうてんししゃごにゅう
type: 'func',
josi: [['を'], ['で']],
pure: true,
fn: function (a: number, b: number): number {
const base = Math.pow(10, b)
return Math.round(a * base) / base
}
},
'CEIL': { // @数値を正の無限大方向へ切り上げて返す。 // @CEIL
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return Math.ceil(v)
}
},
'切上': { // @数値を正の無限大方向へ切り上げて返す。 // @きりあげ
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return Math.ceil(v)
}
},
'FLOOR': { // @数値を負の無限大方向へ切り下げて返す。 // @FLOOR
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return Math.floor(v)
}
},
'切捨': { // @数値を負の無限大方向へ切り下げて返す。// @きりすて
type: 'func',
josi: [['を']],
pure: true,
fn: function (v: number): number {
return Math.floor(v)
}
}
}