我试图实现voronoi图生成。
目前它的工作方式如下: 当站点事件发生时,我们找到x = const和一些parabol之间的交叉点。从这一点开始,我们将通过parabols焦点和当前站点之间的平分线画出。该线最初由2条射线组成。两者都从交叉点开始,一个向左,另一个向右。另外,对于二等分留置,我知道了y = f * x + g的f和g。
在圆形事件(获取连接2条边的顶点)期间,我需要找到2条边的交点。如果中点(2条光线的起点)位于2个边缘交点之间,则以下代码可以正常工作。但在我看来,经常发生中点超出其中一个交叉点,然后交叉点不会发生。
有人能找到代码的问题吗?我按照说明(阅读C ++代码:http://blog.ivank.net/fortunes-algorithm-and-implementation.html),其中sweepline从上到下移动,(0,0)在左上角。我的扫描线从上到下移动,(0,0)在左下方。所以有些数学是关闭的。
完整代码:https://codeshare.io/GLWRQb
public Vector3 RayIntersection(VoronoiEdge a, VoronoiEdge b)
{
float x = (b.g - a.g) / (a.f - b.f);
float y = a.f * x + a.g;
if ((x - a.start.x) * a.dx < 0) return Vector3.zero;
if ((y - a.start.y) * a.dy < 0) return Vector3.zero;
if ((x - b.start.x) * b.dx < 0) return Vector3.zero;
if ((y - b.start.y) * b.dy < 0) return Vector3.zero;
return new Vector3(x,y);
}
编辑:
经过一些试验和错误,我发现问题不是交叉检查。但在某些情况下,会发生错误边缘的比较。