cjj1308
路人甲
路人甲
  • 注册日期2006-06-29
  • 发帖数28
  • QQ
  • 铜币201枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1874回复:1

[求助]AE中的镜像

楼主#
更多 发布于:2008-07-02 09:06
需要做个编辑的工具,镜像功能,选择一个对象,再选择一条线,生成该对象对于线的镜像,有人知道怎么做么?
喜欢0 评分0
cjj1308
路人甲
路人甲
  • 注册日期2006-06-29
  • 发帖数28
  • QQ
  • 铜币201枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2008-07-02 11:20
<P>本来想找engine的接口,但没找到,只好用数学自己算了</P>
<P>IFeatureClass pfeaclass = (IFeatureClass)pfea.Class;<BR>            IDataset pDataset = (IDataset)pfeaclass;<BR>            IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pDataset.Workspace;<BR>            IWorkspace pWS = (IWorkspace)pFeatureWorkspace;<BR>            IWorkspaceEdit m_pWSEdit = (IWorkspaceEdit)pWS;<BR>            object missing = Type.Missing;<BR>            m_pWSEdit.StartEditing(true);<BR>            m_pWSEdit.StartEditOperation();</P>
<P>            if (pfea.Shape.GeometryType == esriGeometryType.esriGeometryPoint)<BR>            {<BR>                ESRI.ArcGIS.Geometry.IPoint pPoint = (IPoint)pfea.Shape;<BR>                ESRI.ArcGIS.Geometry.IPolyline pPolyline = (IPolyline)plinefea.Shape;<BR>                ILine pline = new LineClass();<BR>                pline.FromPoint = pPolyline.FromPoint;<BR>                pline.ToPoint = pPolyline.ToPoint;<BR>                double angle = pline.Angle;<BR>                ESRI.ArcGIS.Geometry.IPoint pNewPoint = new ESRI.ArcGIS.Geometry.Point();</P>
<P>                IProximityOperator pProximityOperator = (IProximityOperator)pPolyline;<BR>                ESRI.ArcGIS.Geometry.IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbeddedAtFrom);<BR>                ILine pNearestline = new LineClass();<BR>                pNearestline.FromPoint = pPoint;<BR>                pNearestline.ToPoint = pNearestPoint;<BR>                double diatan = pNearestline.Length * 2;<BR>                if (angle <= 3.1415926 ; angle > 0)<BR>                {<BR>                    pNewPoint.X = pPoint.X + Math.Cos(angle - 3.1415926 / 2) * diatan;<BR>                    pNewPoint.Y = pPoint.Y + Math.Sin(angle - 3.1415926 / 2) * diatan;<BR>                }<BR>                else if (angle <=0 ; angle >= -3.1415926)<BR>                {<BR>                    pNewPoint.X = pPoint.X - Math.Cos(angle - 3.1415926 / 2) * diatan;<BR>                    pNewPoint.Y = pPoint.Y - Math.Sin(angle - 3.1415926 / 2) * diatan;<BR>                }<BR>                IFeature newfea =pfeaclass.CreateFeature();<BR>                newfea.Shape = pNewPoint;<BR>                newfea.Store();<BR>            }<BR>            if (pfea.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)<BR>            {<BR>                ESRI.ArcGIS.Geometry.IPolyline pImagePolyline = (IPolyline)pfea.Shape;<BR>                ESRI.ArcGIS.Geometry.IPolyline pNewPolyline = new PolylineClass() ;<BR>                ESRI.ArcGIS.Geometry.IPolyline pPolyline = (IPolyline)plinefea.Shape;<BR>                IPointCollection pPointCol = (IPointCollection)pImagePolyline;<BR>                IPointCollection pNewPointCol =(IPointCollection) pNewPolyline;<BR>                if (pPointCol.PointCount == 2)<BR>                {<BR>                    pPolyline = (IPolyline)pfea.Shape;<BR>                    pImagePolyline = (IPolyline)plinefea.Shape;<BR>                    pPointCol = (IPointCollection)pImagePolyline;<BR>                }<BR>                for(int i=0 ;i<pPointCol.PointCount ;i++)<BR>                {<BR>                    ESRI.ArcGIS.Geometry.IPoint pPoint = pPointCol.get_Point(i);<BR>                    ILine pline = new LineClass();<BR>                    pline.FromPoint = pPolyline.FromPoint;<BR>                    pline.ToPoint = pPolyline.ToPoint;<BR>                    double angle = pline.Angle;<BR>                    ESRI.ArcGIS.Geometry.IPoint pNewPoint = new ESRI.ArcGIS.Geometry.Point();<BR>                    IProximityOperator pProximityOperator = (IProximityOperator)pPolyline;<BR>                    ESRI.ArcGIS.Geometry.IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbeddedAtFrom);<BR>                    ILine pNearestline = new LineClass();<BR>                    pNearestline.FromPoint = pPoint;<BR>                    pNearestline.ToPoint = pNearestPoint;<BR>                    double diatan = pNearestline.Length * 2;<BR>                    if (angle <= 3.1415926 ; angle > 0)<BR>                    {<BR>                        pNewPoint.X = pPoint.X + Math.Cos(angle - 3.1415926 / 2) * diatan;<BR>                        pNewPoint.Y = pPoint.Y + Math.Sin(angle - 3.1415926 / 2) * diatan;<BR>                    }<BR>                    else if (angle <= 0 ; angle >= -3.1415926)<BR>                    {<BR>                        pNewPoint.X = pPoint.X - Math.Cos(angle - 3.1415926 / 2) * diatan;<BR>                        pNewPoint.Y = pPoint.Y - Math.Sin(angle - 3.1415926 / 2) * diatan;<BR>                    }<BR>                    pNewPointCol.AddPoint(pNewPoint,ref missing, ref missing);<BR>                }<BR>                IFeature newfea = pfeaclass.CreateFeature();<BR>                newfea.Shape = pNewPolyline;<BR>                newfea.Store();<BR>            }<BR>            if (pfea.Shape.GeometryType == esriGeometryType.esriGeometryPolygon )<BR>            {<BR>                ESRI.ArcGIS.Geometry.IPolygon pImagePolygon = (IPolygon)pfea.Shape;<BR>                ESRI.ArcGIS.Geometry.IPolyline pPolyline =  (IPolyline)plinefea.Shape;<BR>                ESRI.ArcGIS.Geometry.IPolygon pNewPolygon = new PolygonClass();<BR>                IPointCollection pPointCol = (IPointCollection)pImagePolygon;<BR>                IPointCollection pNewPointCol = (IPointCollection)pNewPolygon;<BR>                for (int i = 0; i < pPointCol.PointCount; i++)<BR>                {<BR>                    ESRI.ArcGIS.Geometry.IPoint pPoint = pPointCol.get_Point(i);<BR>                    ILine pline = new LineClass();<BR>                    pline.FromPoint = pPolyline.FromPoint;<BR>                    pline.ToPoint = pPolyline.ToPoint;<BR>                    double angle = pline.Angle;<BR>                    ESRI.ArcGIS.Geometry.IPoint pNewPoint = new ESRI.ArcGIS.Geometry.Point();<BR>                    IProximityOperator pProximityOperator = (IProximityOperator)pPolyline;<BR>                    ESRI.ArcGIS.Geometry.IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbeddedAtFrom);<BR>                    ILine pNearestline = new LineClass();<BR>                    pNearestline.FromPoint = pPoint;<BR>                    pNearestline.ToPoint = pNearestPoint;<BR>                    double diatan = pNearestline.Length * 2;<BR>                    if (angle <= 3.1415926 ; angle > 0)<BR>                    {<BR>                        pNewPoint.X = pPoint.X + Math.Cos(angle - 3.1415926 / 2) * diatan;<BR>                        pNewPoint.Y = pPoint.Y + Math.Sin(angle - 3.1415926 / 2) * diatan;<BR>                    }<BR>                    else if (angle <= 0 ; angle >= -3.1415926)<BR>                    {<BR>                        pNewPoint.X = pPoint.X - Math.Cos(angle - 3.1415926 / 2) * diatan;<BR>                        pNewPoint.Y = pPoint.Y - Math.Sin(angle - 3.1415926 / 2) * diatan;<BR>                    }<BR>                    pNewPointCol.AddPoint(pNewPoint, ref missing, ref missing);<BR>                }<BR>                IFeature newfea = pfeaclass.CreateFeature();<BR>                newfea.Shape = pNewPolygon;<BR>                newfea.Store();</P>
<P><BR>            }</P>
<P>            m_pWSEdit.StopEditOperation();<BR>            m_pWSEdit.StopEditing(true);<BR>            MapMain.ActiveView.Refresh();</P>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部