About the 3D multipatch examples Sample
[C#]
Vector3DExamples.cs
using ESRI.ArcGIS.Geometry;
using System;
namespace MultiPatchExamples
{
public static class Vector3DExamples
{
private static object _missing = Type.Missing;
public static IGeometry GetExample1()
{
const double CircleDegrees = 360.0;
const int CircleDivisions = 36;
const double VectorComponentOffset = 0.0000001;
const double CircleRadius = 5.0;
const double CircleZ = 0.0;
//Vector3D: Circle, TriangleFan With 36 Vertices
IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();
IPointCollection triangleFanPointCollection = new TriangleFanClass();
//Set Circle Origin To (0, 0, CircleZ)
IPoint originPoint = GeometryUtilities.ConstructPoint3D(0, 0, CircleZ);
//Add Origin Point To Triangle Fan
triangleFanPointCollection.AddPoint(originPoint, ref _missing, ref _missing);
//Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Circle Vertices
IVector3D upperAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10);
//Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Circle Vertices
IVector3D lowerAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10);
//Add Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset;
//Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Circle Vertices
IVector3D normalVector3D = upperAxisVector3D.CrossProduct(lowerAxisVector3D) as IVector3D;
//Set Normal Vector Magnitude Equal To Radius Of Circle
normalVector3D.Magnitude = CircleRadius;
//Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Circle
double rotationAngleInRadians = GeometryUtilities.GetRadians(CircleDegrees / CircleDivisions);
for (int i = 0; i < CircleDivisions; i++)
{
//Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D);
//Construct Circle Vertex Whose XY Coordinates Are The Sum Of Origin XY Coordinates And Normal Vector XY Components
IPoint vertexPoint = GeometryUtilities.ConstructPoint3D(originPoint.X + normalVector3D.XComponent,
originPoint.Y + normalVector3D.YComponent,
CircleZ);
//Add Vertex To TriangleFan
triangleFanPointCollection.AddPoint(vertexPoint, ref _missing, ref _missing);
}
//Re-Add The Second Point Of The Triangle Fan (First Vertex Added) To Close The Fan
triangleFanPointCollection.AddPoint(triangleFanPointCollection.get_Point(1), ref _missing, ref _missing);
//Add TriangleFan To MultiPatch
multiPatchGeometryCollection.AddGeometry(triangleFanPointCollection as IGeometry, ref _missing, ref _missing);
return multiPatchGeometryCollection as IGeometry;
}
public static IGeometry GetExample2()
{
const double ConeBaseDegrees = 360.0;
const int ConeBaseDivisions = 36;
const double VectorComponentOffset = 0.0000001;
const double ConeBaseRadius = 6;
const double ConeBaseZ = 0.0;
const double ConeApexZ = 9.5;
//Vector3D: Cone, TriangleFan With 36 Vertices
IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();
IPointCollection triangleFanPointCollection = new TriangleFanClass();
//Set Cone Apex To (0, 0, ConeApexZ)
IPoint coneApexPoint = GeometryUtilities.ConstructPoint3D(0, 0, ConeApexZ);
//Add Cone Apex To Triangle Fan
triangleFanPointCollection.AddPoint(coneApexPoint, ref _missing, ref _missing);
//Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
IVector3D upperAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10);
//Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
IVector3D lowerAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10);
//Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset;
//Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cone Base Vertices
IVector3D normalVector3D = upperAxisVector3D.CrossProduct(lowerAxisVector3D) as IVector3D;
//Set Normal Vector Magnitude Equal To Radius Of Cone Base
normalVector3D.Magnitude = ConeBaseRadius;
//Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cone Base
double rotationAngleInRadians = GeometryUtilities.GetRadians(ConeBaseDegrees / ConeBaseDivisions);
for (int i = 0; i < ConeBaseDivisions; i++)
{
//Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D);
//Construct Cone Base Vertex Whose XY Coordinates Are The Sum Of Apex XY Coordinates And Normal Vector XY Components
IPoint vertexPoint = GeometryUtilities.ConstructPoint3D(coneApexPoint.X + normalVector3D.XComponent,
coneApexPoint.Y + normalVector3D.YComponent,
ConeBaseZ);
//Add Vertex To TriangleFan
triangleFanPointCollection.AddPoint(vertexPoint, ref _missing, ref _missing);
}
//Re-Add The Second Point Of The Triangle Fan (First Vertex Added) To Close The Fan
triangleFanPointCollection.AddPoint(triangleFanPointCollection.get_Point(1), ref _missing, ref _missing);
//Add TriangleFan To MultiPatch
multiPatchGeometryCollection.AddGeometry(triangleFanPointCollection as IGeometry, ref _missing, ref _missing);
return multiPatchGeometryCollection as IGeometry;
}
public static IGeometry GetExample3()
{
const double CylinderBaseDegrees = 360.0;
const int CylinderBaseDivisions = 36;
const double VectorComponentOffset = 0.0000001;
const double CylinderBaseRadius = 3;
const double CylinderUpperZ = 8;
const double CylinderLowerZ = 0;
//Vector3D: Cylinder, TriangleStrip With 36 Vertices
IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();
IPointCollection triangleStripPointCollection = new TriangleStripClass();
//Set Cylinder Base Origin To (0, 0, 0)
IPoint originPoint = GeometryUtilities.ConstructPoint3D(0, 0, 0);
//Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
IVector3D upperAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10);
//Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
IVector3D lowerAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10);
//Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset;
//Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cylinder Base Vertices
IVector3D normalVector3D = upperAxisVector3D.CrossProduct(lowerAxisVector3D) as IVector3D;
//Set Normal Vector Magnitude Equal To Radius Of Cylinder Base
normalVector3D.Magnitude = CylinderBaseRadius;
//Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cylinder Base
double rotationAngleInRadians = GeometryUtilities.GetRadians(CylinderBaseDegrees / CylinderBaseDivisions);
for (int i = 0; i < CylinderBaseDivisions; i++)
{
//Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(rotationAngleInRadians, upperAxisVector3D);
//Construct Cylinder Base Vertex Whose XY Coordinates Are The Sum Of Origin XY Coordinates And Normal Vector XY Components
IPoint vertexPoint = GeometryUtilities.ConstructPoint3D(originPoint.X + normalVector3D.XComponent,
originPoint.Y + normalVector3D.YComponent,
0);
//Construct Lower Base Vertex From This Point And Add To TriangleStrip
IPoint lowerVertexPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderLowerZ);
triangleStripPointCollection.AddPoint(lowerVertexPoint, ref _missing, ref _missing);
//Construct Upper Base Vertex From This Point And Add To TriangleStrip
IPoint upperVertexPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderUpperZ);
triangleStripPointCollection.AddPoint(upperVertexPoint, ref _missing, ref _missing);
}
//Re-Add The First And Second Points Of The Triangle Strip (First Two Vertices Added) To Close The Strip
triangleStripPointCollection.AddPoint(triangleStripPointCollection.get_Point(0), ref _missing, ref _missing);
triangleStripPointCollection.AddPoint(triangleStripPointCollection.get_Point(1), ref _missing, ref _missing);
//Add TriangleStrip To MultiPatch
multiPatchGeometryCollection.AddGeometry(triangleStripPointCollection as IGeometry, ref _missing, ref _missing);
return multiPatchGeometryCollection as IGeometry;
}
public static IGeometry GetExample4()
{
const double ConeBaseDegrees = 360.0;
const int ConeBaseDivisions = 8;
const double VectorComponentOffset = 0.0000001;
const double ConeBaseRadius = 6;
const double ConeBaseZ = 0.0;
const double ConeApexZ = 9.5;
//Vector3D: Cone, TriangleFan With 8 Vertices
IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();
IPointCollection triangleFanPointCollection = new TriangleFanClass();
//Set Cone Apex To (0, 0, ConeApexZ)
IPoint coneApexPoint = GeometryUtilities.ConstructPoint3D(0, 0, ConeApexZ);
//Add Cone Apex To Triangle Fan
triangleFanPointCollection.AddPoint(coneApexPoint, ref _missing, ref _missing);
//Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
IVector3D upperAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10);
//Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
IVector3D lowerAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10);
//Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset;
//Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cone Base Vertices
IVector3D normalVector3D = upperAxisVector3D.CrossProduct(lowerAxisVector3D) as IVector3D;
//Set Normal Vector Magnitude Equal To Radius Of Cone Base
normalVector3D.Magnitude = ConeBaseRadius;
//Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cone Base
double rotationAngleInRadians = GeometryUtilities.GetRadians(ConeBaseDegrees / ConeBaseDivisions);
for (int i = 0; i < ConeBaseDivisions; i++)
{
//Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D);
//Construct Cone Base Vertex Whose XY Coordinates Are The Sum Of Apex XY Coordinates And Normal Vector XY Components
IPoint vertexPoint = GeometryUtilities.ConstructPoint3D(coneApexPoint.X + normalVector3D.XComponent,
coneApexPoint.Y + normalVector3D.YComponent,
ConeBaseZ);
//Add Vertex To TriangleFan
triangleFanPointCollection.AddPoint(vertexPoint, ref _missing, ref _missing);
}
//Re-Add The Second Point Of The Triangle Fan (First Vertex Added) To Close The Fan
triangleFanPointCollection.AddPoint(triangleFanPointCollection.get_Point(1), ref _missing, ref _missing);
//Add TriangleFan To MultiPatch
multiPatchGeometryCollection.AddGeometry(triangleFanPointCollection as IGeometry, ref _missing, ref _missing);
return multiPatchGeometryCollection as IGeometry;
}
public static IGeometry GetExample5()
{
const double CylinderBaseDegrees = 360.0;
const int CylinderBaseDivisions = 8;
const double VectorComponentOffset = 0.0000001;
const double CylinderBaseRadius = 3;
const double CylinderUpperZ = 8;
const double CylinderLowerZ = 0;
//Vector3D: Cylinder, TriangleStrip With 8 Vertices
IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();
IPointCollection triangleStripPointCollection = new TriangleStripClass();
//Set Cylinder Base Origin To (0, 0, 0)
IPoint originPoint = GeometryUtilities.ConstructPoint3D(0, 0, 0);
//Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
IVector3D upperAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10);
//Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
IVector3D lowerAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10);
//Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset;
//Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cylinder Base Vertices
IVector3D normalVector3D = upperAxisVector3D.CrossProduct(lowerAxisVector3D) as IVector3D;
//Set Normal Vector Magnitude Equal To Radius Of Cylinder Base
normalVector3D.Magnitude = CylinderBaseRadius;
//Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cylinder Base
double rotationAngleInRadians = GeometryUtilities.GetRadians(CylinderBaseDegrees / CylinderBaseDivisions);
for (int i = 0; i < CylinderBaseDivisions; i++)
{
//Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(rotationAngleInRadians, upperAxisVector3D);
//Construct Cylinder Base Vertex Whose XY Coordinates Are The Sum Of Origin XY Coordinates And Normal Vector XY Components
IPoint vertexPoint = GeometryUtilities.ConstructPoint3D(originPoint.X + normalVector3D.XComponent,
originPoint.Y + normalVector3D.YComponent,
0);
//Construct Lower Base Vertex From This Point And Add To TriangleStrip
IPoint lowerVertexPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderLowerZ);
triangleStripPointCollection.AddPoint(lowerVertexPoint, ref _missing, ref _missing);
//Construct Upper Base Vertex From This Point And Add To TriangleStrip
IPoint upperVertexPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderUpperZ);
triangleStripPointCollection.AddPoint(upperVertexPoint, ref _missing, ref _missing);
}
//Re-Add The First And Second Points Of The Triangle Strip (First Two Vertices Added) To Close The Strip
triangleStripPointCollection.AddPoint(triangleStripPointCollection.get_Point(0), ref _missing, ref _missing);
triangleStripPointCollection.AddPoint(triangleStripPointCollection.get_Point(1), ref _missing, ref _missing);
//Add TriangleStrip To MultiPatch
multiPatchGeometryCollection.AddGeometry(triangleStripPointCollection as IGeometry, ref _missing, ref _missing);
return multiPatchGeometryCollection as IGeometry;
}
}
}
[Visual Basic .NET]
Vector3DExamples.vb
Imports Microsoft.VisualBasic
Imports ESRI.ArcGIS.Geometry
Imports System
Public Class Vector3DExamples
Private Shared _missing As Object = Type.Missing
Private Sub New()
End Sub
Public Shared Function GetExample1() As IGeometry
Const CircleDegrees As Double = 360.0
Const CircleDivisions As Integer = 36
Const VectorComponentOffset As Double = 0.0000001
Const CircleRadius As Double = 5.0
Const CircleZ As Double = 0.0
'Vector3D: Circle, TriangleFan With 36 Vertices
Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()
Dim triangleFanPointCollection As IPointCollection = New TriangleFanClass()
'Set Circle Origin To (0, 0, CircleZ)
Dim originPoint As IPoint = GeometryUtilities.ConstructPoint3D(0, 0, CircleZ)
'Add Origin Point To Triangle Fan
triangleFanPointCollection.AddPoint(originPoint, _missing, _missing)
'Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Circle Vertices
Dim upperAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10)
'Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Circle Vertices
Dim lowerAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10)
'Add Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset
'Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Circle Vertices
Dim normalVector3D As IVector3D = TryCast(upperAxisVector3D.CrossProduct(lowerAxisVector3D), IVector3D)
'Set Normal Vector Magnitude Equal To Radius Of Circle
normalVector3D.Magnitude = CircleRadius
'Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Circle
Dim rotationAngleInRadians As Double = GeometryUtilities.GetRadians(CircleDegrees / CircleDivisions)
For i As Integer = 0 To CircleDivisions - 1
'Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D)
'Construct Circle Vertex Whose XY Coordinates Are The Sum Of Origin XY Coordinates And Normal Vector XY Components
Dim vertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(originPoint.X + normalVector3D.XComponent, originPoint.Y + normalVector3D.YComponent, CircleZ)
'Add Vertex To TriangleFan
triangleFanPointCollection.AddPoint(vertexPoint, _missing, _missing)
Next i
'Re-Add The Second Point Of The Triangle Fan (First Vertex Added) To Close The Fan
triangleFanPointCollection.AddPoint(triangleFanPointCollection.Point(1), _missing, _missing)
'Add TriangleFan To MultiPatch
multiPatchGeometryCollection.AddGeometry(TryCast(triangleFanPointCollection, IGeometry), _missing, _missing)
Return TryCast(multiPatchGeometryCollection, IGeometry)
End Function
Public Shared Function GetExample2() As IGeometry
Const ConeBaseDegrees As Double = 360.0
Const ConeBaseDivisions As Integer = 36
Const VectorComponentOffset As Double = 0.0000001
Const ConeBaseRadius As Double = 6
Const ConeBaseZ As Double = 0.0
Const ConeApexZ As Double = 9.5
'Vector3D: Cone, TriangleFan With 36 Vertices
Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()
Dim triangleFanPointCollection As IPointCollection = New TriangleFanClass()
'Set Cone Apex To (0, 0, ConeApexZ)
Dim coneApexPoint As IPoint = GeometryUtilities.ConstructPoint3D(0, 0, ConeApexZ)
'Add Cone Apex To Triangle Fan
triangleFanPointCollection.AddPoint(coneApexPoint, _missing, _missing)
'Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
Dim upperAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10)
'Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
Dim lowerAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10)
'Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset
'Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cone Base Vertices
Dim normalVector3D As IVector3D = TryCast(upperAxisVector3D.CrossProduct(lowerAxisVector3D), IVector3D)
'Set Normal Vector Magnitude Equal To Radius Of Cone Base
normalVector3D.Magnitude = ConeBaseRadius
'Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cone Base
Dim rotationAngleInRadians As Double = GeometryUtilities.GetRadians(ConeBaseDegrees / ConeBaseDivisions)
For i As Integer = 0 To ConeBaseDivisions - 1
'Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D)
'Construct Cone Base Vertex Whose XY Coordinates Are The Sum Of Apex XY Coordinates And Normal Vector XY Components
Dim vertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(coneApexPoint.X + normalVector3D.XComponent, coneApexPoint.Y + normalVector3D.YComponent, ConeBaseZ)
'Add Vertex To TriangleFan
triangleFanPointCollection.AddPoint(vertexPoint, _missing, _missing)
Next i
'Re-Add The Second Point Of The Triangle Fan (First Vertex Added) To Close The Fan
triangleFanPointCollection.AddPoint(triangleFanPointCollection.Point(1), _missing, _missing)
'Add TriangleFan To MultiPatch
multiPatchGeometryCollection.AddGeometry(TryCast(triangleFanPointCollection, IGeometry), _missing, _missing)
Return TryCast(multiPatchGeometryCollection, IGeometry)
End Function
Public Shared Function GetExample3() As IGeometry
Const CylinderBaseDegrees As Double = 360.0
Const CylinderBaseDivisions As Integer = 36
Const VectorComponentOffset As Double = 0.0000001
Const CylinderBaseRadius As Double = 3
Const CylinderUpperZ As Double = 8
Const CylinderLowerZ As Double = 0
'Vector3D: Cylinder, TriangleStrip With 36 Vertices
Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()
Dim triangleStripPointCollection As IPointCollection = New TriangleStripClass()
'Set Cylinder Base Origin To (0, 0, 0)
Dim originPoint As IPoint = GeometryUtilities.ConstructPoint3D(0, 0, 0)
'Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
Dim upperAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10)
'Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
Dim lowerAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10)
'Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset
'Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cylinder Base Vertices
Dim normalVector3D As IVector3D = TryCast(upperAxisVector3D.CrossProduct(lowerAxisVector3D), IVector3D)
'Set Normal Vector Magnitude Equal To Radius Of Cylinder Base
normalVector3D.Magnitude = CylinderBaseRadius
'Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cylinder Base
Dim rotationAngleInRadians As Double = GeometryUtilities.GetRadians(CylinderBaseDegrees / CylinderBaseDivisions)
For i As Integer = 0 To CylinderBaseDivisions - 1
'Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(rotationAngleInRadians, upperAxisVector3D)
'Construct Cylinder Base Vertex Whose XY Coordinates Are The Sum Of Origin XY Coordinates And Normal Vector XY Components
Dim vertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(originPoint.X + normalVector3D.XComponent, originPoint.Y + normalVector3D.YComponent, 0)
'Construct Lower Base Vertex From This Point And Add To TriangleStrip
Dim lowerVertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderLowerZ)
triangleStripPointCollection.AddPoint(lowerVertexPoint, _missing, _missing)
'Construct Upper Base Vertex From This Point And Add To TriangleStrip
Dim upperVertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderUpperZ)
triangleStripPointCollection.AddPoint(upperVertexPoint, _missing, _missing)
Next i
'Re-Add The First And Second Points Of The Triangle Strip (First Two Vertices Added) To Close The Strip
triangleStripPointCollection.AddPoint(triangleStripPointCollection.Point(0), _missing, _missing)
triangleStripPointCollection.AddPoint(triangleStripPointCollection.Point(1), _missing, _missing)
'Add TriangleStrip To MultiPatch
multiPatchGeometryCollection.AddGeometry(TryCast(triangleStripPointCollection, IGeometry), _missing, _missing)
Return TryCast(multiPatchGeometryCollection, IGeometry)
End Function
Public Shared Function GetExample4() As IGeometry
Const ConeBaseDegrees As Double = 360.0
Const ConeBaseDivisions As Integer = 8
Const VectorComponentOffset As Double = 0.0000001
Const ConeBaseRadius As Double = 6
Const ConeBaseZ As Double = 0.0
Const ConeApexZ As Double = 9.5
'Vector3D: Cone, TriangleFan With 8 Vertices
Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()
Dim triangleFanPointCollection As IPointCollection = New TriangleFanClass()
'Set Cone Apex To (0, 0, ConeApexZ)
Dim coneApexPoint As IPoint = GeometryUtilities.ConstructPoint3D(0, 0, ConeApexZ)
'Add Cone Apex To Triangle Fan
triangleFanPointCollection.AddPoint(coneApexPoint, _missing, _missing)
'Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
Dim upperAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10)
'Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cone Base Vertices
Dim lowerAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10)
'Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset
'Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cone Base Vertices
Dim normalVector3D As IVector3D = TryCast(upperAxisVector3D.CrossProduct(lowerAxisVector3D), IVector3D)
'Set Normal Vector Magnitude Equal To Radius Of Cone Base
normalVector3D.Magnitude = ConeBaseRadius
'Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cone Base
Dim rotationAngleInRadians As Double = GeometryUtilities.GetRadians(ConeBaseDegrees / ConeBaseDivisions)
For i As Integer = 0 To ConeBaseDivisions - 1
'Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D)
'Construct Cone Base Vertex Whose XY Coordinates Are The Sum Of Apex XY Coordinates And Normal Vector XY Components
Dim vertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(coneApexPoint.X + normalVector3D.XComponent, coneApexPoint.Y + normalVector3D.YComponent, ConeBaseZ)
'Add Vertex To TriangleFan
triangleFanPointCollection.AddPoint(vertexPoint, _missing, _missing)
Next i
'Re-Add The Second Point Of The Triangle Fan (First Vertex Added) To Close The Fan
triangleFanPointCollection.AddPoint(triangleFanPointCollection.Point(1), _missing, _missing)
'Add TriangleFan To MultiPatch
multiPatchGeometryCollection.AddGeometry(TryCast(triangleFanPointCollection, IGeometry), _missing, _missing)
Return TryCast(multiPatchGeometryCollection, IGeometry)
End Function
Public Shared Function GetExample5() As IGeometry
Const CylinderBaseDegrees As Double = 360.0
Const CylinderBaseDivisions As Integer = 8
Const VectorComponentOffset As Double = 0.0000001
Const CylinderBaseRadius As Double = 3
Const CylinderUpperZ As Double = 8
Const CylinderLowerZ As Double = 0
'Vector3D: Cylinder, TriangleStrip With 8 Vertices
Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()
Dim triangleStripPointCollection As IPointCollection = New TriangleStripClass()
'Set Cylinder Base Origin To (0, 0, 0)
Dim originPoint As IPoint = GeometryUtilities.ConstructPoint3D(0, 0, 0)
'Define Upper Portion Of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
Dim upperAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10)
'Define Lower Portion of Axis Around Which Vector Should Be Rotated To Generate Cylinder Base Vertices
Dim lowerAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10)
'Add A Slight Offset To X or Y Component Of One Of Axis Vectors So Cross Product Does Not Return A Zero-Length Vector
lowerAxisVector3D.XComponent += VectorComponentOffset
'Obtain Cross Product Of Upper And Lower Axis Vectors To Obtain Normal Vector To Axis Of Rotation To Generate Cylinder Base Vertices
Dim normalVector3D As IVector3D = TryCast(upperAxisVector3D.CrossProduct(lowerAxisVector3D), IVector3D)
'Set Normal Vector Magnitude Equal To Radius Of Cylinder Base
normalVector3D.Magnitude = CylinderBaseRadius
'Obtain Angle Of Rotation In Radians As Function Of Number Of Divisions Within 360 Degree Sweep Of Cylinder Base
Dim rotationAngleInRadians As Double = GeometryUtilities.GetRadians(CylinderBaseDegrees / CylinderBaseDivisions)
For i As Integer = 0 To CylinderBaseDivisions - 1
'Rotate Normal Vector Specified Rotation Angle In Radians Around Either Upper Or Lower Axis
normalVector3D.Rotate(rotationAngleInRadians, upperAxisVector3D)
'Construct Cylinder Base Vertex Whose XY Coordinates Are The Sum Of Origin XY Coordinates And Normal Vector XY Components
Dim vertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(originPoint.X + normalVector3D.XComponent, originPoint.Y + normalVector3D.YComponent, 0)
'Construct Lower Base Vertex From This Point And Add To TriangleStrip
Dim lowerVertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderLowerZ)
triangleStripPointCollection.AddPoint(lowerVertexPoint, _missing, _missing)
'Construct Upper Base Vertex From This Point And Add To TriangleStrip
Dim upperVertexPoint As IPoint = GeometryUtilities.ConstructPoint3D(vertexPoint.X, vertexPoint.Y, CylinderUpperZ)
triangleStripPointCollection.AddPoint(upperVertexPoint, _missing, _missing)
Next i
'Re-Add The First And Second Points Of The Triangle Strip (First Two Vertices Added) To Close The Strip
triangleStripPointCollection.AddPoint(triangleStripPointCollection.Point(0), _missing, _missing)
triangleStripPointCollection.AddPoint(triangleStripPointCollection.Point(1), _missing, _missing)
'Add TriangleStrip To MultiPatch
multiPatchGeometryCollection.AddGeometry(TryCast(triangleStripPointCollection, IGeometry), _missing, _missing)
Return TryCast(multiPatchGeometryCollection, IGeometry)
End Function
End Class