This document is archived and information here might be outdated. Recommended version. |
Defines the best affine transformation between two sets of points. Can be used to register paper maps on a digitizer.
[Visual Basic .NET] Public Sub DefineFromControlPoints ( _ ByRef fromPoints As IPoint[], _ ByRef toPoints As IPoint[] _ )
[C#] public void DefineFromControlPoints ( ref IPoint[] fromPoints, ref IPoint[] toPoints );
[C++]
HRESULT DefineFromControlPoints(
SAFEARRAY(IPoint)** fromPoints,
SAFEARRAY(IPoint)** toPoints
);
[C++] Parameters fromPoints [in]
fromPoints is a parameter of type SAFEARRAY(IPoint*)* toPoints [in]
toPoints is a parameter of type SAFEARRAY(IPoint*)*
//This example demonstrates how to use the IAffineTransformation2D3GEN.DefineFromControlPoints method
public void transformPolygon()
{
//From point
IPoint[] fromPoints = new IPoint[4];
fromPoints[0] = CreatePoint(0, 0);
fromPoints[1] = CreatePoint(0, 1);
fromPoints[2] = CreatePoint(1, 1);
fromPoints[3] = CreatePoint(1, 0);
//To point
IPoint[] toPoints = new IPoint[4];
toPoints[0] = CreatePoint(10, 10);
toPoints[1] = CreatePoint(10, 15);
toPoints[2] = CreatePoint(15, 15);
toPoints[3] = CreatePoint(15, 10);
//Create polygon
IGeometry segment1 = CreateLineXY(0, 0, 0, 1) as IGeometry;
IGeometry segment2 = CreateLineXY(0, 1, 1, 1) as IGeometry;
IGeometry segment3 = CreateLineXY(0, 1, 0, 0) as IGeometry;
ISegmentCollection segmentCollection = new Polygon() as ISegmentCollection;
object Missing = Type.Missing;
segmentCollection.AddSegment(segment1 as ISegment, ref Missing, ref Missing);
segmentCollection.AddSegment(segment2 as ISegment, ref Missing, ref Missing);
segmentCollection.AddSegment(segment3 as ISegment, ref Missing, ref Missing);
IPolygon polygon = segmentCollection as IPolygon;
//Define the transformation
IAffineTransformation2D3GEN affineTransformation2D = new AffineTransformation2DClass();
affineTransformation2D.DefineFromControlPoints(ref fromPoints, ref toPoints);
//Transform
ITransform2D transform2D = polygon as ITransform2D;
transform2D.Transform(esriTransformDirection.esriTransformForward, affineTransformation2D as ITransformation);
}
private IPoint CreatePoint(double x, double y)
{
IPoint point = new ESRI.ArcGIS.Geometry.Point();
point.X = x;
point.Y = y;
return point;
}
public ILine CreateLineXY(double x1, double y1, double x2, double y2)
{
ILine line = new Line();
line.FromPoint = CreatePoint(x1, y1);
line.ToPoint = CreatePoint(x2, y2);
return line;
}
public ILine CreateLine(IPoint fromPoint, IPoint toPoint)
{
ILine line = new Line();
line.PutCoords(fromPoint, toPoint);
return line;
}
'This example demonstrates how to use the IAffineTransformation::DefineFromControlPoints method.
Public Sub AffTrans2D_DefFromPts()
'From point
Dim pPtFrom(0 To 3) As ESRI.ArcGIS.Geometry.IPoint
pPtFrom(0) = CreatePoint(0, 0)
pPtFrom(1) = CreatePoint(0, 1)
pPtFrom(2) = CreatePoint(1, 1)
pPtFrom(3) = CreatePoint(1, 0)
'To point
Dim pPtTo(0 To 3) As ESRI.ArcGIS.Geometry.IPoint
pPtTo(0) = CreatePoint(10, 10)
pPtTo(1) = CreatePoint(10, 15)
pPtTo(2) = CreatePoint(15, 15)
pPtTo(3) = CreatePoint(15, 10)
'Create polygon
Dim pSeg1 As ESRI.ArcGIS.Geometry.IGeometry
pSeg1 = CreateLineXY(0, 0, 0, 1)
Dim pSeg2 As ESRI.ArcGIS.Geometry.IGeometry
pSeg2 = CreateLineXY(0, 1, 1, 1)
Dim pSeg3 As ESRI.ArcGIS.Geometry.IGeometry
pSeg3 = CreateLineXY(1, 1, 0, 0)
Dim pPolygon As ESRI.ArcGIS.Geometry.ISegmentCollection
pPolygon = New ESRI.ArcGIS.Geometry.Polygon
pPolygon.AddSegment(pSeg1)
pPolygon.AddSegment(pSeg2)
pPolygon.AddSegment(pSeg3)
Dim pPoly As ESRI.ArcGIS.Geometry.IPolygon
pPoly = pPolygon
'Define the transformation
Dim pAffineTrans2D As ESRI.ArcGIS.Geometry.IAffineTransformation2D3GEN
pAffineTrans2D = New ESRI.ArcGIS.Geometry.AffineTransformation2D
pAffineTrans2D.DefineFromControlPoints(pPtFrom, pPtTo)
Dim pTransform2d As ESRI.ArcGIS.Geometry.ITransform2D
'Transform
pTransform2d = pPolygon
pTransform2d.Transform(ESRI.ArcGIS.Geometry.esriTransformDirection.esriTransformForward, pAffineTrans2D)
End Sub
Public Function CreatePoint(ByVal XVal As Double, ByVal YVal As Double) As ESRI.ArcGIS.Geometry.IPoint
CreatePoint = New ESRI.ArcGIS.Geometry.Point
CreatePoint.X = XVal
CreatePoint.Y = YVal
End Function
Public Function CreateLineXY(ByVal X1 As Double, ByVal Y1 As Double, ByVal X2 As Double, ByVal Y2 As Double) As ESRI.ArcGIS.Geometry.ILine
CreateLineXY = CreateLine(CreatePoint(X1, Y1), CreatePoint(X2, Y2))
End Function
Public Function CreateLine(ByVal pPoint1 As ESRI.ArcGIS.Geometry.IPoint, ByVal pPoint2 As ESRI.ArcGIS.Geometry.IPoint) As ESRI.ArcGIS.Geometry.ILine
CreateLine = New ESRI.ArcGIS.Geometry.Line
CreateLine.PutCoords(pPoint1, pPoint2)
End Function