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); } }
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); }
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); }
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 }
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); } } }
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); } }
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? }