Esempio n. 1
0
        public static Curve RatchetCover(Circle C, double D, double pRad)
        {
            ArcCurve co = new ArcCurve(new Circle(C.Plane, C.Radius - (D + pRad)));
            ArcCurve ci = new ArcCurve(new Circle(C.Plane, C.Radius - ((D + pRad) * 2)));

            co.Domain = ci.Domain = new Interval(0, 1);
            List <double> ts = new List <double>();

            for (double i = 0; i < 8; i++)
            {
                ts.Add(i / 8);
            }
            Curve[]      shatterCo = co.Split(ts);
            Curve[]      shatterCi = ci.Split(ts);
            List <Curve> shatter   = new List <Curve>();

            for (int i = 0; i < 8; i += 2)
            {
                shatter.Add(shatterCo[i]);
                shatter.Add(shatterCi[i + 1]);
                shatter.Add(new LineCurve(shatterCo[i].PointAtEnd, shatterCi[i + 1].PointAtStart));
                Vector3d v = shatterCi[i + 1].PointAtEnd - C.Center; v.Unitize();
                shatter.Add(new LineCurve(shatterCi[i + 1].PointAtEnd, shatterCi[i + 1].PointAtEnd + (v * (D + pRad))));
            }
            Curve covers = Curve.JoinCurves(shatter)[0];
            Curve cover  = Curve.CreateFilletCornersCurve(covers, (D + pRad) * 0.48, 0.001, 0.001);

            return(cover);
        }
Esempio n. 2
0
        public static Curve RatchetPawl(Circle C, int T, double D, int pawlCount, double pRad, double Spring, out Curve SpringPawl)
        {
            List <Curve>  rachets = new List <Curve>();
            List <Curve>  paws    = new List <Curve>();
            List <double> split   = new List <double>();

            for (int i = 0; i < T; i++)
            {
                double ta = (Math.PI * 2 / T) * i;
                double tb = (Math.PI * 2 / T) * ((i + 1) % T);
                //teeth build
                Point3d  start = new Circle(C.Plane, C.Radius - D).PointAt(ta); //fillet corner point
                Vector3d va    = C.PointAt(ta) - start; va.Unitize();
                Vector3d vb    = C.PointAt(tb) - start; vb.Unitize();
                Curve    lineA = new LineCurve(C.PointAt(ta), start);
                Curve    lineB = new LineCurve(C.PointAt(tb), start);
                Curve    teeth = Curve.CreateFilletCurves(lineA, start + (va * 0.1), lineB, start + (vb * 0.1), 0.2, true, true, true, 0.01, 0.01)[0];
                rachets.Add(teeth);

                //pawl build
                double t_paw = (double)T / (double)pawlCount;
                if (i == 0 || i + 1 > paws.Count * t_paw)
                {
                    ArcCurve innC = new ArcCurve(new Circle(C.Plane, C.Radius - D - pRad));
                    Point3d  pawP = start + (va * (D - 0.2));

                    double   side = Math.Sqrt(Math.Pow(C.Center.DistanceTo(pawP), 2) - Math.Pow(innC.Radius, 2));
                    ArcCurve tanC = new ArcCurve(new Circle(pawP, side));

                    //diection
                    var     ccx = Rhino.Geometry.Intersect.Intersection.CurveCurve(innC, tanC, 0.1, 0.1);
                    Point3d tanP;
                    if (i == 0)
                    {
                        tanP = ccx[1].PointA;
                    }
                    else
                    {
                        tanP = ccx[0].PointA;
                    }

                    List <double> angle  = Trigonometry(C.Center.DistanceTo(pawP), pawP.DistanceTo(tanP), innC.Radius, TrigLaw.SSS, Traingle.Angle);
                    Point3d       depthP = pawP + ((Spring / Math.Sin(angle[1])) * Math.Tan(angle[1]) * -va);

                    Vector3d tan2cen = C.Center - tanP; tan2cen.Unitize();
                    Vector3d springY = Vector3d.CrossProduct(tan2cen, C.Normal); springY.Unitize();

                    //pawl teeth
                    List <Point3d> points = new List <Point3d> {
                        tanP + (tan2cen * Spring), depthP, pawP, tanP
                    };
                    PolylineCurve pawl = new PolylineCurve(points);

                    //spring arc
                    ArcCurve  springArc = new ArcCurve(new Arc(tanP + (tan2cen * Spring), tanP + (tan2cen * Spring * 1.5) - springY * Spring * 0.5, tanP + (tan2cen * Spring * 2)));
                    Transform xform     = Transform.Rotation(-Math.PI / (pawlCount * 3), C.Normal, C.Center);
                    springArc.Transform(xform);
                    ArcCurve extendSpring = new ArcCurve(new Arc(tanP + (tan2cen * Spring), tanP - pawP, springArc.PointAtStart));
                    ArcCurve clipSpring   = new ArcCurve(new Arc(tanP + (tan2cen * Spring) + tan2cen * Spring, tanP - pawP, springArc.PointAtEnd));
                    clipSpring.Reverse();

                    //innC intersection
                    Line    innRay  = new Line(clipSpring.PointAtEnd, clipSpring.PointAtEnd - (tanP - pawP) * 2);
                    Point3d rayStop = Point3d.Unset;
                    double  clt;
                    var     clx = Rhino.Geometry.Intersect.Intersection.LineCircle(innRay, new Circle(C.Plane, C.Radius - D - pRad),
                                                                                   out clt, out rayStop, out clt, out rayStop);
                    LineCurve innSpring = new LineCurve(clipSpring.PointAtEnd, rayStop);
                    paws.Add(Curve.JoinCurves(new List <Curve> {
                        pawl, extendSpring, springArc, clipSpring, innSpring
                    })[0]);

                    //split t values
                    double splitA; double splitB;
                    new ArcCurve(new Circle(C.Plane, C.Radius - D - pRad)).ClosestPoint(rayStop, out splitA);
                    new ArcCurve(new Circle(C.Plane, C.Radius - D - pRad)).ClosestPoint(tanP, out splitB);

                    split.Add(splitA); split.Add(splitB);
                }
            }

            ArcCurve innCircle = new ArcCurve(new Circle(C.Plane, C.Radius - D - pRad));

            Curve[] shatter = innCircle.Split(split);
            for (int i = 0; i < shatter.Length; i += 2)
            {
                paws.Add(shatter[i]);
            }

            SpringPawl = Curve.JoinCurves(paws)[0];
            return(Curve.JoinCurves(rachets)[0]);
        }