Kurven
Zweidimensionale Kurven sind mathematisch Abbildungen von R |--> R X R,
dreidimensionale Kurven Abbildungen von R |--> R X R X R.
Zweidimensionale Kurven
In Drawing 3d sind zweidimensionale Kurven stets Abbildungen von
Intervall [0,1] |--> RXR
So beschreibt die Abbildung
x = R*Cos(2*PI*t);
y = R*Sin(2*PI*t);
einen Kreis mit Radius R.
2*PI*t mappt das Intervall [0,1] auf das Intervall [0,2*PI]
Userdefinierte Kurven
Der Drawing 3D Grundtyp, von dem alle Kurven abstammen ist Curve.
Curve besitzt eine Menge von Methoden und Eigenschaften, die wir später
anschauen werden. Im Augenblick brauchen wir lediglich das Event OnGetValue.
Wir definieren eine globale Klasse CustomCurve vom Type Curve.
Im OnGetValue-Ereignis definieren wir unsere Funktion z.B.:
xy CustomCurve_OnGetValue(object sender, double t)
{
t = (t-0.5) * 2.5; // Map from [0,1].
return new xy(4*(t * t - 1),4* t * (t * t - 1));
}
In der OnPaintMethode zeichnen wir die Kurve mit PenWidth=2:
public override void OnPaint()
{
base.OnPaint();
PolygonMode = PolygonMode.Line;
Axis.Paint(this);
PenWidth = 2;
drawCurve(CustomCurve);
PenWidth = 1;
}
Hier der c# Code:
Und so siehts aus:
Ich habe in diesem Programm das Achsenkreuz hinzugeschwindelt.
CoordinateAxes ist eine Klasse in Drawing3d.Entities. Es wird eine Instanz
Axis erzeugt und in der Paintmethode gezeichnet.
Vordefinierte Kurven
Die im vorigen Abschnitt besprochene CustomCurve hat einige Makel. Da die Ableitung nicht definiert ist, funktionieren einige
Methoden nicht, wie z.B.: CustomCurve.Parallel(Width), das einen parallelen
Polygonzug liefert.
Zwar ist GetA (Anfangspunkt ) und GetB (Endpunkt) definiert durch Value(0) bzw.
Value(1) aber ein Setzen des Anfangs- und des Enpunktes ist ebenfalls nicht
möglich.
Drawing 3d enthält folgende Klassen von Kurven:
- Line: Eine gerade Linie zwischen A und B
- Arc: Kreisbogen
- Ellipse: Ellipse
- Bezier: Eine kubische Bezierkurve
- QSpline: Quadratischer Spline mit A, B, einem Kontrollunkt und einem Gewicht.
- BSpline: Mit Kontrollpunkten und Knoten
- Nurbs2d: BSpline mit Gewichten.
- Circle3D: 3D Kreis bzw. Kreisbogen.
- Line3D: 3D Gerade
- Nurbs3d: Nurbs in 3D
- BSpline3d: BSpline in 3D
- SurfaceCurve: Kurve auf einem Surface, deren Parameter durch eine 2D-curve gegeben sind
Im folgenden c# Beispiel werden die 2D Kurven dargstellt.
und so siehts aus
Wer mehr über die Theorie der Splines wissen möchte findet dies z.B.: bei
Wikipedia.
In unserem Beispiel haben Nurbs und BSpline die selben Kontollpunkte. Der Grad der BSplinekurve ist 2, jener
der Nurbskurve gleich 3. Nurbs haben zu sätzlich Gewichte ( eine Art Magnetismus zu den Kontrollpunkten hin ).
// Initialization of MyBspline & MyNurbs
xyArray ControlPoints = new xyArray(10);
ControlPoints[0] = new xy(0, 0);
ControlPoints[1] = new xy(0.25, 3 / 3f);
ControlPoints[2] = new xy(3 / 3f, 5 / 3f);
ControlPoints[3] = new xy(4 / 3f, 1 / 3f);
ControlPoints[4] = new xy(5 / 3f, 0);
ControlPoints[5] = new xy(7 / 3f, 0);
ControlPoints[6] = new xy(8 / 3f, -1 / 3f);
ControlPoints[7] = new xy(9 / 3f, 3 / 3f);
ControlPoints[8] = new xy(10 / 3f, 5 / 3f);
ControlPoints[9] = new xy(11 / 3f, 1 / 3f);
// Interpolationdegree
MyBSpline.Degree = 2;
MyBSpline.ControlPoints = ControlPoints;
// The same Controlpoints for MyNurbs
MyNurbs.ControlPoints = ControlPoints;
// Interpolationdegree
MyNurbs.Degree = 3;
MyNurbs.Weights = new double[] { 1, 0.3, 1, 0.2, 4, 1, 1.3, 1, 2, 1 };
Wer mehr über die Theorie der Splines wissen möchte, findet dies z.B.: bei
Wikipedia.