diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-09-05 15:41:04 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-09-05 15:41:04 -0400 |
| commit | 9f8abd5cd1a519acc8259f1a3be058c0767b7129 (patch) | |
| tree | fe1a72de4785b6b15b2afdadee34a5ee36dc8e4c /examples | |
| parent | 72502b099bb80712877ea53cbb36e577e9dded2d (diff) | |
Add vectors to the examples
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/README.md | 1 | ||||
| -rw-r--r-- | examples/vectors.tm | 99 |
2 files changed, 100 insertions, 0 deletions
diff --git a/examples/README.md b/examples/README.md index 6b47e1a7..2b5234c0 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,4 +1,5 @@ # Example Programs - [file.tm](file.tm): A file handling module. +- [vectors.tm](vectors.tm): A math vector library. - [wrap.tm](wrap.tm): A command-line program to wrap text. diff --git a/examples/vectors.tm b/examples/vectors.tm new file mode 100644 index 00000000..64aa3295 --- /dev/null +++ b/examples/vectors.tm @@ -0,0 +1,99 @@ +# A math vector library for 2D and 3D vectors of Nums or Ints + +struct Vec2(x,y:Num): + ZERO := Vec2(0, 0) + func plus(a,b:Vec2; inline)->Vec2: + return Vec2(a.x+b.x, a.y+b.y) + func minus(a,b:Vec2; inline)->Vec2: + return Vec2(a.x-b.x, a.y-b.y) + func times(a,b:Vec2; inline)->Vec2: + return Vec2(a.x*b.x, a.y*b.y) + func dot(a,b:Vec2; inline)->Num: + return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + func cross(a,b:Vec2; inline)->Num: + return a.x*b.y - a.y*b.x + func scaled_by(v:Vec2, k:Num; inline)->Vec2: + return Vec2(v.x*k, v.y*k) + func divided_by(v:Vec2, divisor:Num; inline)->Vec2: + return Vec2(v.x/divisor, v.y/divisor) + func length(v:Vec2; inline)->Num: + return (v.x*v.x + v.y*v.y):sqrt() + func dist(a,b:Vec2; inline)->Num: + return a:minus(b):length() + func angle(v:Vec2; inline)->Num: + return Num.atan2(v.y, v.x) + +struct Vec3(x,y,z:Num): + ZERO := Vec3(0, 0, 0) + func plus(a,b:Vec3; inline)->Vec3: + return Vec3(a.x+b.x, a.y+b.y, a.z+b.z) + func minus(a,b:Vec3; inline)->Vec3: + return Vec3(a.x-b.x, a.y-b.y, a.z-b.z) + func times(a,b:Vec3; inline)->Vec3: + return Vec3(a.x*b.x, a.y*b.y, a.z*b.z) + func dot(a,b:Vec3; inline)->Num: + return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + (a.z-b.z)*(a.z-b.z) + func cross(a,b:Vec3; inline)->Vec3: + return Vec3(a.y*b.z - a.z-b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x) + func scaled_by(v:Vec3, k:Num; inline)->Vec3: + return Vec3(v.x*k, v.y*k, v.z*k) + func divided_by(v:Vec3, divisor:Num; inline)->Vec3: + return Vec3(v.x/divisor, v.y/divisor, v.z/divisor) + func length(v:Vec3; inline)->Num: + return (v.x*v.x + v.y*v.y + v.z*v.z):sqrt() + func dist(a,b:Vec3; inline)->Num: + return a:minus(b):length() + +struct IVec2(x,y:Int): + ZERO := IVec2(0, 0) + func plus(a,b:IVec2; inline)->IVec2: + return IVec2(a.x+b.x, a.y+b.y) + func minus(a,b:IVec2; inline)->IVec2: + return IVec2(a.x-b.x, a.y-b.y) + func times(a,b:IVec2; inline)->IVec2: + return IVec2(a.x*b.x, a.y*b.y) + func dot(a,b:IVec2; inline)->Int: + return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + func cross(a,b:IVec2; inline)->Int: + return a.x*b.y - a.y*b.x + func scaled_by(v:IVec2, k:Int; inline)->IVec2: + return IVec2(v.x*k, v.y*k) + func divided_by(v:IVec2, divisor:Int; inline)->IVec2: + return IVec2(v.x/divisor, v.y/divisor) + func length(v:IVec2; inline)->Num: + return Num.sqrt(v.x*v.x + v.y*v.y) + func dist(a,b:IVec2; inline)->Num: + return a:minus(b):length() + func angle(v:IVec2; inline)->Num: + return Num.atan2(v.y, v.x) + +struct IVec3(x,y,z:Int): + ZERO := IVec3(0, 0, 0) + func plus(a,b:IVec3; inline)->IVec3: + return IVec3(a.x+b.x, a.y+b.y, a.z+b.z) + func minus(a,b:IVec3; inline)->IVec3: + return IVec3(a.x-b.x, a.y-b.y, a.z-b.z) + func times(a,b:IVec3; inline)->IVec3: + return IVec3(a.x*b.x, a.y*b.y, a.z*b.z) + func dot(a,b:IVec3; inline)->Int: + return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + (a.z-b.z)*(a.z-b.z) + func cross(a,b:IVec3; inline)->IVec3: + return IVec3(a.y*b.z - a.z-b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x) + func scaled_by(v:IVec3, k:Int; inline)->IVec3: + return IVec3(v.x*k, v.y*k, v.z*k) + func divided_by(v:IVec3, divisor:Int; inline)->IVec3: + return IVec3(v.x/divisor, v.y/divisor, v.z/divisor) + func length(v:IVec3; inline)->Num: + return Num.sqrt(v.x*v.x + v.y*v.y + v.z*v.z) + func dist(a,b:IVec3; inline)->Num: + return a:minus(b):length() + +func main(): + >> Vec2(10, 20) + >> Vec2(10, 20) + Vec2(100, 100) + = Vec2(x=110, y=120) + >> Vec3(10, 20, 30) + >> Vec2.ZERO + >> Vec2.ZERO.x = 99 + >> Vec2.ZERO + |
