idl中的几何运算.docx

上传人:scccc 文档编号:13629685 上传时间:2022-01-20 格式:DOCX 页数:8 大小:13.39KB
返回 下载 相关 举报
idl中的几何运算.docx_第1页
第1页 / 共8页
idl中的几何运算.docx_第2页
第2页 / 共8页
idl中的几何运算.docx_第3页
第3页 / 共8页
idl中的几何运算.docx_第4页
第4页 / 共8页
idl中的几何运算.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《idl中的几何运算.docx》由会员分享,可在线阅读,更多相关《idl中的几何运算.docx(8页珍藏版)》请在三一文库上搜索。

1、IDL中的几何图形数学运算几何形状,分为点、线、多边形(面)、体几类,利用IDL对这些形状的几何运算,大致分下面几个部分。1、点集运算点与点之间求距离: DISTANCE_MEASUREIDL自带)2、线相关计算点到直线的距离 PNT_LINE (IDL自带)或 CalDistancePtoLine.pro计算两直线的交点 CAL2LINESINTERSECTPOINT.pro线段与坐标轴的夹角(数学坐标系)cal2pointsangle.pro3、多边形相关(面)求多边形面积:poly_area、(IDLanROI)- ComputeGeometry, area = result (IDL

2、自带) 求多边形周长:(IDLanROI)- ComputeGeometry, PERIMETER = result IDL 自带)点坐标是否在多边形范围内:(IDLanROI)-ContainsPoints (IDL自带)三点求通过该系列三个点的圆心坐标和圆半径;CIR_3PNT(IDL自带)多边形与曲面交集: MESH_CLIP(IDL自带)两个多边形合并:MESH_MERGE(IDL自带)多边形是否空间闭合:MESH_ISSOLID( IDL自带)多边形包含的三角形个数:MESH_NUMTRIANGLES IDL自带)复杂多边形正确显示:IDLgrTessellator (IDL自带)求

3、两个平面的夹角 cal2planeangle.pro四面体与平面相交:TETRA_CLIR IDL自带)4、体相关体数据任意方向切面:EXTRACT_SLICEIDL自带)重点推荐MESH_OBJ可以创建三角形、矩形、圆锥、圆柱、任意多边形旋转等。;Mesh_Obj,2, Vertex_List, Polygon_List, $;调用格式;Mesh_Obj, Type, Vertex_List, Polygon_List , $;Arrayl , Array2 , /CLOSED , /DEGREES , $;P1, P2, P3, P4, P5 = value;Type = 6创建旋转后模型

4、的点坐标及连接关系;Vertex_List创建后的点坐标集;Polygon_List旋转模型的点连接关系;Array1创建旋转模型的起始数据集;Array2 Type为6时不支持;/Closed旋转后模型闭合;/DEGREES旋转的输入参数为角度,默认是弧度;P1 旋转后的边数;P2 -旋转的中心点;P3 -旋转的方向0,0,1;P4 -旋转起始角度;P5 -旋转结束角度附源码:附源码: ; 仝叁计算两个点的距离Write By DYQ可用distance_measure函数替代 function CalDistance, pointl, point2 compile_opt idl2 Ret

