找回密码
 新注册用户
搜索
查看: 15045|回复: 25

如何确定一个点位于多边形区域内

[复制链接]
头像被屏蔽
发表于 2005-11-22 17:26:19 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-11-22 23:33:42 | 显示全部楼层
计算机图形学教材上看到过这样的算法,不过找不到这本教材了...
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2005-11-23 22:42:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-11-24 17:49:21 | 显示全部楼层
我想了个方法出来,不过超麻烦,是用C语言的floodfill填充你要确定的那个点,我讲下这个函数
floodfill(int x,int y,int border)
x,y就不用我多说了是什么意思,它这个函数是这样的,就是说,假如这个点(x,y)在多边形内部,那么就填充多边型,在外部,就填充外面,你填充后,在取多边形的颜色,假如你是填充的颜色,那么就是在多面形内部了,反之,则不是。
不好意思,这个方法,破绽百出,而且很麻烦,不过我最近在学习有关图形计算有关方面的内容,看见你问的问题,总觉的其实对我们来说,有些问题,不需要用专业的方法,把另外的有些东西用活了也可以,取的相同的效果
回复

使用道具 举报

发表于 2005-11-24 19:03:27 | 显示全部楼层
多边形的表现形式是什么?
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2005-11-24 22:53:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-11-25 00:02:01 | 显示全部楼层
可以使用计算几何的odd-parity算法
已知一点Q(x1,y1),以及由点P1、P2。。。Pn组成的多边形
作直线y=y1,和多边形交于A1、A2。。。Ai、Q、Ai+1。。。
若i为奇数则在其内
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2005-11-25 09:17:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-11-25 14:55:19 | 显示全部楼层
实际的算法是很巧妙的,计算量极小,具体的我记不清了,你查一下计算和的书吧
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2005-11-26 16:20:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-11-27 19:35:26 | 显示全部楼层
《计算几何-算法分析与设计》
周培德 著
卢开澄 审
清华出版社

我是2000年买的,不知道现在还有没有卖的
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2005-11-28 08:52:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-11-29 16:41:01 | 显示全部楼层
我要跟楼主拼了~~~呵呵,说起来惭愧啊,那天我看到这个帖子,我想了好半天都没想到什么好办法,后来也一直关注这个帖子,但是我却没有深入的思考.....我这个后悔啊.....

这学期我们恰好在学《C/C++ 图像处理编程》这门课,今天下午考试了.....

前些天老师划重点,划了好多,后来到老师办公室开小灶答疑,再后来“认真”的复习.....

结果老师偏偏考了他上课时并没有做重点的东西,复习课上他划的重点一点都没有考到,真的,一点都没有考到,考完了,我们全系 120 号人物都在说老师这题目出得太偏.....

最后的一道编程压轴题.......怎么也没想到,是如何确定一个给定的点是否在某一特定的区域内?

我绞尽脑汁,最后没办法,乱写了近 30 行代码,后来问同学,好多同学都没动笔.......

前面 JUST 说是很短的程序,设计非常巧妙,我仔细的翻书,果然在一个不起眼的地方发现了一段非常短小的程序,总长才 6 行,这还包括函数定义头,才 6 行......

教材是我们系里的 陆宗骐 教授编的,课也是他上的,书名叫《C与C++图像处理编程》,IBSN-7-302,随书程序下载:http://www.xtbook.com.cn/qhwkdownpage/CC++(050110).zip ,有 8.27MB 。

楼主可以下载了研究研究图像编程,我等会把您要的程序发上来给您看看....
回复

使用道具 举报

发表于 2005-11-29 16:50:14 | 显示全部楼层
int  InArea(struct DOT *dot, int dot_n,int x,int y)
{                           //  判断像素在区域内否?
  int  i,f=0;

  for (i=0;i<dot_n;i+=2) {
    if (y!=dot[i].y) continue;
        if ((dot[i].x<=x)&&(dot[i+1].x>=x)) f=1;
  }
  return(f);
}

里面判断某一点是否在某一区域内,是利用线段表来实现的。

那么什么叫作“线段表”呢?
一个区域可以看作是由一条条水平线段所构成的,每一线段都由它的两个端点表示,将区域中所有的水平线段按扫面顺序排列起来得到的端点表就成为线段表。实现线段表最简单的方法就是定义一个 DOT 结果的点表 dct[],即点表中相邻两个端点表示一根水平线段。

相关程序,请您下载上一帖中给出的地址,然后找到压缩包中“C与C++图像处理编程\DosImage\T85.C”程序。
回复

使用道具 举报

发表于 2005-11-29 17:08:45 | 显示全部楼层
又见小概率事件..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 新注册用户

本版积分规则

论坛官方淘宝店开业啦~

Archiver|手机版|小黑屋|中国分布式计算总站 ( 沪ICP备05042587号 )

GMT+8, 2025-4-22 03:02

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表