Ich habe heute versucht, mittels DesignScript in AutoCAD ein Möbius Band zu zeichnen und habe einiges gelernt:
- Ich hab keine Ahnung mehr von Mathematik ;)
- DesignScript stürzt (bei mir) oft ab
- DesignScript ist äußerst mächtig!
- DesignScript macht Spaß, wenn man sich reingefuchst hat
Hier das Ergebnis bis jetzt. Die letzte Flächenerhebung klappt bei mir nicht, wohl weil sich Start und Ende der Linien gegenüber liegen und ich habe jetzt auch keine Lust mehr, da weiter daran rumzumachen...
Und so sieht das Script aus:
import("ProtoGeometry.dll");
import("Math.dll");
num_pts = 100;
s = 20;
t = 0..360..#num_pts;
R = 100;
x = (R + s * (Math.Cos(t / 2))) * (Math.Cos(t));
y = (R + s * (Math.Cos(t / 2))) * (Math.Sin(t));
z = s * Math.Sin(t / 2);
p1 = Point.ByCoordinates(x, y, z);
int_curve = BSplineCurve.ByControlVertices(p1,1);
int_curve.Color = Color.ByARGB(255, 0, 0, 255);
s2 = -20;
t2 = t;
R2 = R;
x2 = (R2 + s2 * (Math.Cos(t2 / 2))) * (Math.Cos(t2));
y2 = (R2 + s2 * (Math.Cos(t2 / 2))) * (Math.Sin(t2));
z2 = s2 * Math.Sin(t2 / 2);
p2 = Point.ByCoordinates(x2, y2, z2);
//x = print(x,y,z);
int_curve2 = BSplineCurve.ByControlVertices(p2,1);
int_curve2.Color = Color.ByARGB(255, 0, 255, 0);
l[1..num_pts] = Line.ByStartPointEndPoint(p1, p2);
loft = Surface.LoftFromCrossSections({ l[1..(num_pts-1)] });
Optimierte Version (Danke an Luke!):
AntwortenLöschenimport("ProtoGeometry.dll");
import("Math.dll");
num_pts = 100;
s = 20;
t = 0..360..#num_pts;
R = 100;
x = (R + s * (Math.Cos(t / 2))) * (Math.Cos(t));
y = (R + s * (Math.Cos(t / 2))) * (Math.Sin(t));
z = s * Math.Sin(t / 2);
p1 = Point.ByCoordinates(x, y, z);
int_curve = BSplineCurve.ByControlVertices(p1,1);
int_curve.Color = Color.ByARGB(255, 0, 0, 255);
s2 = s * -1;
t2 = t;
R2 = R;
x2 = (R2 + s2 * (Math.Cos(t2 / 2))) * (Math.Cos(t2));
y2 = (R2 + s2 * (Math.Cos(t2 / 2))) * (Math.Sin(t2));
z2 = s2 * Math.Sin(t2 / 2);
p2 = Point.ByCoordinates(x2, y2, z2);
//x = print(x,y,z);
int_curve2 = BSplineCurve.ByControlVertices(p2,1);
int_curve2.Color = Color.ByARGB(255, 0, 255, 0);
l= Line.ByStartPointEndPoint(p1, p2);
loft = Surface.LoftFromCrossSections({ l[0..num_pts - 2], l[1..num_pts - 1] });
Und die Version von Gile um die Splines bereinigt und die Punkte über eine Funktion erweitert!
AntwortenLöschenimport("ProtoGeometry.dll");
import("Math.dll");
num_pts = 100;
s = 20;
t = 0..360..#num_pts;
R = 100;
def pts(s : double)
{
x = (R + s * (Math.Cos(t / 2))) * (Math.Cos(t));
y = (R + s * (Math.Cos(t / 2))) * (Math.Sin(t));
z = s * Math.Sin(t / 2);
return = Point.ByCoordinates(x, y, z);
}
l = Line.ByStartPointEndPoint(pts(s), pts(-s));
loft = Surface.LoftFromCrossSections({ l[0..num_pts - 2], l[1..num_pts - 1] });
Das gute alte Möbius Band.
AntwortenLöschenSchönes Beispiel.
- Peter Mehrtens