[PYTHON] 3D oder D in Py Thon de ~ Spines r Fase ~

Machen Sie eine Spline-Oberfläche mit Pyhonocc-Kern (Open CASCADE). Dann spucken Sie es in Schritt aus.

Code zur Oberflächenerzeugung

Der Code lautet this.

Die rote und die blaue Oberfläche haben dieselbe Form, aber die Position wird mit gp_Ax3 geändert.

qiita_002-1.png

Nur der wichtige Teil ist ein Auszug.

def spl_face(px, py, pz, axs=gp_Ax3()):
    nx, ny = px.shape
    pnt_2d = TColgp_Array2OfPnt(1, nx, 1, ny)
    for row in range(pnt_2d.LowerRow(), pnt_2d.UpperRow() + 1):
        for col in range(pnt_2d.LowerCol(), pnt_2d.UpperCol() + 1):
            i, j = row - 1, col - 1
            pnt = gp_Pnt(px[i, j], py[i, j], pz[i, j])
            pnt_2d.SetValue(row, col, pnt)
            #print (i, j, px[i, j], py[i, j], pz[i, j])

    api = GeomAPI_PointsToBSplineSurface(pnt_2d, 3, 8, GeomAbs_G2, 0.001)
    api.Interpolate(pnt_2d)
    face = BRepBuilderAPI_MakeFace(api.Surface(), 1e-6).Face()
    face.Location(set_loc(gp_Ax3(), axs))
    return face

Für px, py, pz wird np.array von (n x n) durch np.meshgrid erzeugt, und Gitterdaten einer geeigneten gekrümmten Oberfläche werden als pz eingegeben.

Weisen Sie es anschließend dem zweidimensionalen Array von gp_Pnt von OpenCASCADE mit dem Namen TColgp_Array2OfPnt (für Schleifenteil) zu und geben Sie es an GeomAPI_PointsToBSplineSurface weiter.

GeomAPI_PointsToBSplineSurface ist eine Funktion, die tatsächlich eine Spline-Oberfläche generiert. Weitere Informationen finden Sie unter hier. Bitte.

Die beiden Zahlen (3,8) nach TColgp_Array2OfPnt sind die minimalen und maximalen Ordnungen des ungefähren Polynoms, das den Spline erzeugt. GeomAbs_G2 definiert die Glätte. Es gibt auch GeomAbs_C0, GeomAbs_C1, GeomAbs_C2, GeomAbs_G1 und so weiter. G2 ist differenzierbar zweiter Ordnung. Die endgültige 0,001 ist der maximale Fehler in der Näherung, und die Oberfläche wird so generiert, dass der Fehler zwischen den Eingabepunkten und der Oberfläche kleiner als dieser Wert ist.

Versuchen Sie, einen abnormalen Wert für nur einen Punkt einzugeben

Es ist nicht interessant, saubere Punktgruppendaten einzugeben. Geben Sie daher einen abnormalen Wert in die generierten Daten ein.

Der Code lautet hier.

Es wird nur der Datenerzeugungsteil extrahiert.

px = np.linspace(-1, 1, 100) * 100 + 50
py = np.linspace(-1, 1, 200) * 100 - 50
mesh = np.meshgrid(px, py)
data = mesh[0]**2 / 1000 + mesh[1]**2 / 2000
data[100, 50] = 100.0

Machen Sie aus dem (200 x 100) 2D-Array eine hervorstehende Form mit (100,50) ungefähr in der Mitte als 100,0.

qiita_002-2.png

Die Form ist ungewöhnlich um die Mitte angehoben. Solange Sie Spline verwenden, wird die Form der Umgebung durch Ziehen am hervorstehenden Teil deformiert. Es ist auch die Stärke von OpenCAS CADE, dass selbst eine solche abnormale Form erzeugt werden kann (ob sie korrekt ist oder nicht).

Recommended Posts

3D oder D in Py Thon de ~ Spines r Fase ~
3D oder D mit Py