[NetTopologySuite](1)线面相交
用DotSpatial.Topology进行的测试,即使用NetTopologySuite类库进行测试:
1 Polygon inputGeometry = null; 2 LineString analysisGeoemtry = null; 3 private void button1_Click(object sender, EventArgs e) 4 { 5 var coords = new Coordinate[7]; 6 // Shell Coordinates 7 var coordscheck = new Coordinate[7]; 8 double[] Xs = new double[] { 30, 260, 130, 350, 250, 330, 320, 180, 250, 50, 70, 60, 30, 260 }; 9 double[] Ys = new double[] { 140, 260, 110, 150, 230, 210, 140, 260 }; 10 for (var i = 0; i < Xs.Length / 2; i++) 11 { 12 var x = Xs[i * 2]; 13 var y = Xs[i * 2 + 1]; 14 coords[i] = new Coordinate(x, y); 15 coordscheck[i] = new Coordinate(x, y); 16 } 17 //coordscheck[19] = new Coordinate(coords[0].X, coords[0].Y); 18 //coords[19] = new Coordinate(coords[0].X, coords[0].Y); 19 // Shell Rings 20 var ring = new LinearRing(coords); 21 var gf = new GeometryFactory(); 22 var ringCheck = gf.CreateLinearRing(coordscheck); 23 // Hole Coordinates 24 var coordsholecheck = new Coordinate[4]; 25 var coordshole = new Coordinate[4]; 26 for (var i = 0; i < Ys.Length / 2; i++) 27 { 28 var x = Ys[i * 2]; 29 var y = Ys[i * 2 + 1]; 30 coordshole[i] = new Coordinate(x, y); 31 coordsholecheck[i] = new Coordinate(x, y); 32 } 33 // Hole LinearRing Arrays 34 var hole = new LinearRing(coordshole); 35 var holes = new ILinearRing[1]; 36 var holeCheck = gf.CreateLinearRing(coordsholecheck); 37 var holescheck = new ILinearRing[1]; 38 holes[0] = hole; 39 holescheck[0] = holeCheck; 40 Polygon pg = new Polygon(ring, holes);// 41 var polygonCheck = gf.CreatePolygon(ringCheck, holescheck); 42 var areaCheck = polygonCheck.Area; 43 var area = pg.Area; 44 // 45 inputGeometry = pg; 46 47 double[] Lines = new double[] { 30, 50, 320, 360 }; 48 var coords1 = new Coordinate[2]; 49 var rnd1 = new Random(); 50 var coordscheck1 = new Coordinate[2]; 51 for (var i = 0; i < Lines.Length / 2; i++) 52 { 53 var x = Lines[i * 2]; 54 var y = Lines[i * 2 + 1]; 55 coords1[i] = new Coordinate(x, y); 56 coordscheck1[i] = new Coordinate(x, y); 57 } 58 59 var gf1 = new GeometryFactory(); 60 var lscheck = gf1.CreateLineString(coordscheck1); 61 LineString ls = new LineString(coords1); 62 analysisGeoemtry = ls; 63 intersectionOutput = analysisGeoemtry.Intersection(inputGeometry); 64 this.Invalidate(); 65 } 66 IGeometry intersectionOutput = null; 67 private void Form1_Paint(object sender, PaintEventArgs e) 68 { 69 Graphics gc = this.CreateGraphics(); 70 if (inputGeometry != null) 71 { 72 GraphicsHelper.DrawPolygon(gc, inputGeometry, new SolidBrush(Color.Red), new Pen(new SolidBrush(Color.LightYellow)), false); 73 } 74 if (analysisGeoemtry != null) 75 { 76 GraphicsHelper.DrawLineString(gc, analysisGeoemtry, new Pen(new SolidBrush(Color.Blue))); 77 } 78 if (intersectionOutput != null) 79 { 80 if (intersectionOutput is LineString) 81 { 82 LineString lsr = intersectionOutput as LineString; 83 Pen mp = new Pen(new SolidBrush(Color.Yellow)); 84 mp.Width = 2; 85 GraphicsHelper.DrawLineString(gc, lsr, mp); 86 } 87 if (intersectionOutput is MultiLineString) 88 { 89 MultiLineString mlsr = intersectionOutput as MultiLineString; 90 for (int i = 0; i < mlsr.NumGeometries; i++) 91 { 92 if (mlsr.Geometries[i] is LineString) 93 { 94 LineString lsr = mlsr.Geometries[i] as LineString; 95 Pen mp = new Pen(new SolidBrush(Color.Yellow)); 96 mp.Width = 2; 97 GraphicsHelper.DrawLineString(gc, lsr, mp); 98 } 99 } 100 } 101 } 102 gc.Dispose(); 103 }
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
分类:
图形学 & GIS算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程