如何获得最近的网格交叉点
How do I get nearest grid intersection?
我正试图在相对于鼠标的网格上最近的线交点处画一个圆。我用不同的x和y间距从中心向外绘制网格。我试图得到正确的坐标,但它失败了。我该如何得到正确的座标?
这是我的代码:
class Grid : public sf::Drawable, public sf::Transformable
{
public:
Grid(unsigned int Xsep, unsigned int Ysep, unsigned int CanvasW, unsigned int CanvasH);
virtual ~Grid() {};
void setFillColor(const sf::Color &color);
void setSize(unsigned int Xsep, unsigned int Ysep, unsigned int CanvasW, unsigned int CanvasH);
unsigned int xSep = 0;
unsigned int ySep = 0;
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
// apply the entity's transform -- combine it with the one that was passed by the caller
states.transform *= getTransform(); // getTransform() is defined by sf::Transformable
// apply the texture
states.texture = &m_texture;
// you may also override states.shader or states.blendMode if you want
states.blendMode = sf::BlendMode(sf::BlendMode::SrcAlpha, sf::BlendMode::OneMinusDstColor,sf::BlendMode::Add);
// draw the vertex array
target.draw(m_vertices, states);
}
sf::VertexArray m_vertices;
sf::Texture m_texture;
};
Grid::Grid(unsigned int Xsep, unsigned int Ysep, unsigned int CanvasW, unsigned int CanvasH)
{
xSep = Xsep;
ySep = Ysep;
m_vertices.setPrimitiveType(sf::Lines);
m_vertices.clear();
for (int i=((CanvasW/2)-Xsep); i > 0; i-=Xsep)
{
m_vertices.append(sf::Vector2f(i,0));
m_vertices.append(sf::Vector2f(i,CanvasH));
m_vertices.append(sf::Vector2f(CanvasW-i,0));
m_vertices.append(sf::Vector2f(CanvasW-i,CanvasH));
}
for (int i=((CanvasH/2)-Ysep); i > 0; i-=Ysep)
{
m_vertices.append(sf::Vector2f(0,i));
m_vertices.append(sf::Vector2f(CanvasW,i));
m_vertices.append(sf::Vector2f(0,CanvasH-i));
m_vertices.append(sf::Vector2f(CanvasW,CanvasH-i));
}
m_vertices.append(sf::Vector2f(0,CanvasH / 2));
m_vertices.append(sf::Vector2f(CanvasW,CanvasH / 2));
m_vertices.append(sf::Vector2f(CanvasW / 2, 0));
m_vertices.append(sf::Vector2f(CanvasW / 2,CanvasH));
}
int RoundNum(int num, int difference)
{
int rem = num % difference;
return rem >= 5 ? (num - rem + difference) : (num - rem);
}
sf::CircleShape point(5);
point.setOrigin(point.getRadius()/2,point.getRadius()/2);
sf::Vector2f mousepos = mapPixelToCoords(sf::Mouse::getPosition(*this));
point.setPosition(RoundNum(mousepos.x,grid.xSep),RoundNum(mousepos.y,grid.ySep));
draw(point);
我至少看到了两件需要研究的事情。
首先,将轴线设置为从中心向外均匀间隔。但是RoundNum(mousepos.x,grid.xSep)
会将您的位置捕捉到间隔的网格线上从CCD_ 2为零的任何地方均匀地。大概这一点不在长方形它在长方形的一角吗?由于矩形的宽度不是2 * grid.xSep
的倍数,与角对齐的网格将偏移从与角对齐的网格。y坐标也是如此。
编辑以回应评论:解决此类问题的一种方法是从x坐标中减去width/2,然后四舍五入,再加上width/2。或者,查找grid.xSep - ((width/2)%grid.xSep)
;把这个值加到x坐标上,四舍五入,然后减去这个值。第二种方法更复杂,但避免了考虑如果x%n
中的x
为负会发生什么。当然,你也可以对y坐标做一些类似的事情。
其次,只有当difference
为9或10:时,这才有效
return rem >= 5 ? (num - rem + difference) : (num - rem);
如果将5
替换为difference/2
,它将适用于difference
的偶数值。要使其对difference
的所有值(偶数或奇数)正确工作,请替换5
具有CCD_ 13。
同样值得确认的是,这符合您的要求:
point.setOrigin(point.getRadius()/2,point.getRadius()/2);
它看起来是正确的,但很容易检查(只需在已知的网格点(如中心)绘制一个CircleShape
),因此您还可以确保。
相关文章:
- 使用对象文件读取三角形数据网格
- 如何从 Skia 路径几何体中获取网格?
- CGAL:如何创建填充边界曲线的曲面网格?
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 创建具有两个视口的Qt3D C++场景,其中显示适当的不同网格
- 如何从 3D 曲面网格中删除自相交三角形?
- 在均匀网格中处理碰撞
- 更改高度贴图,使其在 4x4 网格上显示 16 个 hieghtmap
- 用于查找网格中最短路径的算法
- 循环通过网格获取温度,但不知道如何告诉程序停止循环
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 如何使用 sdl2 快速绘制像素网格?
- 如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
- 使用 MFC 的表/网格
- 是否可以制作没有内部分割的cgal 3d多多马因网格?
- 获取网格中心的屏幕位置
- ASIMP 模型加载不会加载所有网格
- C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?
- 如何从C++而不是虚幻编辑器中添加静态网格体组件的值?
- 如何获得最近的网格交叉点