python删除矩形点阵内的无用点

今天做个东西,删除我们地图数据里的无用的点,以减小地图信息保存文件的大小。

我分析了下,大概得删除举行的四个角。和下面一段。

这个地图不太大,是128*128的,我在上边划了5条线,然后读取地图数据,逐个点判断,删除。

我们的地图信息是 x_y_other,......

如图:

然后我就是先写直线方程,高中数学都忘完了,哎。然后逐个点带入每个方程去判断,如果在范围之外就删除。

看代码:

 

代码
1 # -*- coding: gbk -*-
2  """删除128*128点阵坐标内,不需要的坐标点"""
3  #定义5个直线方程
4 #因为用的是屏幕坐标系,故y轴翻转
5  def y1(x):
6 """y1 = x - 29"""
7 return -(x - 29)
8  def y2(x):
9 """y2 = -x + 93"""
10 return -(-x + 93)
11  def y3(x):
12 """y3 = x - 175"""
13 return -(x - 175)
14  def y4(x):
15 """y4 = -x - 34"""
16 return -(-x - 34)
17 def y5(x):
18 """y5 = -97"""
19 return -(-97)
20
21 def area(coorList,x1,x2,y1,y2,x,y,func,falg):
22 """
23 判断是否属于删除区域,如果是则把对应数组设置为空字符串
24 x1,x2 x轴的范围
25 y1,y2 y轴的范围
26 x,y 当前要判断的的坐标点
27 func 所属范围对应的直线方程
28 flag 要取得区域在线条以上还是以下
29 """
30 if x1 <= x <= x2 and y1 <= y <= y2:
31 if upRoDown(y,func(x),falg):
32 if(coorList[x][y] is not ''):
33 coorList[x][y] = ''
34 else:
35 #这里可以看出公共区域
36 #print "%s,%s: changed" % (x,y)
37 pass
38
39 def upRoDown(a,b,flag):
40 """
41 判断传进来的取的y点的大小,根据flag是上部分还是下部分
42 a 当前y坐标点
43 b 直线方程根据x对应的坐标点
44 flag 要取得区域在线条以上还是以下
45 """
46 if(flag == 'down'):
47 if(a >= b):
48 return True
49 else:
50 return False
51 else:
52 if(a <= b):
53 return True
54 else:
55 return False
56
57 def creatResourceList():
58 """构建来源坐标点信息列表"""
59 fResource = file('resource.txt')
60 resource = fResource.read()
61 fResource.close()
62 resourceList = resource.split(',')
63 return resourceList
64
65 def creatCoorList(resourceList):
66 """给坐标信息赋值,结构为二维数组,数组下表是坐标(x,y)"""
67 coorList = []
68 for x in range(128):
69 coorList.append([])
70 for y in range(128):
71 coorList[x].append('')
72
73 for info in resourceList:
74 temp = info.split('_')
75 if(temp[0] is not ''):
76 coorList[int(temp[0])][int(temp[1])] = info
77
78 return coorList
79
80 def deletePoint(coorList):
81 """根据5条直线方程删除多余的点"""
82 for x in range(128):
83 for y in range(128):
84 area(coorList,0,29,0,29,x,y,y1,'up')
85 area(coorList,93,127,0,34,x,y,y2,'up')
86 area(coorList,48,127,48,127,x,y,y3,'down')
87 area(coorList,0,93,34,127,x,y,y4,'down')
88 area(coorList,0,127,97,127,x,y,y5,'down')
89
90
91
92 def saveResult(coorList):
93 """保存结果"""
94 result = ''
95 for x in range(128):
96 for y in range(128):
97 if(coorList[x][y] is not ''):
98 result += coorList[x][y] + ','
99
100 fResult = file('result.txt','w+')
101 fResult.write(result)
102 fResult.close();
103
104 if __name__ is not '__main__':
105 resourceList = creatResourceList()
106 coorList = creatCoorList(resourceList)
107 deletePoint(coorList)
108 saveResult(coorList)
109

 

 

 

 

有几个小问题

 

1.python的list初始化,不能直接指定长度么,既然是动态的,不能像js或者php那样,直接arr[x][y] = ''这样么?比如得遍历才行。

这个问题已经解决:

lis = [[''] * 128] * 128

 

2.这图办法删除点我觉得不怎么方便,不知道有没有更好的。

posted @ 2010-10-21 19:59  北冥  阅读(687)  评论(0编辑  收藏  举报