How to create a ellipsoid solid in GC

In feature sollid i cant find ellipsoid. How could you make a ellipsoid in GC

Parents
  • Good point. There are several enhancements that arise from your question.

    Here is the way to obtain a revolved ellipsoid:
    Place a CoordinateSystem (hereafter "CS") that has the orientation of your desired ellipsoid with the X and Y axes (or any other axis pairing) aligned with the primary and secondary radii of the desired ellipsoid. Best control is offered through CoordinateSystem.ByUniversalTransform.
    Place an EllipticArc.ByCenterRadiiStartSweepAngle using CS as CenterPoint, and CS.XYPlane as support. Use any radii as desired and 180 for SweepAngle.
    Place a Line.ByPoints with Line.StartPoint = EllipticArc.EndPoint and Line.EndPoint = EllipticArc.StartPoint.
    Place a Curve.CompositeCurves with EllipticArc and Line as Curves.
    Place a Solid.SolidOfRevolution (solid01) with Curve as ClosedCurveToRevolve, Line as AxisOfRevolution, and 180 as AngleOfRevolution.
    Place a Solid.MirrorCopyGeometricContents (solid02) with solid01 as NodeToMirrorCopy and CS.XYPlane as Plane.
    Place a Solid.BooleanOperation using solid01 as Solid0 and solid02 as Solid1, Operation Union.

    Once this is constructed, with proper parametric inputs to CS and the radii of the EllipticArc any revolved ellipsoid solid can be generated.

       

    Answer Verified By: Mueller 

  • Hi
    This is correct if your ellisoid are based on one ellipse and one circle. If you have ellipses in both xy and yz plane it would not work. Do you have a solution for this problem
  • Hello Einar,

    Not that your challenge was a stumper --I got side-tracked by "normal" day-to-day tasks.

    Yes, having a rotational ellipsoid with a non-uniform tertiary axis (a tri-axial ellipsoid according to Wikipedia) is possible, if slightly more complicated, requiring two additional nodes (or four, depending on how you want to generate the input for the third radius).  The solution is to use a non-uniform coordinate system to copy-transform the circular ellipsoid by scaling it in the third direction, which would be its Z-axis, if this coordinate system is aligned with the one used for the construction so far.  

    The additional steps would be:

    • Add another CoordinateSystem.ByUniversalTransform based on the first one placed as origin for the ellipsoid.
    • Set all its Translation and Rotation values to zero and leave XScale and YScale at 1.0.  Any translation and rotation will be covered by the first coordinate system.  This second coordinate system's only responsibility is to scale the tertiary radius.  
    • Set its ZScale as a ratio of the SecondaryRadius of the generating EllipticalArc.
    • For comfort you can add an Expression that multiplies the SecondaryRadius with the ratio to get the numeric value (or, alternatively, you can use a numeric TertiaryRadius and compute the ratio with the SecondaryRadius to determine the ZScale needed).
    • Place a Solid.CopyTransformGeometricContents, copying the circular rotational ellipsoid (NodeToCopy),
    • CopyFrom the original ellipsoid's origin,
    • CopyTo the second coordinate system.

    Voilà.

    Because the rendition of this ellipsoid is rather sparse in wireframe, I added a visualization ellipse as Ellipse.ByCenterRadius, using any one of the two coordinate systems as its CenterPoint, as an additional node.  Its PrimaryRadius uses the generating EllipticalArc's SecondaryRadius, SecondaryRadius uses the (computed) tertiary radius.

    I attach the script for reference: https://communities.bentley.com/cfs-file/__key/communityserver-discussions-components-files/360/PowerGC-436.16-Double-Ellipsoid-Solid-2.gct

    Regards,

          Volker

       

  • Thank you very much. Nice

    I ended up doing a point by function and a bsplineserface

    {
    Technique = 'ByFunction';
    Function = function(CoordinateSystem cs, int a, int b,int c)
    {
    Point pt01 = {};

    for(int h=0;h<5; h++)
    {
    pt01[h] = {};
    double i=Asin(h/4);
    for(int j=0;j<37; j++)
    {

    double xPos=a*Cos(i)*Cos(-180+10*j);
    double yPos=b*Cos(i)*Sin(-180+10*j);
    double zPos=h/4*c;
    pt01[h][j]=new Point();
    pt01[h][j].ByCartesianCoordinates(cs, xPos, yPos, zPos);

    }
    }
    return pt01;
    };
    FunctionArguments = {baseCS, 15,10,25};
    GraphLocation = {1336.331, 903.228, 174.0, 0.0};
    }
    }
  • Hello Einar,

    This is a very interesting solution. How do you handle the singularity at the center? I suspect that it is difficult to achieve at least tangential continuity there and even more challenging to achieve curvature continuity.
    Now I wonder whether constructing this as a series of patches using the DoubleTangentController node type could work. Well, that's perhaps an exercise for another day or night...

    Regards,

    Volker

       

Reply
  • Hello Einar,

    This is a very interesting solution. How do you handle the singularity at the center? I suspect that it is difficult to achieve at least tangential continuity there and even more challenging to achieve curvature continuity.
    Now I wonder whether constructing this as a series of patches using the DoubleTangentController node type could work. Well, that's perhaps an exercise for another day or night...

    Regards,

    Volker

       

Children
No Data