public override void get_triangles(ConsumerTriangle2 f, double resolution) { const double epsilon = 1e-8; Vector2 step = get_step(resolution); for (double x = 0; x < _halfsize.x() - epsilon; x += step.x()) { for (double y = 0; y < _halfsize.y() - epsilon; y += step.y()) { Vector2 a = new Vector2(x, y); Vector2 b = new Vector2(x + step.x(), y); Vector2 c = new Vector2(x, y + step.y()); Vector2 d = new Vector2(x + step.x(), y + step.y()); f(new Triangle2(b, a, c)); f(new Triangle2(d, b, c)); f(new Triangle2(b.negate(), a.negate(), c.negate())); f(new Triangle2(d.negate(), b.negate(), c.negate())); a = a.x(-a.x()); b = b.x(-b.x()); c = c.x(-c.x()); d = d.x(-d.x()); f(new Triangle2(a, b, c)); f(new Triangle2(b, d, c)); f(new Triangle2(a.negate(), b.negate(), c.negate())); f(new Triangle2(b.negate(), d.negate(), c.negate())); } } }
public void testShapes() { for (int i = 0; i < st.Length; i++) { shape_test_s s = st[i]; string fname = String.Format("test_shape_{0}.svg", s.name); RendererSvg rsvg = new RendererSvg(800, 600, Rgb.rgb_black); RendererViewport r = rsvg; r.set_window(Vector2.vector2_0, 70.0, true); { ConsumerTriangle2 d = (Triangle2 t) => { r.draw_triangle(t, true, new Rgb(.2, .2, .2, 1.0)); r.draw_triangle(t, false, Rgb.rgb_gray); }; s.s.get_triangles(d, 10.0); } for (int c = 0; c < s.s.get_contour_count(); c++) { List <Vector2> poly = new (); PatternConsumer d = (Vector2 v) => { poly.Add(v); }; s.s.get_contour(c, d, 10.0); r.draw_polygon(poly.ToArray(), Rgb.rgb_yellow, false, true); } for (double a = 0; a < 2.0 * Math.PI - 1e-8; a += 2.0 * Math.PI / 50.0) { Vector2 d = new Vector2(Math.Cos(a), Math.Sin(a)); double ro = s.s.get_outter_radius(d); r.draw_point(d.times(ro), Rgb.rgb_magenta, Renderer.PointStyle.PointStyleCross); double rh = s.s.get_hole_radius(d); r.draw_point(d.times(rh), Rgb.rgb_cyan, Renderer.PointStyle.PointStyleCross); } r.draw_circle(Vector2.vector2_0, s.s.max_radius(), Rgb.rgb_red, false); r.draw_circle(Vector2.vector2_0, s.s.min_radius(), Rgb.rgb_blue, false); r.draw_box(s.s.get_bounding_box(), Rgb.rgb_cyan); { PatternConsumer d = (Vector2 v) => { r.draw_point(v, Rgb.rgb_green, Renderer.PointStyle.PointStyleDot); }; Distribution dist = new Distribution(); ((ShapeBase)s.s).get_base_pattern(d, dist, false); } Console.WriteLine(rsvg.write(new StringBuilder()).ToString()); } }
public void get_triangles(ConsumerTriangle2 f, double resolution) { }
public abstract void get_triangles(ConsumerTriangle2 f, double resolution);
public override void get_triangles(ConsumerTriangle2 f, double resolution) { const double epsilon = 1e-8; double xyr = 1.0 / get_xy_ratio(); double rstep = get_radial_step(resolution); double astep1; double r; if (!hole) { r = rstep; astep1 = Math.PI / 3.0; // central hexagon for (double a1 = 0; a1 < Math.PI - epsilon; a1 += astep1) { Vector2 a = new Vector2(Math.Cos(a1) * rstep, Math.Sin(a1) * rstep * xyr); Vector2 b = new Vector2(Math.Cos(a1 + astep1) * rstep, Math.Sin(a1 + astep1) * rstep * xyr); Vector2 z = Vector2.vector2_0; f(new Triangle2(b, a, z)); f(new Triangle2(b.negate(), a.negate(), z)); } } else { r = get_internal_xradius(); astep1 = (Math.PI / 3.0) / Math.Round(r / rstep); } // hexapolar distributed triangles for (; r < get_external_xradius() - epsilon; r += rstep) { double astep2 = (Math.PI / 3.0) / Math.Round((r + rstep) / rstep); double a1 = 0, a2 = 0; while ((a1 < Math.PI - epsilon) || (a2 < Math.PI - epsilon)) { Vector2 a = new Vector2(Math.Cos(a1) * r, Math.Sin(a1) * r * xyr); Vector2 b = new Vector2(Math.Cos(a2) * (r + rstep), Math.Sin(a2) * (r + rstep) * xyr); Vector2 c; if (a1 + epsilon > a2) { a2 += astep2; c = new Vector2(Math.Cos(a2) * (r + rstep), Math.Sin(a2) * (r + rstep) * xyr); } else { a1 += astep1; c = new Vector2(Math.Cos(a1) * r, Math.Sin(a1) * r * xyr); } f(new Triangle2(a, c, b)); f(new Triangle2(a.negate(), c.negate(), b.negate())); } astep1 = astep2; } }