#vec2.pyx
from libc.stdlib cimport malloc, free, rand, srand, RAND_MAX
from libc.stdint cimport uintptr_t
from libc.time cimport time
cimport libc.math as math
cdef int size = 2
srand(time(NULL)); rand()
cpdef add(uintptr_t out, uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] + b_data[i]
cpdef ceil(uintptr_t out, uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = math.ceil(a_data[i])
cpdef clone(uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out = <float *>malloc(size * sizeof(float))
cdef int i = 0
for i in xrange(size):
out[i] = a_data[i]
cdef uintptr_t u_ptr = <uintptr_t>out
return u_ptr
cpdef copy(uintptr_t out, uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i]
cpdef create():
cdef float* a = <float *>malloc(size * sizeof(float))
a[:] = [0, 0]
cdef uintptr_t u_ptr = <uintptr_t>a
return u_ptr
#cpdef cross(uintptr_t out, uintptr_t a, uintptr_t b):
# pass
cpdef delete(uintptr_t a):
free(<void *>a)
cpdef dist(uintptr_t a, uintptr_t b):
cdef float out = math.sqrt(sqr_dist(a, b))
return out
cpdef div(uintptr_t out, uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] / b_data[i]
cpdef dot(uintptr_t a, uintptr_t b):
cdef float out = 0.0
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef int i = 0
for i in xrange(size):
out += a_data[i] * b_data[i]
return out
cpdef equals(uintptr_t a, uintptr_t b, float epsilon=0.000001):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef int i = 0
for i in xrange(size):
if math.fabs(a_data[i] - b_data[i]) > epsilon * max(1.0, math.fabs(a_data[i]), math.fabs(b_data[i])):
return False
return True
cpdef exact_equals(uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef int i = 0
for i in xrange(size):
if a_data[i] != b_data[i]:
return False
return True
cpdef floor(uintptr_t out, uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = math.floor(a_data[i])
cpdef from_values(float x, float y):
cdef float* a = <float *>malloc(size * sizeof(float))
a[:] = [x, y]
cdef uintptr_t u_ptr = <uintptr_t>a
return u_ptr
cpdef get_values(uintptr_t a):
cdef float *a_data = <float *>a
cdef list out = [0]*size
cdef int i = 0
for i in xrange(size):
out[i] = a_data[i]
return out
cpdef inverse(uintptr_t out, uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = 1.0 / a_data[i]
cpdef length(uintptr_t a):
cdef float out = math.sqrt(sqr_length(a))
return out
cpdef lerp(uintptr_t out, uintptr_t a, uintptr_t b, float t):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] + t * (b_data[i] - a_data[i])
cpdef max_comps(uintptr_t out, uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = max(a_data[i], b_data[i])
cpdef min_comps(uintptr_t out, uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = min(a_data[i], b_data[i])
cpdef mul(uintptr_t out, uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] * b_data[i]
cpdef negate(uintptr_t out, uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] * -1
cpdef norm(uintptr_t out, uintptr_t a):
cdef float mag = length(a)
scale(out, a, 1.0/mag)
cpdef random(uintptr_t out):
cdef float *out_data = <float *>out
cdef float x = rand() / float(RAND_MAX)
cdef float y = rand() / float(RAND_MAX)
out_data[:] = [x, y]
cpdef round(uintptr_t out, uintptr_t a):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = math.round(a_data[i])
cpdef scale(uintptr_t out, uintptr_t a, float b):
cdef float *a_data = <float *>a
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] * b
cpdef set_values(uintptr_t out, float x, float y):
cdef float *out_data = <float *>out
out_data[:] = [x, y]
cpdef sqr_dist(uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef int i = 0
cdef float out = 0.0
for i in xrange(size):
out += (b_data[i] - a_data[i])*(b_data[i] - a_data[i])
return out
cpdef sqr_length(uintptr_t a):
cdef float *a_data = <float *>a
cdef int i = 0
cdef float out = 0.0
for i in xrange(size):
out += a_data[i] * a_data[i]
return out
cpdef sub(uintptr_t out, uintptr_t a, uintptr_t b):
cdef float *a_data = <float *>a
cdef float *b_data = <float *>b
cdef float *out_data = <float *>out
cdef int i = 0
for i in xrange(size):
out_data[i] = a_data[i] - b_data[i]
#cpdef transform_mat2, transform_mat3, transform_mat4