## Signed Distance of a Segment

I've been spending weeks trying to pull this off. I have no problems getting the regular distance of a point and an infinite line, regular distance of a point and a segment, and a signed distance of an infinite line. But I tried every conceivable method I got and could not find any approach on getting the signed distance of a segment. The only thing I could do is cheat it just to get the sign of the result of the signed distance of a point and a line, and slap the sign onto the regular distance of the point and the segment. It works, but its not a true mathematical approach. Is there a special trick with vector math to pull this off without cheating it? I tried Googling this for weeks and couldn't find a single way. Here is what I got:

Code:
```   public float DistanceFromLinef(vertex2d a, vertex2d b){
vector2d ab = new vector2d(a, b);
vector2d pa = SetInitialValues2(a.x - x, a.y - y);
vector2d c = ab.Multiply2(ab.DotProductf(pa) / ab.DotProductf(ab));
vector2d d = SetInitialValues2(pa.x - c.x, pa.y - c.y);
return (float)Math.sqrt(d.DotProductf(d));
}

public float DistanceFromSegmentf(vertex2d a, vertex2d b){
vector2d ab = new vector2d(a, b);
vector2d ap = SetInitialValues2(x - a.x, y - a.y);
float t = ab.DotProductf(ap) / ab.DotProductf(ab);
if (t <= 0.0f)
t = 0.0f;
if (t >= 1.0f)
t = 1.0f;
vector2d c = new vector2d(a.x + t * ab.x, a.y + t * ab.y);
vector2d cp = SetInitialValues2(x - c.x, y - c.y);
return (float)Math.sqrt(cp.DotProductf(cp));
}

float SignedDistanceFromLinef(vertex2d a, vertex2d b){
vector2d ab = new vector2d(a, b);
vector2d normal = ab.Normalize2();
return normal.DotProductf(this) - normal.DotProductf(a);
}

float SignedDistanceFromSegmentf(vertex2d a, vertex2d b){
vector2d ab = new vector2d(a, b);
vector2d ap = SetInitialValues2(x - a.x, y - a.y);
float t = ap.DotProductf(ab) / ab.DotProductf(ab);
if (t <= 0.0f)
t = 0.0f;
if (t >= 1.0f)
t = 1.0f;
vector2d c = new vector2d(a.x + t * ab.x, a.y + t * ab.y);
vector2d cp = SetInitialValues2(x - c.x, y - c.y);
vector2d normal = ab.Normalize2();
float distance = cp.DotProductf(cp);
float sign = normal.DotProductf(this) - normal.DotProductf(a);

if (sign >= 0.0)
return (float)Math.sqrt(distance);
else
return -(float)Math.sqrt(distance);
}```