我正在编写一个简单的图形编辑器,用户可以在其中绘制一个三角形(以顺时针或逆时针方向),然后可以选择该三角形并将其拖动。
我的问题归结为查找鼠标光标坐标是否与三角形相交。因为我使用的是GLFW,所以我的窗口空间是在笛卡尔坐标系上定义的,其中x / y的范围为[-1,1]。
当我尝试使用重心坐标(或找到的其他任何方法here)来确定我是否有交点时,这会导致问题
我当前的方法如下:
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
// Get the size of the window
int width, height;
glfwGetWindowSize(window, &width, &height);
// Convert screen position to world coordinates
xworld = ((xpos / double(width)) * 2) - 1;
yworld = (((height - 1 - ypos) / double(height)) * 2) - 1; // NOTE: y axis is flipped in glfw
double area = 0.5 * (-p1y * p2x + p0y * (-p1x + p2x) + p0x * (p1y - p2y) + p1x * p2y);
double s = 1 / (2 * area) * (p0y * p2x - p0x * p2y + (p2y - p0y) * xworld + (p0x - p2x) * yworld),
t = 1 / (2 * area) * (p0x * p1y - p0y * p1x + (p0y - p1y) * xworld + (p1x - p0x) * yworld);
if (s > 0 && t > 0 && 1 - s - t > 0)
return true;
return false;
如果三角形在第一象限中并且逆时针定向,则可以工作,但是,如果在三角形的左侧,也可以识别为相交。
感谢您的帮助。
编辑:问题是我在代码中出现了错字(三角形中的顶点的值错误)最终使用了面积计算法来检测相交。
答案 0 :(得分:0)
如果您不知道三角形的缠绕顺序,则可以检查鼠标光标位置是否在每个边缘的左侧,以及是否在每个边缘的右侧。如果其中之一为真,则鼠标光标确实在三角形内。
幸运的是,在三角形的情况下,其顶点的任何2组合都会产生其边缘。因此,问题在于计算六个叉积。
但是,在用户完成三角形绘制之后,您可以按一定的缠绕顺序保存三角形的顶点,然后只能进行三个叉积。