一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
前言
- 我们在绘制自定义组件的时候,通常需要去计算一些坐标点,除了加减乘除以外,还需要一些特殊的角度、弧度计算等,这些不怎么常用的算法dart基本都内置支持了,下面对这些运算符以及一些方法做一个汇总记录整理。
1、运算符
- num 计算运算符
dart基本数据类型num;代表整数或者浮点数。
+、-、*、/、++、--、+=、-=跟java基本一样。
%:取余。例:10 % 3 = 1;
num operator %(num other);
~/:dart特有的,截断取整 也就是向前取整。例:3.6 ~/ 2 = 1;
num operator ~/(num other);
- 位运算符:
运算符 | 描述 |
| ------ | ------------------------------ |
|
&| 按位与 都为1返回1 | |\|| 按位或 有1个1返回1 | |^| 按位异或 相同=1,不同=0 | |~表达式| 按位取反(即将 “0” 变为 “1”,“1” 变为 “0”) | |<<| 位左移 缺位补0 | |>>| 位右移 缺位补0 |
位运算符是以二进制对应的0、1来计算的,
& 相同位数为都为1,返回1。
例如:
2 = 0010;
3 = 0011;
那么得出:
2 & 3 = 0010 = 2;
2 | 3 = 0011 = 3;
2 ^ 3 = 0001 = 1;
~2 = -3; //这里需要进行补码,有兴趣可以了解下
2 >> 1 = 1;
2 << 1 = 4;
位运算是通过机器语言二进制来进行计算的,常用位运算对性能有很好的提升。但是一定要写好注释,因为位运算的代码可读性不怎么样。毕竟机器语言。
- num 方法
int round();取整:最接近这个数,(3.4).round() = 3;and(-3.5).round() = -4;
int floor();取整:不大于这个数,(3.5).floor() = 3;and(-3.5).floor() = -4;
int ceil();取整:不小于这个数,(3.4).round() = 4;and(-3.5).round() = -3;
int truncate();取整:去掉小数中的小数,(3.5).truncate() = 3;and(-3.5).truncate() = -3;toStringAsFixed(int fractionDigits);取小数点后几位,返回字符串。’1.toStringAsFixed(3) = 1.000;
compareTo(num other);比较大小,相等返回0,排序中常用。
//例:
int compareTo(num other);
print(1.compareTo(2)); // => -1
print(2.compareTo(1)); // => 1
print(1.compareTo(1)); // => 0
abs取绝对值。
remainder 取余。
/// a.remainder(b); 等同于 a % b;
num remainder(num other);
bool isNaN判断是否为NaN;(0/0)= NaN。
bool isNegative判断是否为负数;-1.isNegative = true。
bool isInfinite判断是否为正负无穷大;double.infinity 或.negativeInfinity = true。
bool isFinite判断这个数是否有限;double.infinity.isFinite = false。
num sign返回这个数的符号;这个数如果>0 返回 1; =0 返回0; <0 返回 -1。
- 类型判断运算符:
as类型转换 a as b 将a类型转换为b类型。
is类型判断 如果对象是指定类型则返回 true。
is!类型判断 如果对象是指定类型则返回 false。 - 其他还有一些关系运算符、赋值运算符很常见就不一一列举了。
2、math常用算法
- 导入:
dart.math;
import 'dart:math';
常量
/// 自然对数的底数 用e表示 e是一个无限不循环小数
/// 计算方法:e = (1+1/n)的n次方 n趋于无穷大∞
const double e = 2.718281828459045;
/// 10的自然对数
const double ln10 = 2.302585092994046;
/// PI常量 = π 一般计算角度弧度会用到 1pi = 180°;
const double pi = 3.1415926535897932;
/// 根号1/2
const double sqrt1_2 = 0.7071067811865476;
/// 根号2
const double sqrt2 = 1.4142135623730951;
方法
- 比较
min取两者中的较小值。
external T min<T extends num>(T a, T b);
max 取两者中的较大值。
external T max<T extends num>(T a, T b);
- 计算
pow返回x的e次方。
external num pow(num x, num e);
sqrt 返回x的的平方根。
external num sqrt(num x);
exp 返回e的的x次方。
external num exp(num x);
log 返回x的自然对数。
external num log(num x);
- 角度计算相关 一般在自定义绘制中经常会用到角度、弧度的计算。
sin 取当前弧度的正弦值。 asin 反正弦。
例 :sin90° = 1,程序中pi代表弧度180°。
所以:sin(pi/2) = 1,asin(1) = pi/2; 下同,看不懂的去找高中老师0.0。
external double sin(num radians);
cos 取当前弧度的余弦值。acos 反余弦。
external double cos(num radians);
tan 取当前弧度的正切值。atan 反正切。
external double cos(num radians);
atan2 上面传入的是pi类型的弧度,这个方法传入具体的坐标点,等同于三角形中的边长,
如果b>0,等同于atan(a/b),返回角度,范围:-pi - pi。
external double atan2(num a, num b);
总结
算法基本都是高中数学的知识,整理的过程中发现有些高中的知识已经都还给数学老师了,泪奔~...比如:对数、自然对数,正弦、反正弦基本都忘光了,绘制过程遇到一些常用的算法,正好整理记录重新学习下。
参考官方文档链接:dart.cn/guides/lang…