too_many_stars 336 Posted August 11, 2017 Hello Everyone, I am having an issue with a point plane distances, and was wondering if anyone could help me. To start, a plane is defined by a unit normal, and a distance from the origin Plane(Vec2,float) while a point is simply a point in space Vec2. To get the distance between a point and a plane, usually something like this is done: float distance = dot( plane_normal , point ) + plane_distance_from_origin. So far so good. The issue lies with the following example. Say we have: This also assumes that top left is the origin. Plane plane1(Vec2(1,0),0) Plane plane2(Vec2(1,0),50) Plane plane3(Vec2(-1,0),350) Plane plane4(Vec2(-1,0),400) and a Point at (200,0) The following would be the distances point to plane1 = dot( Vec2(1,0) , Vec2(200,0)) + 0 = 200 //Correct distance point to plane2 = dot( Vec2(1,0) , Vec2(200,0)) + 50 = 250 //WRONG!! incorrect distance. S/B 150 point to plane3 = dot( Vec2(-1,0), Vec2(200,0)) + 350 = -200 + 350 = 150 //Correct distance point to plane4 = dot( Vec2(-1,0), Vec2(200,0)) + 400 = -200 + 400 = 200 //Correct distance My issue is with "point to plane2" distance. I am not sure how to deal with this problem. Could someone please suggest a solution, or give me a source. Thank you very much. Mike 0 Share this post Link to post Share on other sites
0r0d 2015 Posted August 11, 2017 Your equation for the distance between the plane and point is incorrect. Should be: dist = dot(n, p) - D where: p = point n = plane normal D = dist from origin to plane 1 Share this post Link to post Share on other sites
Syntac_ 1356 Posted August 11, 2017 I'd normally do distance = dot(normal, point - pointOnPlane) I don't see how you can use distance from origin only, how do you know if the plane lies in the negative or positive x-axis? 0 Share this post Link to post Share on other sites
0r0d 2015 Posted August 11, 2017 4 hours ago, Syntac_ said: I'd normally do distance = dot(normal, point - pointOnPlane) I don't see how you can use distance from origin only, how do you know if the plane lies in the negative or positive x-axis? The normal tells you where the plane is. For example, n = (1,0,0) with some D > 0 means the plane is D units in the +x direction. (-1,0,0) also with D means it's D units in -x direction. If D = 0, then n = (1,0,0) is the same plane as n = (-1,0,0) which intersects the origin. 0 Share this post Link to post Share on other sites
Randy Gaul 2790 Posted August 11, 2017 (edited) 6 hours ago, Syntac_ said: I'd normally do distance = dot(normal, point - pointOnPlane) I don't see how you can use distance from origin only, how do you know if the plane lies in the negative or positive x-axis? this is a pretty common question. One way to understand the two forms of the plane equation is with a little vector algebra. ax + by - c = 0 ax + by = c ax + by = dot({a, b}, {x, y}) ax + by = dot(normal, point_on_plane) Solving for distance to plane is basically the first line with a non-zero on the right-hand side: ax + by - c = distance => dot(normal, point_on_plane) - c = distance But sometimes we have yet to solve for c, or we are given c in the form of another point. Lets just call it point, like in your example: dot(normal, point_on_plane) - dot(normal, point) = distance => dot(normal, point_on_plane - point) = distance c is known as "distance to the origin along the direction of the plane normal". It's apart of the plane equation and can be found with the dot product. It's important to understand all this stuff for games programming. Personally I define planes like so: struct Plane { Vec2 normal; float distance; }; float DistToPlane( Plane plane, Vec2 p ) { return dot( plane.normal, p ) - d; } Edited August 11, 2017 by Randy Gaul 0 Share this post Link to post Share on other sites
Syntac_ 1356 Posted August 11, 2017 2 hours ago, 0r0d said: The normal tells you where the plane is. For example, n = (1,0,0) with some D > 0 means the plane is D units in the +x direction. (-1,0,0) also with D means it's D units in -x direction. If D = 0, then n = (1,0,0) is the same plane as n = (-1,0,0) which intersects the origin. Of course, you are correct, I'm having a memory lapse. 0 Share this post Link to post Share on other sites
too_many_stars 336 Posted August 11, 2017 Thanks for the replies guys. But I must be missing something. Given the correct formula that was quoted: dist = dot( plane_normal , point ) - plane_distance As opposed to the one I used: dist = dot( plane_normal , point ) + plane_distance and the same planes I defined above, we get the following answers. Plane plane1(Vec2(1,0),0) Plane plane2(Vec2(1,0),50) Plane plane3(Vec2(-1,0),350) Plane plane4(Vec2(-1,0),400) and a Point at (200,0) The following would be the distances point to plane1 = dot( Vec2(1,0) , Vec2(200,0)) - 0 = 200 //Correct distance point to plane2 = dot( Vec2(1,0) , Vec2(200,0)) - 50 = 150 //Correct distance point to plane3 = dot( Vec2(-1,0), Vec2(200,0)) - 350 = -200 - 350 = -550//Wrong distance //s/b 150 point to plane4 = dot( Vec2(-1,0), Vec2(200,0)) - 400 = -200 - 400 = -600 //Wrong distance s/b 200 Whether you add or subtract the plane distance from the dot product, you will still get the wrong numbers (as far as I can tell) The only way I can think of getting around this is using negative plane distances in some cases, which is not very intuitive. Thanks, Mike 0 Share this post Link to post Share on other sites
Syntac_ 1356 Posted August 11, 2017 2 hours ago, too_many_stars said: Thanks for the replies guys. But I must be missing something. Given the correct formula that was quoted: dist = dot( plane_normal , point ) - plane_distance As opposed to the one I used: dist = dot( plane_normal , point ) + plane_distance and the same planes I defined above, we get the following answers. Plane plane1(Vec2(1,0),0) Plane plane2(Vec2(1,0),50) Plane plane3(Vec2(-1,0),350) Plane plane4(Vec2(-1,0),400) and a Point at (200,0) The following would be the distances point to plane1 = dot( Vec2(1,0) , Vec2(200,0)) - 0 = 200 //Correct distance point to plane2 = dot( Vec2(1,0) , Vec2(200,0)) - 50 = 150 //Correct distance point to plane3 = dot( Vec2(-1,0), Vec2(200,0)) - 350 = -200 - 350 = -550//Wrong distance //s/b 150 point to plane4 = dot( Vec2(-1,0), Vec2(200,0)) - 400 = -200 - 400 = -600 //Wrong distance s/b 200 Whether you add or subtract the plane distance from the dot product, you will still get the wrong numbers (as far as I can tell) The only way I can think of getting around this is using negative plane distances in some cases, which is not very intuitive. Thanks, Mike No, your expected distances are incorrect. A plane at -350 parallel to the y axis and a point at 200 are 550 units apart, not 150. 0 Share this post Link to post Share on other sites