乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 52|回复: 3

拾取一个点坐标,找到包围这个坐标的最小封闭区域问题

[复制链接]

3

主题

7

帖子

2

银币

初来乍到

Rank: 1

铜币
19
发表于 2011-1-18 15:27:00 | 显示全部楼层 |阅读模式
开始没一点思路,后来在论坛看了一天的帖子。现在是先拾取一个点坐标,然后找到所有封闭区域的顶点坐标然后再计算这个点是否在封闭区域内。
  1. BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  2.                 BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  3.                 Polyline p = new Polyline();
  4.                 Point3d a = new Point3d();
  5.                 PromptPointOptions opt = new PromptPointOptions("选择点");
  6. PromptPointResult rest = ed.GetPoint(opt);
  7. if (rest.Status == PromptStatus.OK)
  8.                 {
  9.                     a = rest.Value;
  10.                 }
  11. TypedValue[] pline ={ new TypedValue((int)DxfCode.Start, "LWPOLYLINE") };
  12.                 SelectionFilter sf = new SelectionFilter(pline);
  13.                 PromptSelectionResult res = ed.SelectAll(sf);
  14.                 SelectionSet st = res.Value;
  15.                 if (st != null)
  16.                 {
  17.                     ObjectId[] ids = st.GetObjectIds();
  18.                     Point3dCollection p3dc=new Point3dCollection();
  19.                     foreach (ObjectId id in ids)
  20.                     {
  21.                         p = trans.GetObject(id, OpenMode.ForRead) as Polyline;
  22.                         //Point3d c = new Point3d((p.c));
  23.                         int j=p.NumberOfVertices-1;
  24.                         bool result = false;
  25.                         for (int i = 0; i < p.NumberOfVertices; i++)
  26.                         {
  27.                             p3dc.Add(p.GetPoint3dAt(i));
  28.                             //nodes.Add(p.GetPoint3dAt(i));
  29.                             ed.WriteMessage(p.GetPoint3dAt(i).ToString());
  30.                            
  31.                             if (((p.GetPoint3dAt(i).Y)<=a.Y)&&(a.Y<p.GetPoint3dAt(j).Y)||((p.GetPoint3dAt(j).Y<a.Y))&&a.Y<(p.GetPoint3dAt(i).Y))
  32.                             {
  33.                                 if ((a.X - p.GetPoint3dAt(i).X) < (p.GetPoint3dAt(j).X - p.GetPoint3dAt(i).X) * (a.Y - p.GetPoint3dAt(i).Y) / (p.GetPoint3dAt(j).Y - p.GetPoint3dAt(i).Y))
  34.                                 {
  35.                                     result = !result;
  36.                                 }
  37.                             }
  38.                             j = i;
  39.                         }
  40.                         if (result)
  41.                         {
  42.                             MessageBox.Show("在封闭区域中");
  43.                         }
  44.                     }

这个是测试时候的代码。
回复

使用道具 举报

3

主题

7

帖子

2

银币

初来乍到

Rank: 1

铜币
19
发表于 2011-1-18 15:32:00 | 显示全部楼层
这种方法需要比较的太多,还有那个算点是否在封闭区域内的算法,也不明白。有什么更好的没有大家多多指点啊。
回复

使用道具 举报

6

主题

30

帖子

8

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
54
发表于 2011-3-13 19:31:00 | 显示全部楼层

(bpoly (getpoint "ss"))  找输入点周围的封闭图形并创建多段线
然后可以求创建的面域的面积 (也是在网上学的,这个命令)
不好意思,搜求坐标点的方法的时候进错版了,我以为是Lisp版
回复

使用道具 举报

0

主题

23

帖子

2

银币

初来乍到

Rank: 1

铜币
23
发表于 2011-10-27 09:02:00 | 显示全部楼层
新手学习!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 17:22 , Processed in 1.650038 second(s), 61 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表