shithub: 3dee

ref: a435467f81a1d9d429109f3a34988c642bed6035
dir: /libgeometry/point.c/

View raw version
#include <u.h>
#include <libc.h>
#include "../geometry.h"

/* 2D */

Point2
Pt2(double x, double y, double w)
{
	return (Point2){x, y, w};
}

Point2
Vec2(double x, double y)
{
	return (Point2){x, y, 0};
}

Point2
addpt2(Point2 a, Point2 b)
{
	return (Point2){a.x+b.x, a.y+b.y, a.w+b.w};
}

Point2
subpt2(Point2 a, Point2 b)
{
	return (Point2){a.x-b.x, a.y-b.y, a.w-b.w};
}

Point2
mulpt2(Point2 p, double s)
{
	return (Point2){p.x*s, p.y*s, p.w*s};
}

Point2
divpt2(Point2 p, double s)
{
	return (Point2){p.x/s, p.y/s, p.w/s};
}

Point2
lerp2(Point2 a, Point2 b, double t)
{
	if(t < 0) t = 0;
	if(t > 1) t = 1;
	return (Point2){
		(1 - t)*a.x + t*b.x,
		(1 - t)*a.y + t*b.y,
		(1 - t)*a.w + t*b.w
	};
}

double
dotvec2(Point2 a, Point2 b)
{
	return a.x*b.x + a.y*b.y;
}

double
vec2len(Point2 v)
{
	return sqrt(dotvec2(v, v));
}

Point2
normvec2(Point2 v)
{
	double len;

	len = vec2len(v);
	if(len == 0)
		return (Point2){0, 0, 0};
	return (Point2){v.x/len, v.y/len, 0};
}

/* 3D */

Point3
Pt3(double x, double y, double z, double w)
{
	return (Point3){x, y, z, w};
}

Point3
Vec3(double x, double y, double z)
{
	return (Point3){x, y, z, 0};
}

Point3
addpt3(Point3 a, Point3 b)
{
	return (Point3){a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w};
}

Point3
subpt3(Point3 a, Point3 b)
{
	return (Point3){a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w};
}

Point3
mulpt3(Point3 p, double s)
{
	return (Point3){p.x*s, p.y*s, p.z*s, p.w*s};
}

Point3
divpt3(Point3 p, double s)
{
	return (Point3){p.x/s, p.y/s, p.z/s, p.w/s};
}

Point3
lerp3(Point3 a, Point3 b, double t)
{
	if(t < 0) t = 0;
	if(t > 1) t = 1;
	return (Point3){
		(1 - t)*a.x + t*b.x,
		(1 - t)*a.y + t*b.y,
		(1 - t)*a.z + t*b.z,
		(1 - t)*a.w + t*b.w
	};
}

double
dotvec3(Point3 a, Point3 b)
{
	return a.x*b.x + a.y*b.y + a.z*b.z;
}

Point3
crossvec3(Point3 a, Point3 b)
{
	return (Point3){
		a.y*b.z - a.z*b.y,
		a.z*b.x - a.x*b.z,
		a.x*b.y - a.y*b.x,
		0
	};
}

double
vec3len(Point3 v)
{
	return sqrt(dotvec3(v, v));
}

Point3
normvec3(Point3 v)
{
	double len;

	len = vec3len(v);
	if(len == 0)
		return (Point3){0, 0, 0, 0};
	return (Point3){v.x/len, v.y/len, v.z/len, 0};
}