Finn Eggers
Finn Eggers

Reputation: 945

Get position of any point in a triangle

I've defined a triangle with 3 points.

The coordinate system is defined like this:

This is the most common coordinate system used in OpenGL (i think). Now I got my triangle. The X and Z values of every point are different. I need to find the Y coordinate on my triangle by giving the X and Z coordinate. Someone has written this method and called it barryCentric(Point a, Point b, Point c, Point pos) (I am pretty sure he meant "baryCentric" but fine.

 public static float barryCentric(Vector3f p1, Vector3f p2, Vector3f p3, Vector3f pos) {
        float det = (p2.z - p3.z) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.z - p3.z);
        float l1 = ((p2.z - p3.z) * (pos.x - p3.x) + (p3.x - p2.x) * (pos.y - p3.z)) / det;
        float l2 = ((p3.z - p1.z) * (pos.x - p3.x) + (p1.x - p3.x) * (pos.y - p3.z)) / det;
        float l3 = 1.0f - l1 - l2;
        return l1 * p1.y + l2 * p2.y + l3 * p3.y;
    }

I am not sure if that method makes any sense. He also uses the pos.y value so I guess this is not what I want.

Upvotes: 1

Views: 763

Answers (1)

MBo
MBo

Reputation: 80287

This method makes sense, it is implementation of barycentric interpolation - procedure finds barycentric coordinates of (x,z) point in triangle - l1,l2,l3 here, u,w,v in the linked page.

But implementation contains errors - you are right that one should not use unknown pos.y. Moreover, it is nonsense - subtraction z from y. So change pos.y to pos.z:

    float l1 = ((p2.z - p3.z) * (pos.x - p3.x) + (p3.x - p2.x) * (pos.z - p3.z)) / det;
    float l2 = ((p3.z - p1.z) * (pos.x - p3.x) + (p1.x - p3.x) * (pos.z - p3.z)) / det;

Upvotes: 2

Related Questions