示例#1
0
        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()));
                }
            }
        }
示例#2
0
        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());
            }
        }
示例#3
0
 public void get_triangles(ConsumerTriangle2 f, double resolution)
 {
 }
示例#4
0
 public abstract void get_triangles(ConsumerTriangle2 f, double resolution);
示例#5
0
        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;
            }
        }