5、urn,SQRT(point10-point20)A2+(point11-point21)A2+(point12-point 22)a2) end; 仝叁 Write By ZML 计算点到直线的距离 s = SQRT(p*(p-a)*(p-b)*(p-c)p = (a+b+c)/2 Modified By DYQ function CalDistancePtoLine, point0,linePos1,linePos2a = CalDistance(point0,linePos1) b =CalDistance(point0,linePos2);SQRT(point0-linePos20)A

6、2+(point1- linePos21)A2)c =CalDistance(linePos1,linePos2);SQRT(linePos20-linePos10)A2+(line Pos21-linePos11)A2)p = (a+b+c)*0.5s = SQRT(p*(p-a)*(p-b)*(p-c)Return, s*2/c end ; ;求集合的并集 copy From DAVIDs Code a aJFUNCTION SETUNION, a, b;COMPILE_OPT StrictArrIF N_ELEMENTS(a) EQ 0 THEN RETURN, b;A union NU

7、LL = aIF N_ELEMENTS(b) EQ 0 THEN RETURN, a;B union NULL = bRETURN,WHERE(HISTOGRAM(a,bOMin = omin) + omin ; Return combined set END ; ;去除2维数组中重复的元素;2010年3月25日;Write By DYQ;FUNCTION UNIQARRAY, inArray ;num = N_ELEMENTS(inArray0,*)xArray = REFORM(inArray0,*) yArray = REFORM(inArray1,*);xUniq = UNIQ(xAr

8、ray(SORT(xArray) yUniq = UNIQ(yArray(SORT(yArray) ;RETURN, inArray*,SETUNION(xUniq,yUniq)END ;计算两个点的距离,XY水平面;2008-4-28;Write By DYQ;其实可以用DISTANCE_MEASURER,没办法,写好了才发现IDL自带 o( n_n )o;FUNCTION CALDISTANCE, pointl, point2pointl = point1*1.point2 = point2*1.RETURN, SQRT(point10-point20)A2+(point11-point2

9、1)A2) END ;计算点到直线的距离Write By DYQ其实可以用PNT_LINE函数,没办法,写好了才发现IDL自带o(A_n)o FUNCTION CALDISTANCEPTOLINE, point0,linePos1,linePos2a = CALDISTANCE(point0,linePos1) b =CALDISTANCE(point0,linePos2);SQRT(point0-linePos20)A2+(point1- linePos21)A2)c =CALDISTANCE(linePos1,linePos2);SQRT(linePos20-linePos10)A2+(l

10、inePos21-linePos11)A2)p = (a+b+c)*0.5s = SQRT(p*(p-a)*(p-b)*(p-c)RETURN, s*2/cEND;计算两直线的交点2008-9-27Write By DYQ输入P1:直线1的起点坐标-P2:直线1的终点坐标P1S:直线2的起点坐标-P2S:直线2的终y点坐标相交则返回交点,不相交则返回-1Modified By DYQ2008-10-29 - 增加了 p1、p2及P1S P2s重合的判断Example:直线:-1,-1,1,1;直线:1,0,0,1;point = Cal2linesintersectpoint(-1,-1,1,

11、1,1,0,0,1)FUNCTION CAL2LINESINTERSECTPOINT, P1,P2,P1S,P2s;COMPILE_OPT IDL2;如果线1点重合了IF ARRAY_EQUAL(P1, P2) THEN BEGINIF ARRAY_EQUAL(P1S, P2S ) THEN BEGINIF P1 EQ P2 THEN RETURN,P1RETURN, -1ENDIF ELSE BEGINIF CALDISTANCEPTOLINE(P1,P1S,P2S) EQ 0 THEN RETURN, P1 RETURN,-1ENDELSE;线1的点不重合ENDIF ELSE BEGINI

12、F ARRAY_EQUAL(P1S ,P2S) THEN BEGINRETURN, P1SENDIF ELSE BEGIN;如果第一条直线垂直x轴IF (P10-P20) EQ 0 THEN BEGINipX = p10;第二条也垂直IF (P1S0-P2S0) EQ 0 THEN BEGIN;不相交RETURN, -1 ENDIF ELSE BEGIN;k2 = FLOAT(P1S1-P2S1)/(P1S0-P2S0)b2 =FLOAT(P1S0*P2s1-P2s0*P1S1)/(P1S0-P2s0) ;ipY = k2*ipX+b2RETURN,ipX,ipY ENDELSE;第二条直线垂

13、直X轴ENDIF ELSE IF (P1S0-P2S0) EQ 0 THEN BEGINipX = p2s0;k1 = FLOAT(P11-P21)/(P10-P20)b1 = FLOAT(P10*P21-P20*P11)/(P10-P20)ipY = k1*ipX+b1RETURN,ipX,ipY;都不垂直ENDIF ELSE BEGINk1 = FLOAT(P11-P21)/(P10-P20)bl = FLOAT(P10*P21-P20*P11)/(P10-P20) ;k2 = FLOAT(P1S1-P2S1)/(P1S0-P2S0)b2 = FLOAT(P1S0*P2s1-P2s0*P1

14、S1)/(P1S0-P2s0);如果都垂直Y轴IF (K2 EQ 0) AND(K1 EQ 0) THEN RETURN,-1ipX = (b2-b1)/(k1-k2)ipY = (k1*b2-k2*b1)/(k1-k2)RETURN,ipX,ipYENDELSEENDELSEENDELSE;END;;计算平面上直线是否与多边形相交,有交点可返回;2010年3月25日;Write By DYQ ;调用格式 result = CalLineInPolygon(linePoints, polyPoints);LinePoints:两个点的二维坐标2,2,否则返回-1;PolyPoints:多边形点

15、的二维坐标2,n,否则返回-1;FUNCTION CALLINEINPOLYGON, linePoints, polyPoints COMPILE_OPT idl2 ;IF ARRAY_EQUAL(SIZE(inPoints,/dimension), 2,2) THEN RETURN,-1 ;点个数pointNum = (SIZE(polyPoints,/dimension)1;相交标识 sign = -1 ipoints = 0,0 ;循环求解 FOR i=0, pointNum -1 DO BEGIN ;point = CAL2LINESINTERSECTPOINT(linePoints*

16、,0, $ linePoints*,1, polyPoints*,i,polyPoints*,(i+1) MODpointNum)IF N_ELEMENTS(point) GT 1 THEN BEGIN ipoints = iPoints,REFORM(point) sign = 1ENDIFENDFOR;IF sign EQ -1 THEN RETURN, sign $ELSE result = UNIQARRAY(iPoints*,1:N_ELEMENTS(iPoints0,*)-1) ;判断交点是否在多边形内;oROI = OBJ_NEW(IDLanROI, polyPoints)con

17、Arr = 0,0FOR i=0, N_ELEMENTS(result)/2-1 DO BEGIN ;psign= oROI-CONTAINSPOINTS(result*,i);有在多边形内的点IF psign NE 0 THEN BEGIN conArr = conArr, result*,iENDIFENDFOROBJ_DESTROY,oROI;IF N_ELEMENTS(conArr)/2 EQ 1 THEN RETURN, -1 ELSERETURN,conArr*,1:N_ELEMENTS(conArr)/2-1ENDJ J;根据经过两点线段与坐标轴的夹角(弧度) ;Point1 到

18、 point2 线段;Write By DYQ;2007-10-27;FUNCTION Cal2pointsangle ,point1,point2 ;point1 = FLOAT(point1)point2 = FLOAT(point2) ;dx = point20- point10dy = point21- point11IF dx EQ 0 THEN BEGIN ; x 轴IF dy GT 0 THEN result = !PI/2 ELSE $ result = 3*!PI/2ENDIF ELSE BEGINIF dy EQ 0 THEN BEGIN ;x 轴IF dx GT 0 TH

19、EN result = 0 ELSE $ result = !PIENDIF ELSE BEGINresult = ATAN(dy/dx)IF result GT 0 THEN IF dx LT 0 THEN result = result +!PiIF result LT 0 THEN IF dx LT 0 THEN result = result +!Pi ELSE $result = result + 2*!PI ENDELSEENDRETURN,result MOD (2*!PI)END;求两个平面的夹角;平面方程:;a1*x+b1*y+c1*z+d1 = 0;a2*x+b2*y+c2*z+d2 = 0;返回角度(锐角)function cal2PlaneAngle, plane1,plane2a1 = plane10b1 = plane11c1 = plane12d1 = plane13 ;a2 = plane20b2 = plane21c2 = plane22d2 = plane23;n1 = SQRT(a1A2+b1A2+c1A2)n2 = SQRT(a2A2+b2A2+c2A2)angleCos = ABS(a1*a2+b1*b2+c1*c2)/(n1*n2) angle = aCos(angleCos)/!dtorreturn ,angleend

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1