123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*
- * 3D Engine
- * vector.c:
- * Based on pikuma.com 3D software renderer in C
- * Copyright (c) 2021 986-Studio. All rights reserved.
- *
- * Created by Manoël Trapier on 02/03/2021.
- */
- #include <vector.h>
- #include <math.h>
- /* ---------------------------------------------- 2D Vectors operations --------------------------------------------- */
- double vec2Getlength(vec2_t v)
- {
- return sqrt(v.x * v.x + v.y * v.y);
- }
- vec2_t vec2AddVectors(vec2_t a, vec2_t b)
- {
- vec2_t ret = { a.x + b.x, a.y + b.y};
- return ret;
- }
- vec2_t vec2SubVectors(vec2_t a, vec2_t b)
- {
- vec2_t ret = { a.x - b.x, a.y - b.y};
- return ret;
- }
- vec2_t vec2ScalarMult(vec2_t a, double s)
- {
- vec2_t ret = { a.x * s, a.y * s };
- return ret;
- }
- vec2_t vec2ScalarDiv(vec2_t a, double s)
- {
- vec2_t ret = { a.x / s, a.y / s};
- return ret;
- }
- double vec2Dot(vec2_t a, vec2_t b)
- {
- return a.x * b.x + a.y * b.y;
- }
- void vec2Normalize(vec2_t *a)
- {
- double length = vec2Getlength(*a);
- *a = vec2ScalarDiv(*a, length);
- }
- /* ---------------------------------------------- 3D Vectors operations --------------------------------------------- */
- double vec3Getlength(vec3_t v)
- {
- return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
- }
- vec3_t vec3AddVectors(vec3_t a, vec3_t b)
- {
- vec3_t ret = { a.x + b.x, a.y + b.y , a.z + b.z };
- return ret;
- }
- vec3_t vec3SubVectors(vec3_t a, vec3_t b)
- {
- vec3_t ret = { a.x - b.x, a.y - b.y , a.z - b.z };
- return ret;
- }
- vec3_t vec3ScalarMult(vec3_t a, double s)
- {
- vec3_t ret = { a.x * s, a.y * s, a.z * s};
- return ret;
- }
- vec3_t vec3ScalarDiv(vec3_t a, double s)
- {
- vec3_t ret = { a.x / s, a.y / s, a.z / s};
- return ret;
- }
- vec3_t vec3Cross(vec3_t a, vec3_t b)
- {
- vec3_t ret =
- {
- .x = a.y * b.z - a.z * b.y,
- .y = a.z * b.x - a.x * b.z,
- .z = a.x * b.y - a.y * b.x,
- };
- return ret;
- }
- double vec3Dot(vec3_t a, vec3_t b)
- {
- return a.x * b.x + a.y * b.y + a.z * b.z;
- }
- void vec3Normalize(vec3_t *a)
- {
- double length = vec3Getlength(*a);
- *a = vec3ScalarDiv(*a, length);
- }
- vec3_t vec3RotateX(vec3_t original, double angle)
- {
- vec3_t ret = {
- .x = original.x,
- .y = original.y * cos(angle) - original.z * sin(angle),
- .z = original.y * sin(angle) + original.z * cos(angle)
- };
- return ret;
- }
- vec3_t vec3RotateY(vec3_t original, double angle)
- {
- vec3_t ret = {
- .x = original.x * cos(angle) - original.z * sin(angle),
- .y = original.y,
- .z = original.x * sin(angle) + original.z * cos(angle)
- };
- return ret;
- }
- vec3_t vec3RotateZ(vec3_t original, double angle)
- {
- vec3_t ret = {
- .x = original.x * cos(angle) - original.y * sin(angle),
- .y = original.x * sin(angle) + original.y * cos(angle),
- .z = original.z,
- };
- return ret;
- }
|