返回列表 发帖

[文本处理] 批处理用怎么实现快速判断点与多边形关系呢

多边形顶点数据如下:
A
96.802,87.23
89.094,78.623
92.268,64.808
115.391,61.863
124.913,77.265
115.845,90.174
102.696,92.439
96.802,87.23
待判断的点

如果点在多边形外就保存下来>>c.txt
如果点在多边形内或者多边形边上就剔除它>>d.txt
基本思路是用射线法,计算以待判断点(yt,xt)为起点,
平行向右或者向上发射射线,依次与每条多边形的边发射,判断有没有交点,有偶数个交点包括0,就说明在多边形内,那么这一行数据>>d.txt。奇数个就>>c.txt
当某条边的两个顶点x坐标 x(1),x(2)满足如下条件时
If xt >= x1 And xt < x2 or xt <= x1 And xt > x2 then  ::就是说要依次找到相交的可能性,再去判断下面的
set yt=yi+(y2-y1)(xt-x1)/(x2-x1)
if yt > y0 Then Ncross = Ncross + 1    ::如果有交点,交点数Ncross就+1
每个点遍历每条边,if Ncross%2=0,>>d.txt
else if Ncross%2=1,>>c.txt
因为需要判断的点数据量非常大(有几百万个),用vb还可以做出来,但是速度太慢了,最近感受到了gawk的速度,想用gawk或者sed去解决,但是又涉及到二维数组,头大,哪位大神能帮帮忙

回复 2# CrLf


    批处理应该要比用vb编出来的速度快多了吧,我想先用批处理试试,批处理的数组像vb一样吗,论坛里一搜出来的都是vbs数组,vbs又是什么

TOP

回复 4# CrLf


    额。。。前几天处理固定格式文本数据的时候你让我扔了个gawk到win32里

让我感受到了它处理文本速度上的快感,我还以为这种处理也很速度呢,好好的研究了几天,全网搜索了好多教程,但是一写起来,它的判断啊,数组让我崩溃了。。。

原来他不擅长这种啊。。。

TOP

回复 5# 523066680


    算是吧,经常用autocad的,工作需要自己弄点小程序

TOP

回复 9# 523066680


    哈哈,被你发现了,最后一列是我乱加上去的,本来应该是不同的数据表示z轴的,88吉利

TOP

回复 8# neorobin


    谢谢推荐,我说的思路和维基百科的差不多(全英文的只看懂了大概。。。)

TOP

回复 13# neorobin


    大神给的都太高端了,全E文经常看不懂,他处理的多边形只是矩形吗,那么多语言写出来了,好像就freebasic好理解一点

TOP

回复 15# 523066680


    谢谢热心的版版,我这个也不急的,这个是我的举例,如果数据量只有这么几个数的话,我用autocad也可以解决的,主要是大批量的判断,就非常难搞了

TOP

回复 23# 523066680


    结果不对啊,挑出来的坐标和之前我给的a.txt都对不上了,之前给的x没有小于10的,基本都是50以上
版主绘图没问题,我打印到图上也和你一样的
图中,红色的点是a.txt。蓝色的点是得到的结果。

TOP

本帖最后由 tommytangtang 于 2014-8-18 21:33 编辑

回复 28# 523066680
    我之前的算法还有个问题,当有个点在多边形左边,坐标x刚好和某个多边形顶点一样,当它往右发射时,交了两次,其中刚好有个点过多边形一个顶点,算法里就统计成三个点了,判断点在内,实际上在外…
碰撞法真心没看懂…这个是c还是c#还是c++?

TOP

回复 29# DAIC
    哈,原来和vb有关,刚好有点vb基础,看了下vbs教程,好亲切,感觉是bat和vb的结合体呢

TOP

回复 32# 523066680
    原本是感觉到了gawk在处理文本的速度上的优势才发这个贴的,c完全没有自己编过,汗…算了,多学点吧。

TOP

回复 35# CrLf


    仔细想了想,这两种情况可能要先用算法计算后区分,要单独去判断,感觉越来越复杂了。。。

TOP

C不懂啊,这个算是解决了吗?

TOP

回复 41# 523066680

真的没看懂,要翻译好难,求助版版

TOP

返回列表