Ejemplo n.º 1
0
        public TangentialPlanesTriangulation(GeoPoint2D[][] points, ISurface surface, double maxDeflection, Angle maxBending)
        {
            this.points        = points;
            this.surface       = surface;
            this.maxDeflection = maxDeflection;
            this.maxBending    = maxBending;
            allPlanes          = new List <TangentPlane>();

            for (int i = 0; i < points.Length; i++)
            {
                int first = allPlanes.Count;
                for (int j = 0; j < points[i].Length; j++)
                {
                    GeoPoint  location;
                    GeoVector udirection, vdirection;
                    surface.DerivationAt(points[i][j], out location, out udirection, out vdirection);
                    TangentPlane tp = new TangentPlane(this, points[i][j], location, udirection, vdirection);
                    allPlanes.Add(tp);
                    if (j > 0)
                    {
                        tp.IntersectWith(allPlanes[first + j - 1], true);        // schneiden mit der vorherigen
                    }
                }
                allPlanes[allPlanes.Count - 1].IntersectWith(allPlanes[first], true);
            }
        }
Ejemplo n.º 2
0
        public override GeoVector DirectionAt(double pos)
        {
            GeoPoint2D  p   = curve2D.PointAt(pos);
            GeoVector2D dir = curve2D.DirectionAt(pos);

            surface.DerivationAt(p, out GeoPoint location, out GeoVector diru, out GeoVector dirv);
            return(dir.x * diru + dir.y * dirv);
        }
Ejemplo n.º 3
0
        ModOp IMovement.GetPosition(double u)
        {
            GeoVector du, dv;
            GeoPoint  loc;

            surface.DerivationAt(c2d.PointAt(u), out loc, out du, out dv);
            GeoVector2D dir2d = c2d.DirectionAt(u);
            GeoVector   ux    = dir2d.x * du + dir2d.y * dv;
            GeoVector   uz    = du ^ dv;
            GeoVector   uy    = ux ^ uz;
            ModOp       res   = ModOp.Translate(loc - GeoPoint.Origin) * ModOp.Fit(new GeoVector[] { startX.Normalized, startY.Normalized, startZ.Normalized }, new GeoVector[] { ux.Normalized, uy.Normalized, uz.Normalized }) * ModOp.Translate(GeoPoint.Origin - startPos);

            return(res);
            //return new ModOp(toUnit * ux, toUnit * uy, toUnit * uz, toUnit * loc);
        }
Ejemplo n.º 4
0
        public CurveMovement(ICurve2D c2d, ISurface surface)
        {
            this.c2d     = c2d;
            this.surface = surface;
            GeoVector du, dv;

            surface.DerivationAt(c2d.StartPoint, out startPos, out du, out dv);
            GeoVector2D dir2d  = c2d.StartDirection;
            GeoVector2D dir2dr = dir2d.ToRight();

            startX = dir2d.x * du + dir2d.y * dv;
            startZ = du ^ dv;
            startY = startX ^ startZ;
            toUnit = (new ModOp(startX, startY, startZ, startPos)).GetInverse(); // in diesem System startet die Kurve im Ursprung in X-Richtung
        }
Ejemplo n.º 5
0
        public Tangulation(GeoPoint2D[][] points, ISurface surface, double maxDeflection, Angle maxBending)
        {
#if DEBUG
            // DEBUG:
            DebuggerContainer dc = new DebuggerContainer();
            for (int i = 0; i < points.Length; ++i)
            {
                for (int j = 0; j < points[i].Length - 1; ++j)
                {
                    Line2D l2d = new Line2D(points[i][j], points[i][j + 1]);
                    dc.Add(l2d, System.Drawing.Color.Red, j);
                }
            }
#endif
            for (int i = 0; i < points.Length; ++i)
            {
                GeoPoint lastPoint, firstPoint;
                lastPoint = firstPoint = surface.PointAt(points[i][0]);
                for (int j = 0; j < points[i].Length; ++j)
                {
                    GeoPoint   nextPoint;
                    GeoPoint2D nextUVPoint;
                    if (j < points[i].Length - 1)
                    {
                        nextUVPoint = points[i][j + 1];
                        nextPoint   = surface.PointAt(nextUVPoint);
                    }
                    else
                    {
                        nextUVPoint = points[i][0];
                        nextPoint   = firstPoint;
                    }
                    GeoPoint2D uvMiddle = new GeoPoint2D(points[i][j], nextUVPoint);
                    GeoPoint   loc;
                    GeoVector  diru, dirv;
                    surface.DerivationAt(uvMiddle, out loc, out diru, out dirv);
                    PlanePolygon pp = new PlanePolygon(uvMiddle, loc, diru, dirv, lastPoint, nextPoint, this);
                }
            }
        }
Ejemplo n.º 6
0
        public override GeoVector UDirection(GeoPoint2D uv)
        {
            periodicSurface.DerivationAt(toPeriodic(uv), out GeoPoint ploc, out GeoVector pdu, out GeoVector pdv);
            double l = uv.x * uv.x + uv.y * uv.y;
            double sl = Math.Sqrt(l);
            double dsdu, dtdu;

            if (l > 0)
            {
                dsdu = toPeriodicBounds[0, 1] * uv.x / sl - toPeriodicBounds[0, 0] * uv.y / l;
                dtdu = toPeriodicBounds[1, 1] * uv.x / sl - toPeriodicBounds[1, 0] * uv.y / l;
                return(dsdu * pdu + dtdu * pdv);
            }
            else
            {   // toPeriodic at (0,0) did return toPeriodicBounds * (0,0), but we also need toPeriodicBounds * (pi/2,0), because at (0,0) there is the pole
                GeoPoint2D pole1 = toPeriodicBounds * new GeoPoint2D(Math.PI / 2.0, 0.0);
                periodicSurface.DerivationAt(pole1, out GeoPoint ploc1, out GeoVector pdu1, out GeoVector pdv1);
                dsdu = toPeriodicBounds[0, 1] - toPeriodicBounds[0, 0];
                dtdu = toPeriodicBounds[1, 1] - toPeriodicBounds[1, 0];
                return(dsdu * pdu + dtdu * pdv);
            }
        }
Ejemplo n.º 7
0
 public void DerivationAt(GeoPoint2D uv, out GeoPoint location, out GeoVector du, out GeoVector dv)
 {
     original.DerivationAt(unscale * uv, out location, out du, out dv); // du und dv noch skalieren?
 }