private void endpoint(EdgeF e, int lr, VertexKDTree s) { e.ep[lr] = s; if (e.ep[RE - lr] == null) { return; } clip_line(e); }
private void endpoint(EdgeF e, int lr, PointFortune s) { e.ep[lr] = s; if (e.ep[RE - lr] == null) { return; } clip_line(e); }
private Halfedge HEcreate(EdgeF e, int pm) { Halfedge answer = new Halfedge(); answer.ELedge = e; answer.ELpm = pm; answer.PQnext = null; answer.vertex = VertexKDTree.Zero; return(answer); }
private EdgeF bisect(VertexKDTree s1, VertexKDTree s2) { float dx, dy, adx, ady; EdgeF newedge; newedge = new EdgeF(); newedge.reg[0] = s1; newedge.reg[1] = s2; newedge.ep[0] = VertexKDTree.Zero; newedge.ep[1] = VertexKDTree.Zero; dx = s2.Vector.X - s1.Vector.X; dy = s2.Vector.Y - s1.Vector.Y; adx = dx > 0 ? dx : -dx; ady = dy > 0 ? dy : -dy; newedge.c = (float)(s1.Vector.X * dx + s1.Vector.Y * dy + (dx * dx + dy * dy) * 0.5); if (adx > ady) { newedge.a = 1.0f; newedge.b = dy / dx; newedge.c /= dx; } else { newedge.a = dx / dy; newedge.b = 1.0f; newedge.c /= dy; } newedge.edgenbr = nedges; nedges++; return(newedge); }
private EdgeF bisect(PointFortune s1, PointFortune s2) { double dx, dy, adx, ady; EdgeF newedge; newedge = new EdgeF(); newedge.reg[0] = s1; newedge.reg[1] = s2; newedge.ep[0] = null; newedge.ep[1] = null; dx = s2.X - s1.X; dy = s2.Y - s1.Y; adx = dx > 0 ? dx : -dx; ady = dy > 0 ? dy : -dy; newedge.c = (double)(s1.X * dx + s1.Y * dy + (dx * dx + dy * dy) * 0.5); if (adx > ady) { newedge.a = 1.0f; newedge.b = dy / dx; newedge.c /= dx; } else { newedge.a = dx / dy; newedge.b = 1.0f; newedge.c /= dy; } newedge.edgenbr = nedges; nedges++; return(newedge); }
private void clip_line(EdgeF e) { double pxmin, pxmax, pymin, pymax; VertexKDTree s1, s2; double x1 = e.reg[0].Vector.X; double y1 = e.reg[0].Vector.Y; double x2 = e.reg[1].Vector.X; double y2 = e.reg[1].Vector.Y; double x = x2 - x1; double y = y2 - y1; // if the distance between the two points this line was created from is // less than the square root of 2, then ignore it if (Math.Sqrt((x * x) + (y * y)) < minDistanceBetweenVectorWithIndexs) { return; } pxmin = borderMinX; pymin = borderMinY; pxmax = borderMaxX; pymax = borderMaxY; if (e.a == 1 && e.b >= 0) { s1 = e.ep[1]; s2 = e.ep[0]; } else { s1 = e.ep[0]; s2 = e.ep[1]; } if (e.a == 1) { y1 = pymin; if (s1 != null && s1.Vector.Y > pymin) { y1 = s1.Vector.Y; } if (y1 > pymax) { y1 = pymax; } x1 = e.c - e.b * y1; y2 = pymax; if (s2 != null && s2.Vector.Y < pymax) { y2 = s2.Vector.Y; } if (y2 < pymin) { y2 = pymin; } x2 = e.c - e.b * y2; if (((x1 > pxmax) & (x2 > pxmax)) | ((x1 < pxmin) & (x2 < pxmin))) { return; } if (x1 > pxmax) { x1 = pxmax; y1 = (e.c - x1) / e.b; } if (x1 < pxmin) { x1 = pxmin; y1 = (e.c - x1) / e.b; } if (x2 > pxmax) { x2 = pxmax; y2 = (e.c - x2) / e.b; } if (x2 < pxmin) { x2 = pxmin; y2 = (e.c - x2) / e.b; } } else { x1 = pxmin; if (s1 != null && s1.Vector.X > pxmin) { x1 = s1.Vector.X; } if (x1 > pxmax) { x1 = pxmax; } y1 = e.c - e.a * x1; x2 = pxmax; if (s2 != null && s2.Vector.X < pxmax) { x2 = s2.Vector.X; } if (x2 < pxmin) { x2 = pxmin; } y2 = e.c - e.a * x2; if (((y1 > pymax) & (y2 > pymax)) | ((y1 < pymin) & (y2 < pymin))) { return; } if (y1 > pymax) { y1 = pymax; x1 = (e.c - y1) / e.a; } if (y1 < pymin) { y1 = pymin; x1 = (e.c - y1) / e.a; } if (y2 > pymax) { y2 = pymax; x2 = (e.c - y2) / e.a; } if (y2 < pymin) { y2 = pymin; x2 = (e.c - y2) / e.a; } } pushGraphEdge(e.reg[0], e.reg[1], x1, y1, x2, y2); }