Exemplo n.º 1
0
/*
================
CM_DistanceFromLineSquared
================
*/
float CM_DistanceFromLineSquared(vec3_t p, vec3_t lp1, vec3_t lp2, vec3_t dir)
{
	vec3_t proj, t;
	int    j;

	CM_ProjectPointOntoVector(p, lp1, dir, proj);
	for (j = 0; j < 3; j++)
		if ((proj[j] > lp1[j] && proj[j] > lp2[j]) ||
		    (proj[j] < lp1[j] && proj[j] < lp2[j]))
		{
			break;
		}
	if (j < 3)
	{
		if (Q_fabs(proj[j] - lp1[j]) < Q_fabs(proj[j] - lp2[j]))
		{
			VectorSubtract(p, lp1, t);
		}
		else
		{
			VectorSubtract(p, lp2, t);
		}
		return VectorLengthSquared(t);
	}
	VectorSubtract(p, proj, t);
	return VectorLengthSquared(t);
}
Exemplo n.º 2
0
float CM_DistanceFromLineSquared(vector3 *p, vector3 *lp1, vector3 *lp2, vector3 *dir) {
	vector3 proj, t;
	int j;

	CM_ProjectPointOntoVector(p, lp1, dir, &proj);
	for (j = 0; j < 3; j++) 
		if ((proj.data[j] > lp1->data[j] && proj.data[j] > lp2->data[j]) ||
			(proj.data[j] < lp1->data[j] && proj.data[j] < lp2->data[j]))
			break;
	if (j < 3) {
		if (fabs(proj.data[j] - lp1->data[j]) < fabsf(proj.data[j] - lp2->data[j]))
			VectorSubtract(p, lp1, &t);
		else
			VectorSubtract(p, lp2, &t);
		return VectorLengthSquared(&t);
	}
	VectorSubtract(p, &proj, &t);
	return VectorLengthSquared(&t);
}